From d7cd441373dfa58073d8eea29eea84af8bbc0b79 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 23 Aug 2018 10:50:47 +0200 Subject: [PATCH] winex11: Use the stored coordinates to convert back from X11 to window rectangle. Signed-off-by: Alexandre Julliard --- dlls/winex11.drv/event.c | 31 +++++++---------- dlls/winex11.drv/window.c | 73 +++++++++++++-------------------------- dlls/winex11.drv/x11drv.h | 2 +- 3 files changed, 37 insertions(+), 69 deletions(-) diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c index 8fe6b363c2a..606fa69896e 100644 --- a/dlls/winex11.drv/event.c +++ b/dlls/winex11.drv/event.c @@ -1077,17 +1077,13 @@ static BOOL X11DRV_ConfigureNotify( HWND hwnd, XEvent *xev ) } else pos = root_to_virtual_screen( x, y ); - rect.left = pos.x; - rect.top = pos.y; - rect.right = pos.x + event->width; - rect.bottom = pos.y + event->height; + X11DRV_X_to_window_rect( data, &rect, pos.x, pos.y, event->width, event->height ); + if (root_coords) MapWindowPoints( 0, parent, (POINT *)&rect, 2 ); + TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d,%dx%d)\n", hwnd, data->whole_window, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, event->x, event->y, event->width, event->height ); - X11DRV_X_to_window_rect( data, &rect ); - if (root_coords) MapWindowPoints( 0, parent, (POINT *)&rect, 2 ); - /* Compare what has changed */ x = rect.left; @@ -1155,7 +1151,8 @@ static BOOL X11DRV_GravityNotify( HWND hwnd, XEvent *xev ) { XGravityEvent *event = &xev->xgravity; struct x11drv_win_data *data = get_win_data( hwnd ); - RECT rect, window_rect; + RECT window_rect; + int x, y; if (!data) return FALSE; @@ -1165,22 +1162,18 @@ static BOOL X11DRV_GravityNotify( HWND hwnd, XEvent *xev ) return FALSE; } - rect.left = event->x; - rect.top = event->y; - rect.right = rect.left + data->whole_rect.right - data->whole_rect.left; - rect.bottom = rect.top + data->whole_rect.bottom - data->whole_rect.top; + x = event->x + data->window_rect.left - data->whole_rect.left; + y = event->y + data->window_rect.top - data->whole_rect.top; - TRACE( "win %p/%lx new X rect %d,%d,%dx%d (event %d,%d)\n", - hwnd, data->whole_window, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, - event->x, event->y ); + TRACE( "win %p/%lx new X pos %d,%d (event %d,%d)\n", + hwnd, data->whole_window, x, y, event->x, event->y ); - X11DRV_X_to_window_rect( data, &rect ); window_rect = data->window_rect; release_win_data( data ); - if (window_rect.left != rect.left || window_rect.top != rect.top) - SetWindowPos( hwnd, 0, rect.left, rect.top, 0, 0, - SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS ); + if (window_rect.left != x || window_rect.top != y) + SetWindowPos( hwnd, 0, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOCOPYBITS ); + return TRUE; } diff --git a/dlls/winex11.drv/window.c b/dlls/winex11.drv/window.c index 24c9429ef4d..0a4f118c340 100644 --- a/dlls/winex11.drv/window.c +++ b/dlls/winex11.drv/window.c @@ -305,33 +305,6 @@ static unsigned long get_mwm_decorations( struct x11drv_win_data *data, } -/*********************************************************************** - * get_x11_rect_offset - * - * Helper for X11DRV_window_to_X_rect and X11DRV_X_to_window_rect. - */ -static void get_x11_rect_offset( struct x11drv_win_data *data, RECT *rect ) -{ - DWORD style, ex_style, style_mask = 0, ex_style_mask = 0; - unsigned long decor; - - rect->top = rect->bottom = rect->left = rect->right = 0; - - style = GetWindowLongW( data->hwnd, GWL_STYLE ); - ex_style = GetWindowLongW( data->hwnd, GWL_EXSTYLE ); - decor = get_mwm_decorations( data, style, ex_style ); - - if (decor & MWM_DECOR_TITLE) style_mask |= WS_CAPTION; - if (decor & MWM_DECOR_BORDER) - { - style_mask |= WS_DLGFRAME | WS_THICKFRAME; - ex_style_mask |= WS_EX_DLGMODALFRAME; - } - - AdjustWindowRectEx( rect, style & style_mask, FALSE, ex_style & ex_style_mask ); -} - - /*********************************************************************** * get_window_attributes * @@ -1185,12 +1158,26 @@ void make_window_embedded( struct x11drv_win_data *data ) */ static void X11DRV_window_to_X_rect( struct x11drv_win_data *data, RECT *rect ) { + DWORD style, ex_style, style_mask = 0, ex_style_mask = 0; + unsigned long decor; RECT rc; if (!data->managed) return; if (IsRectEmpty( rect )) return; - get_x11_rect_offset( data, &rc ); + style = GetWindowLongW( data->hwnd, GWL_STYLE ); + ex_style = GetWindowLongW( data->hwnd, GWL_EXSTYLE ); + decor = get_mwm_decorations( data, style, ex_style ); + + if (decor & MWM_DECOR_TITLE) style_mask |= WS_CAPTION; + if (decor & MWM_DECOR_BORDER) + { + style_mask |= WS_DLGFRAME | WS_THICKFRAME; + ex_style_mask |= WS_EX_DLGMODALFRAME; + } + + SetRectEmpty( &rc ); + AdjustWindowRectEx( &rc, style & style_mask, FALSE, ex_style & ex_style_mask ); rect->left -= rc.left; rect->right -= rc.right; @@ -1206,21 +1193,15 @@ static void X11DRV_window_to_X_rect( struct x11drv_win_data *data, RECT *rect ) * * Opposite of X11DRV_window_to_X_rect */ -void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect ) +void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect, int x, int y, int cx, int cy ) { - RECT rc; - - if (!data->managed) return; - if (IsRectEmpty( rect )) return; - - get_x11_rect_offset( data, &rc ); - - rect->left += rc.left; - rect->right += rc.right; - rect->top += rc.top; - rect->bottom += rc.bottom; - if (rect->top >= rect->bottom) rect->bottom = rect->top + 1; - if (rect->left >= rect->right) rect->right = rect->left + 1; + x += data->window_rect.left - data->whole_rect.left; + y += data->window_rect.top - data->whole_rect.top; + cx += (data->window_rect.right - data->window_rect.left) - + (data->whole_rect.right - data->whole_rect.left); + cy += (data->window_rect.bottom - data->window_rect.top) - + (data->whole_rect.bottom - data->whole_rect.top); + SetRect( rect, x, y, x + cx, y + cy ); } @@ -1531,8 +1512,6 @@ static void create_whole_window( struct x11drv_win_data *data ) mask = get_window_attributes( data, &attr ); - data->whole_rect = data->window_rect; - X11DRV_window_to_X_rect( data, &data->whole_rect ); if (!(cx = data->whole_rect.right - data->whole_rect.left)) cx = 1; else if (cx > 65535) cx = 65535; if (!(cy = data->whole_rect.bottom - data->whole_rect.top)) cy = 1; @@ -2517,11 +2496,7 @@ UINT CDECL X11DRV_ShowWindow( HWND hwnd, INT cmd, RECT *rect, UINT swp ) &root, &x, &y, &width, &height, &border, &depth ); XTranslateCoordinates( thread_data->display, data->whole_window, root, 0, 0, &x, &y, &top ); pos = root_to_virtual_screen( x, y ); - rect->left = pos.x; - rect->top = pos.y; - rect->right = pos.x + width; - rect->bottom = pos.y + height; - X11DRV_X_to_window_rect( data, rect ); + X11DRV_X_to_window_rect( data, rect, pos.x, pos.y, width, height ); swp &= ~(SWP_NOMOVE | SWP_NOCLIENTMOVE | SWP_NOSIZE | SWP_NOCLIENTSIZE); done: diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index 939c2e7f3bb..a0308b06751 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -633,7 +633,7 @@ typedef int (*x11drv_error_callback)( Display *display, XErrorEvent *event, void extern void X11DRV_expect_error( Display *display, x11drv_error_callback callback, void *arg ) DECLSPEC_HIDDEN; extern int X11DRV_check_error(void) DECLSPEC_HIDDEN; -extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect ) DECLSPEC_HIDDEN; +extern void X11DRV_X_to_window_rect( struct x11drv_win_data *data, RECT *rect, int x, int y, int cx, int cy ) DECLSPEC_HIDDEN; extern POINT virtual_screen_to_root( INT x, INT y ) DECLSPEC_HIDDEN; extern POINT root_to_virtual_screen( INT x, INT y ) DECLSPEC_HIDDEN; extern RECT get_virtual_screen_rect(void) DECLSPEC_HIDDEN;