From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/window.c | 7 +++++++ dlls/winex11.drv/x11drv_main.c | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index c968b9dff24..010dacd35bb 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -51,6 +51,7 @@ #include "wingdi.h" #include "winuser.h"
+#include "xcomposite.h" #include "wine/debug.h" #include "wine/server.h" #include "mwm.h" @@ -1566,6 +1567,9 @@ void attach_client_window( struct x11drv_win_data *data, Window window ) XReparentWindow( gdi_display, data->client_window, data->whole_window, data->client_rect.left - data->whole_rect.left, data->client_rect.top - data->whole_rect.top ); +#ifdef SONAME_LIBXCOMPOSITE + if (usexcomposite) pXCompositeUnredirectWindow( gdi_display, data->client_window, CompositeRedirectManual ); +#endif TRACE( "%p/%lx attached client window %lx\n", data->hwnd, data->whole_window, data->client_window ); }
@@ -1582,6 +1586,9 @@ void detach_client_window( struct x11drv_win_data *data, Window window ) XDeleteContext( data->display, data->client_window, winContext );
XReparentWindow( gdi_display, data->client_window, get_dummy_parent(), 0, 0 ); +#ifdef SONAME_LIBXCOMPOSITE + if (usexcomposite) pXCompositeRedirectWindow( gdi_display, data->client_window, CompositeRedirectManual ); +#endif TRACE( "%p/%lx detached client window %lx\n", data->hwnd, data->whole_window, data->client_window );
data->client_window = 0; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 32a20e0e4f2..6daa2f459b8 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -96,6 +96,7 @@ static unsigned long err_serial; /* serial number of first request * static int (*old_error_handler)( Display *, XErrorEvent * ); static BOOL use_xim = TRUE; static WCHAR input_style[20]; +static int xcomp_opcode;
static pthread_mutex_t d3dkmt_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t error_mutex = PTHREAD_MUTEX_INITIALIZER; @@ -247,6 +248,12 @@ static inline BOOL ignore_error( Display *display, XErrorEvent *event ) { if (event->error_code == xrender_error_base + BadPicture) return TRUE; } +#endif +#ifdef SONAME_LIBXCOMPOSITE + if (xcomp_opcode && event->request_code == xcomp_opcode && + (event->minor_code == X_CompositeRedirectWindow || + event->minor_code == X_CompositeUnredirectWindow)) + return TRUE; #endif } return FALSE; @@ -573,15 +580,16 @@ static void X11DRV_XComposite_Init(void) LOAD_FUNCPTR(XCompositeNameWindowPixmap); #undef LOAD_FUNCPTR
- if(!pXCompositeQueryExtension(gdi_display, &xcomp_event_base, - &xcomp_error_base)) { - TRACE("XComposite extension could not be queried; disabled\n"); - dlclose(xcomposite_handle); + if (!XQueryExtension( gdi_display, "Composite", &xcomp_opcode, &xcomp_event_base, &xcomp_error_base )) + { + WARN( "XComposite extension could not be queried; disabled\n" ); + dlclose( xcomposite_handle ); xcomposite_handle = NULL; usexcomposite = FALSE; return; } - TRACE("XComposite is up and running error_base = %d\n", xcomp_error_base); + TRACE( "XComposite is up and running opcode = %d, error_base = %d, event_base %d\n", + xcomp_opcode, xcomp_error_base, xcomp_event_base ); return;
sym_not_found: