From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/window.c | 44 ++++++++++++++++++++++++++------------- 1 file changed, 29 insertions(+), 15 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index a35e53079aa..031d754a3ef 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1587,6 +1587,31 @@ Window get_dummy_parent(void) return dummy_parent; }
+static void client_window_events_disable( struct x11drv_win_data *data, Window client_window ) +{ + XSelectInput( data->display, client_window, 0 ); + XFlush( data->display ); /* make sure XSelectInput doesn't use client_window after this point */ + XDeleteContext( data->display, client_window, winContext ); +} + +/********************************************************************** + * detach_client_window + */ +static void detach_client_window( struct x11drv_win_data *data, Window client_window ) +{ + if (data->client_window != client_window || !client_window) return; + + TRACE( "%p/%lx detaching client window %lx\n", data->hwnd, data->whole_window, client_window ); + + if (data->whole_window) + { + client_window_events_disable( data, client_window ); + XReparentWindow( gdi_display, client_window, get_dummy_parent(), 0, 0 ); + } + + data->client_window = 0; +} +
/********************************************************************** * create_client_window @@ -1609,12 +1634,7 @@ Window create_client_window( HWND hwnd, const XVisualInfo *visual, Colormap colo data->window_rect = data->whole_rect = data->client_rect; }
- if (data->client_window) - { - XDeleteContext( data->display, data->client_window, winContext ); - XReparentWindow( gdi_display, data->client_window, dummy_parent, 0, 0 ); - TRACE( "%p reparent xwin %lx/%lx\n", data->hwnd, data->whole_window, data->client_window ); - } + detach_client_window( data, data->client_window );
attr.colormap = colormap; attr.bit_gravity = NorthWestGravity; @@ -1635,11 +1655,11 @@ Window create_client_window( HWND hwnd, const XVisualInfo *visual, Colormap colo CWBackingStore | CWColormap | CWBorderPixel, &attr ); if (data->client_window) { - XSaveContext( data->display, data->client_window, winContext, (char *)data->hwnd ); XMapWindow( gdi_display, data->client_window ); if (data->whole_window) { XFlush( gdi_display ); /* make sure client_window is created for XSelectInput */ + XSaveContext( data->display, data->client_window, winContext, (char *)data->hwnd ); XSync( data->display, False ); /* make sure client_window is known from data->display */ XSelectInput( data->display, data->client_window, ExposureMask ); } @@ -1730,8 +1750,6 @@ static void destroy_whole_window( struct x11drv_win_data *data, BOOL already_des { TRACE( "win %p xwin %lx/%lx\n", data->hwnd, data->whole_window, data->client_window );
- if (data->client_window) XDeleteContext( data->display, data->client_window, winContext ); - if (!data->whole_window) { if (data->embedded) @@ -1753,12 +1771,8 @@ static void destroy_whole_window( struct x11drv_win_data *data, BOOL already_des } else { - if (data->client_window && !already_destroyed) - { - XSelectInput( data->display, data->client_window, 0 ); - XFlush( data->display ); /* make sure XSelectInput doesn't use client_window after this point */ - XReparentWindow( gdi_display, data->client_window, get_dummy_parent(), 0, 0 ); - } + if (!already_destroyed) detach_client_window( data, data->client_window ); + else if (data->client_window) client_window_events_disable( data, data->client_window ); XDeleteContext( data->display, data->whole_window, winContext ); if (!already_destroyed) {