Alexandre Julliard : winex11: Use an X11 error handler to catch BadMatch errors from XGetImage.

Alexandre Julliard julliard at winehq.org
Tue Dec 6 15:46:17 CST 2011


Module: wine
Branch: master
Commit: 4c6a40977998c0aa7f9f5fa26021b5c5a4d3520c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4c6a40977998c0aa7f9f5fa26021b5c5a4d3520c

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Dec  5 22:47:31 2011 +0100

winex11: Use an X11 error handler to catch BadMatch errors from XGetImage.

---

 dlls/winex11.drv/bitblt.c |   31 ++++++++++++++++++++++---------
 1 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/dlls/winex11.drv/bitblt.c b/dlls/winex11.drv/bitblt.c
index c1df77a..9830327 100644
--- a/dlls/winex11.drv/bitblt.c
+++ b/dlls/winex11.drv/bitblt.c
@@ -582,6 +582,12 @@ int main()
 #endif  /* BITBLT_TEST */
 
 
+/* handler for XGetImage BadMatch errors */
+static int XGetImage_handler( Display *dpy, XErrorEvent *event, void *arg )
+{
+    return (event->request_code == X_GetImage && event->error_code == BadMatch);
+}
+
 /***********************************************************************
  *           BITBLT_GetDstArea
  *
@@ -1423,16 +1429,23 @@ DWORD X11DRV_GetImage( PHYSDEV dev, HBITMAP hbitmap, BITMAPINFO *info,
     }
     else
     {
-        Pixmap pixmap;
+        X11DRV_expect_error( gdi_display, XGetImage_handler, NULL );
+        image = XGetImage( gdi_display, physdev->drawable,
+                           physdev->dc_rect.left + x, physdev->dc_rect.top + y,
+                           width, height, AllPlanes, ZPixmap );
+        if (X11DRV_check_error())
+        {
+            /* use a temporary pixmap to avoid the BadMatch error */
+            Pixmap pixmap;
 
-        wine_tsx11_lock();
-        /* use a temporary pixmap to avoid BadMatch errors */
-        pixmap = XCreatePixmap( gdi_display, root_window, width, height, depth );
-        XCopyArea( gdi_display, physdev->drawable, pixmap, get_bitmap_gc(depth),
-                   physdev->dc_rect.left + x, physdev->dc_rect.top + y, width, height, 0, 0 );
-        image = XGetImage( gdi_display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap );
-        XFreePixmap( gdi_display, pixmap );
-        wine_tsx11_unlock();
+            wine_tsx11_lock();
+            pixmap = XCreatePixmap( gdi_display, root_window, width, height, depth );
+            XCopyArea( gdi_display, physdev->drawable, pixmap, get_bitmap_gc(depth),
+                       physdev->dc_rect.left + x, physdev->dc_rect.top + y, width, height, 0, 0 );
+            image = XGetImage( gdi_display, pixmap, 0, 0, width, height, AllPlanes, ZPixmap );
+            XFreePixmap( gdi_display, pixmap );
+            wine_tsx11_unlock();
+        }
     }
     if (!image) return ERROR_OUTOFMEMORY;
 




More information about the wine-cvs mailing list