check XGetGeometry() return value
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 9 Jan 2006 16:59:30 +0000 (16:59 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 9 Jan 2006 16:59:30 +0000 (16:59 +0000)
src/mesa/drivers/x11/xm_dd.c

index 5038260..931cdd2 100644 (file)
@@ -109,14 +109,23 @@ get_buffer_size( GLframebuffer *buffer, GLuint *width, GLuint *height )
    winheight = MIN2(xmBuffer->frontxrb->drawable->height, MAX_HEIGHT);
 #else
    Window root;
+   Status stat;
    int winx, winy;
    unsigned int bw, d;
 
    _glthread_LOCK_MUTEX(_xmesa_lock);
    XSync(xmBuffer->xm_visual->display, 0); /* added for Chromium */
-   XGetGeometry( xmBuffer->xm_visual->display, xmBuffer->frontxrb->pixmap,
+
+   stat = XGetGeometry( xmBuffer->xm_visual->display, xmBuffer->frontxrb->pixmap,
                  &root, &winx, &winy, &winwidth, &winheight, &bw, &d );
    _glthread_UNLOCK_MUTEX(_xmesa_lock);
+
+   if (!stat) {
+      /* probably querying a window that's recently been destroyed */
+      _mesa_warning(NULL, "XGetGeometry failed!\n");
+      *width = *height = 1;
+      return;
+   }
 #endif
 
    *width = winwidth;
@@ -453,6 +462,9 @@ clear_32bit_ximage(GLcontext *ctx, struct xmesa_renderbuffer *xrb,
    const XMesaContext xmesa = XMESA_CONTEXT(ctx);
    register GLuint pixel = (GLuint) xmesa->clearpixel;
 
+   if (!xrb->ximage)
+      return;
+
    if (xmesa->swapbytes) {
       pixel = ((pixel >> 24) & 0x000000ff)
             | ((pixel >> 8)  & 0x0000ff00)