From: Rémi Bernon rbernon@codeweavers.com
--- dlls/winex11.drv/init.c | 31 ++++++++++++++++++++++++------- dlls/winex11.drv/window.c | 28 ---------------------------- 2 files changed, 24 insertions(+), 35 deletions(-)
diff --git a/dlls/winex11.drv/init.c b/dlls/winex11.drv/init.c index f468898cacb..49c4bb7b3fa 100644 --- a/dlls/winex11.drv/init.c +++ b/dlls/winex11.drv/init.c @@ -261,6 +261,7 @@ static const struct client_surface_funcs x11drv_client_surface_funcs; struct x11drv_client_surface { struct client_surface client; + XWindowChanges changes; Colormap colormap; Window window; RECT rect; @@ -303,17 +304,33 @@ static void x11drv_client_surface_detach( struct client_surface *client ) } }
-static void client_surface_update_size( HWND hwnd, struct x11drv_client_surface *surface ) +static void client_surface_update_geometry( HWND hwnd, struct x11drv_client_surface *surface ) { - XWindowChanges changes; + XWindowChanges changes = surface->changes; + struct x11drv_win_data *data; + int mask = 0; RECT rect;
if (!NtUserGetClientRect( hwnd, &rect, NtUserGetDpiForWindow( hwnd ) )) return; - if (EqualRect( &surface->rect, &rect )) return; - + if (!ReadNoFence( &surface->client.offscreen ) && (data = get_win_data( hwnd ))) + { + changes.x = data->rects.client.left - data->rects.visible.left; + changes.y = data->rects.client.top - data->rects.visible.top; + release_win_data( data ); + } changes.width = min( max( 1, rect.right ), 65535 ); changes.height = min( max( 1, rect.bottom ), 65535 ); - XConfigureWindow( gdi_display, surface->window, CWWidth | CWHeight, &changes ); + + if (changes.x != surface->changes.x) mask |= CWX; + if (changes.y != surface->changes.y) mask |= CWY; + if (changes.width != surface->changes.width) mask |= CWWidth; + if (changes.height != surface->changes.height) mask |= CWHeight; + if (!mask) return; + + surface->changes = changes; + TRACE( "client window %p/%lx, requesting position %d,%d size %d,%d mask %#x\n", hwnd, + surface->window, changes.x, changes.y, changes.width, changes.height, mask ); + XConfigureWindow( gdi_display, surface->window, mask, &changes ); surface->rect = rect; }
@@ -377,7 +394,7 @@ static void x11drv_client_surface_update( struct client_surface *client )
TRACE( "%s\n", debugstr_client_surface( client ) );
- client_surface_update_size( hwnd, surface ); + client_surface_update_geometry( hwnd, surface ); client_surface_update_offscreen( hwnd, surface ); }
@@ -392,7 +409,7 @@ static void X11DRV_client_surface_present( struct client_surface *client, HDC hd
TRACE( "%s\n", debugstr_client_surface( client ) );
- client_surface_update_size( hwnd, surface ); + client_surface_update_geometry( hwnd, surface ); client_surface_update_offscreen( hwnd, surface );
if (!hdc) return; diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 650dcf12cfa..92a96fd70cc 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -2146,32 +2146,6 @@ static void sync_window_position( struct x11drv_win_data *data, UINT swp_flags, }
-/*********************************************************************** - * sync_client_position - * - * Synchronize the X client window position with the Windows one - */ -static void sync_client_position( struct x11drv_win_data *data, const struct window_rects *old_rects ) -{ - int mask = 0; - XWindowChanges changes; - - if (!data->client_window) return; - - changes.x = data->rects.client.left - data->rects.visible.left; - changes.y = data->rects.client.top - data->rects.visible.top; - if (changes.x != old_rects->client.left - old_rects->visible.left) mask |= CWX; - if (changes.y != old_rects->client.top - old_rects->visible.top) mask |= CWY; - - if (mask) - { - TRACE( "setting client win %lx pos %d,%d changes=%x\n", - data->client_window, changes.x, changes.y, mask ); - XConfigureWindow( gdi_display, data->client_window, mask, &changes ); - } -} - - /*********************************************************************** * move_window_bits * @@ -3296,8 +3270,6 @@ void X11DRV_WindowPosChanged( HWND hwnd, HWND insert_after, HWND owner_hint, UIN
XFlush( gdi_display ); /* make sure painting is done before we move the window */
- sync_client_position( data, &old_rects ); - if (!data->whole_window) { release_win_data( data );