x11drv: Ignore X errors caused by windows being created or deleted.
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 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 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 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 @@
*/
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 @@
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)
{