rnd-20140114-1-src
[rocksndiamonds.git] / src / libgame / x11.c
index fe022c5bf3f8ddb1f50d9d8c7b776c4f7694894b..66f4a3efc69b597beabb09091e23a01a57b02025 100644 (file)
@@ -40,13 +40,21 @@ void X11InitVideoDisplay(void)
 
 void X11InitVideoBuffer(DrawBuffer **backbuffer, DrawWindow **window)
 {
+  if (*window != NULL)
+    X11CloseWindow(*window);
+
   *window = X11InitWindow();
 
   XMapWindow(display, (*window)->drawable);
+
   FlushDisplay();
 
   /* create additional (off-screen) buffer for double-buffering */
+#if 1
+  ReCreateBitmap(backbuffer, video.width, video.height, video.depth);
+#else
   *backbuffer = CreateBitmap(video.width, video.height, video.depth);
+#endif
 }
 
 static void X11InitDisplay()
@@ -102,7 +110,7 @@ static DrawWindow *X11InitWindow()
   DrawWindow *new_window = CreateBitmapStruct();
   unsigned int border_width = 4;
   XGCValues gc_values;
-  unsigned long gc_valuemask;
+  unsigned int gc_valuemask;
 #if !defined(PLATFORM_MSDOS)
   XTextProperty windowName, iconName;
   Pixmap icon_pixmap, iconmask_pixmap;
@@ -113,13 +121,13 @@ static DrawWindow *X11InitWindow()
   XClassHint class_hints;
   char *window_name = program.window_title;
   char *icon_name = program.window_title;
-  long window_event_mask;
+  int window_event_mask;
   Atom proto_atom = None, delete_atom = None;
 #endif
   int screen_width, screen_height;
   int win_xpos, win_ypos;
-  unsigned long pen_fg = WhitePixel(display, screen);
-  unsigned long pen_bg = BlackPixel(display, screen);
+  unsigned int pen_fg = WhitePixel(display, screen);
+  unsigned int pen_bg = BlackPixel(display, screen);
   const int width = video.width, height = video.height;
   int i;
 
@@ -129,6 +137,9 @@ static DrawWindow *X11InitWindow()
   win_xpos = (screen_width - width) / 2;
   win_ypos = (screen_height - height) / 2;
 
+  new_window->width = width;
+  new_window->height = height;
+
   new_window->drawable = XCreateSimpleWindow(display,
                                             RootWindow(display, screen),
                                             win_xpos, win_ypos,
@@ -227,6 +238,20 @@ static DrawWindow *X11InitWindow()
   return new_window;
 }
 
+void X11CloseWindow(DrawWindow *window)
+{
+  if (window->drawable)
+  {
+    XUnmapWindow(display, window->drawable);
+    XDestroyWindow(display, window->drawable);
+  }
+
+  if (window->gc)
+    XFreeGC(display, window->gc);
+
+  free(window);
+}
+
 void X11ZoomBitmap(Bitmap *src_bitmap, Bitmap *dst_bitmap)
 {
 #if defined(TARGET_ALLEGRO)
@@ -264,7 +289,7 @@ Bitmap *X11LoadImage(char *filename)
   char *error = "Read_PCX_to_Pixmap(): %s '%s'";
   int pcx_err;
   XGCValues clip_gc_values;
-  unsigned long clip_gc_valuemask;
+  unsigned int clip_gc_valuemask;
 
   pcx_err = Read_PCX_to_Pixmap(display, window->drawable, window->gc, filename,
                               &new_bitmap->drawable, &new_bitmap->clip_mask);