Alexandre Julliard : winex11: Use the stored coordinates to convert back from X11 to window rectangle.

Alexandre Julliard julliard at winehq.org
Thu Aug 23 16:37:03 CDT 2018


Module: wine
Branch: master
Commit: d7cd441373dfa58073d8eea29eea84af8bbc0b79
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d7cd441373dfa58073d8eea29eea84af8bbc0b79

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Aug 23 10:50:47 2018 +0200

winex11: Use the stored coordinates to convert back from X11 to window rectangle.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 8fe6b36..606fa69 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 24c9429..0a4f118 100644
--- a/dlls/winex11.drv/window.c
+++ b/dlls/winex11.drv/window.c
@@ -306,33 +306,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
  *
  * Fill the window attributes structure for an X window.
@@ -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 939c2e7..a0308b0 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;




More information about the wine-cvs mailing list