Alexandre Julliard : x11drv: Ignore X errors caused by windows being created or deleted.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Apr 3 05:33:56 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: fb8ca46e8286a277403c0cc3188dfc44a97a4b9b
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=fb8ca46e8286a277403c0cc3188dfc44a97a4b9b

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Sat Apr  1 14:21:31 2006 +0200

x11drv: Ignore X errors caused by windows being created or deleted.

---

 dlls/x11drv/x11drv.h      |    1 +
 dlls/x11drv/x11drv_main.c |   16 ++++++++++++++++
 dlls/x11drv/xrender.c     |    6 +++---
 3 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/dlls/x11drv/x11drv.h b/dlls/x11drv/x11drv.h
index 0ba4fce..d259c86 100644
--- a/dlls/x11drv/x11drv.h
+++ b/dlls/x11drv/x11drv.h
@@ -538,6 +538,7 @@ extern int managed_mode;
 extern int private_color_map;
 extern int copy_default_colors;
 extern int alloc_system_colors;
+extern int xrender_error_base;
 
 extern BYTE key_state_table[256];
 extern POINT cursor_pos;
diff --git a/dlls/x11drv/x11drv_main.c b/dlls/x11drv/x11drv_main.c
index 16d0a5c..050ac54 100644
--- a/dlls/x11drv/x11drv_main.c
+++ b/dlls/x11drv/x11drv_main.c
@@ -37,6 +37,9 @@
 #ifdef HAVE_XKB
 #include <X11/XKBlib.h>
 #endif
+#ifdef HAVE_X11_EXTENSIONS_XRENDER_H
+#include <X11/extensions/Xrender.h>
+#endif
 
 #include "windef.h"
 #include "winbase.h"
@@ -85,6 +88,7 @@ int client_side_antialias_with_render = 
 int copy_default_colors = 128;
 int alloc_system_colors = 256;
 DWORD thread_data_tls_index = TLS_OUT_OF_INDEXES;
+int xrender_error_base = 0;
 
 static BOOL desktop_dbl_buf = TRUE;
 
@@ -161,6 +165,18 @@ static const char * const atom_names[NB_
 static inline BOOL ignore_error( Display *display, XErrorEvent *event )
 {
     if (event->request_code == X_SetInputFocus && event->error_code == BadMatch) return TRUE;
+
+    /* ignore a number of errors on gdi display caused by creating/destroying windows */
+    if (display == gdi_display)
+    {
+        if (event->error_code == BadDrawable || event->error_code == BadGC) return TRUE;
+#ifdef HAVE_X11_EXTENSIONS_XRENDER_H
+        if (xrender_error_base)  /* check for XRender errors */
+        {
+            if (event->error_code == xrender_error_base + BadPicture) return TRUE;
+        }
+#endif
+    }
     return FALSE;
 }
 
diff --git a/dlls/x11drv/xrender.c b/dlls/x11drv/xrender.c
index a782ea5..2068e5b 100644
--- a/dlls/x11drv/xrender.c
+++ b/dlls/x11drv/xrender.c
@@ -167,7 +167,7 @@ static CRITICAL_SECTION xrender_cs = { &
  */
 void X11DRV_XRender_Init(void)
 {
-    int error_base, event_base, i;
+    int event_base, i;
     XRenderPictFormat pf;
 
     if (client_side_with_render &&
@@ -200,9 +200,9 @@ LOAD_OPTIONAL_FUNCPTR(XRenderSetPictureT
 
 
         wine_tsx11_lock();
-        if(pXRenderQueryExtension(gdi_display, &event_base, &error_base)) {
+        if(pXRenderQueryExtension(gdi_display, &event_base, &xrender_error_base)) {
             X11DRV_XRender_Installed = TRUE;
-            TRACE("Xrender is up and running error_base = %d\n", error_base);
+            TRACE("Xrender is up and running error_base = %d\n", xrender_error_base);
             screen_format = pXRenderFindVisualFormat(gdi_display, visual);
             if(!screen_format)
             {




More information about the wine-cvs mailing list