rnd-20140515-1-src
[rocksndiamonds.git] / src / libgame / x11.c
index fe022c5bf3f8ddb1f50d9d8c7b776c4f7694894b..bdc21aeea3a3c884cd9e86fa6f373f0613a42a84 100644 (file)
@@ -40,21 +40,27 @@ 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()
 {
-#if !defined(PLATFORM_MSDOS)
   XVisualInfo vinfo_template, *vinfo;
   int num_visuals;
-#endif
   unsigned int depth;
 
   /* connect to X server */
@@ -75,7 +81,6 @@ static void X11InitDisplay()
   depth  = DefaultDepth(display, screen);
   cmap   = DefaultColormap(display, screen);
 
-#if !defined(PLATFORM_MSDOS)
   /* look for good enough visual */
   vinfo_template.screen = screen;
   vinfo_template.class = (depth == 8 ? PseudoColor : TrueColor);
@@ -94,7 +99,6 @@ static void X11InitDisplay()
           (depth > 8 && visual->class != TrueColor &&
            visual->class != DirectColor))
     Error(ERR_EXIT, "X11 display not supported (inappropriate visual)");
-#endif /* !PLATFORM_MSDOS */
 }
 
 static DrawWindow *X11InitWindow()
@@ -102,8 +106,7 @@ static DrawWindow *X11InitWindow()
   DrawWindow *new_window = CreateBitmapStruct();
   unsigned int border_width = 4;
   XGCValues gc_values;
-  unsigned long gc_valuemask;
-#if !defined(PLATFORM_MSDOS)
+  unsigned int gc_valuemask;
   XTextProperty windowName, iconName;
   Pixmap icon_pixmap, iconmask_pixmap;
   unsigned int icon_width, icon_height;
@@ -113,13 +116,12 @@ 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,13 +131,15 @@ 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,
                                             width, height, border_width,
                                             pen_fg, pen_bg);
 
-#if !defined(PLATFORM_MSDOS)
   proto_atom = XInternAtom(display, "WM_PROTOCOLS", FALSE);
   delete_atom = XInternAtom(display, "WM_DELETE_WINDOW", FALSE);
   if ((proto_atom != None) && (delete_atom != None))
@@ -197,7 +201,6 @@ static DrawWindow *X11InitWindow()
     KeyPressMask | KeyReleaseMask;
 
   XSelectInput(display, new_window->drawable, window_event_mask);
-#endif
 
   /* create GC for drawing with window depth and background color (black) */
   gc_values.graphics_exposures = False;
@@ -227,6 +230,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 +281,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);