Module: wine Branch: master Commit: 76b8612c3e5879f396756d9be9f3efb3964e1d5d URL: http://source.winehq.org/git/wine.git/?a=commit;h=76b8612c3e5879f396756d9be9...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Feb 13 14:51:00 2013 +0100
winex11: Preserve the client window when changing the window visual.
---
dlls/winex11.drv/window.c | 13 ++++++++++++- 1 files changed, 12 insertions(+), 1 deletions(-)
diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 7f97330..ec15afc 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -1525,12 +1525,23 @@ static void destroy_whole_window( struct x11drv_win_data *data, BOOL already_des */ void set_window_visual( struct x11drv_win_data *data, const XVisualInfo *vis ) { + Window client_window = data->client_window; + Window whole_window = data->whole_window; + if (data->vis.visualid == vis->visualid) return; - destroy_whole_window( data, FALSE ); + data->client_window = 0; + destroy_whole_window( data, client_window != 0 /* don't destroy whole_window until reparented */ ); if (data->surface) window_surface_release( data->surface ); data->surface = NULL; data->vis = *vis; create_whole_window( data ); + if (!client_window) return; + /* move the client to the new parent */ + XReparentWindow( data->display, client_window, data->whole_window, + data->client_rect.left - data->whole_rect.left, + data->client_rect.top - data->whole_rect.top ); + data->client_window = client_window; + XDestroyWindow( data->display, whole_window ); }