Alexandre Julliard : server: Pass the rectangle in client coordinates for update_window_zorder.

Alexandre Julliard julliard at winehq.org
Tue Sep 28 11:13:30 CDT 2010


Module: wine
Branch: master
Commit: 6ee4521886822178366c0278c5321022d21f5672
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6ee4521886822178366c0278c5321022d21f5672

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Sep 27 21:12:49 2010 +0200

server: Pass the rectangle in client coordinates for update_window_zorder.

---

 dlls/winex11.drv/event.c |   17 ++++++-----------
 dlls/winex11.drv/mouse.c |   45 +++++++++++++++------------------------------
 server/protocol.def      |    2 +-
 server/window.c          |    8 +++++---
 4 files changed, 27 insertions(+), 45 deletions(-)

diff --git a/dlls/winex11.drv/event.c b/dlls/winex11.drv/event.c
index 8fc955a..a1e0d7f 100644
--- a/dlls/winex11.drv/event.c
+++ b/dlls/winex11.drv/event.c
@@ -731,19 +731,16 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
 
     if (!(data = X11DRV_get_win_data( hwnd ))) return;
 
+    rect.left   = event->x;
+    rect.top    = event->y;
+    rect.right  = event->x + event->width;
+    rect.bottom = event->y + event->height;
     if (event->window == data->whole_window)
     {
-        rect.left = data->whole_rect.left + event->x;
-        rect.top  = data->whole_rect.top + event->y;
+        OffsetRect( &rect, data->whole_rect.left - data->client_rect.left,
+                    data->whole_rect.top - data->client_rect.top );
         flags |= RDW_FRAME;
     }
-    else
-    {
-        rect.left = data->client_rect.left + event->x;
-        rect.top  = data->client_rect.top + event->y;
-    }
-    rect.right  = rect.left + event->width;
-    rect.bottom = rect.top + event->height;
 
     if (event->window != root_window)
     {
@@ -758,8 +755,6 @@ static void X11DRV_Expose( HWND hwnd, XEvent *xev )
         }
         SERVER_END_REQ;
 
-        /* make position relative to client area instead of parent */
-        OffsetRect( &rect, -data->client_rect.left, -data->client_rect.top );
         flags |= RDW_ALLCHILDREN;
     }
 
diff --git a/dlls/winex11.drv/mouse.c b/dlls/winex11.drv/mouse.c
index 922df65..b725823 100644
--- a/dlls/winex11.drv/mouse.c
+++ b/dlls/winex11.drv/mouse.c
@@ -120,29 +120,6 @@ void X11DRV_Xcursor_Init(void)
 
 
 /***********************************************************************
- *		get_coords
- *
- * get the coordinates of a mouse event
- */
-static inline void get_coords( HWND hwnd, Window window, int x, int y, POINT *pt )
-{
-    struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
-
-    if (!data) return;
-
-    if (window == data->client_window)
-    {
-        pt->x = x + data->client_rect.left;
-        pt->y = y + data->client_rect.top;
-    }
-    else
-    {
-        pt->x = x + data->whole_rect.left;
-        pt->y = y + data->whole_rect.top;
-    }
-}
-
-/***********************************************************************
  *		clip_point_to_rect
  *
  * Clip point to the provided rectangle
@@ -241,25 +218,33 @@ void set_window_cursor( HWND hwnd, HCURSOR handle )
  */
 static void update_mouse_state( HWND hwnd, Window window, int x, int y, unsigned int state, POINT *pt )
 {
-    struct x11drv_thread_data *data = x11drv_thread_data();
+    struct x11drv_win_data *data = X11DRV_get_win_data( hwnd );
+
+    if (!data) return;
 
-    get_coords( hwnd, window, x, y, pt );
+    if (window == data->whole_window)
+    {
+        x += data->whole_rect.left - data->client_rect.left;
+        y += data->whole_rect.top - data->client_rect.top;
+    }
+    pt->x = x + data->client_rect.left;
+    pt->y = y + data->client_rect.top;
 
     cursor_window = hwnd;
 
     /* update the wine server Z-order */
 
-    if (window != data->grab_window &&
+    if (window != x11drv_thread_data()->grab_window &&
         /* ignore event if a button is pressed, since the mouse is then grabbed too */
         !(state & (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask|Button6Mask|Button7Mask)))
     {
         SERVER_START_REQ( update_window_zorder )
         {
             req->window      = wine_server_user_handle( hwnd );
-            req->rect.left   = pt->x;
-            req->rect.top    = pt->y;
-            req->rect.right  = pt->x + 1;
-            req->rect.bottom = pt->y + 1;
+            req->rect.left   = x;
+            req->rect.top    = y;
+            req->rect.right  = x + 1;
+            req->rect.bottom = y + 1;
             wine_server_call( req );
         }
         SERVER_END_REQ;
diff --git a/server/protocol.def b/server/protocol.def
index ccc87fe..21cae9c 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2441,7 +2441,7 @@ enum coords_relative
 /* Update the z order of a window so that a given rectangle is fully visible */
 @REQ(update_window_zorder)
     user_handle_t  window;        /* handle to the window */
-    rectangle_t    rect;          /* rectangle that must be visible */
+    rectangle_t    rect;          /* rectangle that must be visible (in client coords) */
 @END
 
 
diff --git a/server/window.c b/server/window.c
index e3dc47a..8900751 100644
--- a/server/window.c
+++ b/server/window.c
@@ -2423,18 +2423,20 @@ DECL_HANDLER(get_update_region)
 /* update the z order of a window so that a given rectangle is fully visible */
 DECL_HANDLER(update_window_zorder)
 {
-    rectangle_t tmp;
+    rectangle_t tmp, rect = req->rect;
     struct window *ptr, *win = get_window( req->window );
 
     if (!win || !win->parent || !is_visible( win )) return;  /* nothing to do */
+    if (win->ex_style & WS_EX_LAYOUTRTL) mirror_rect( &win->client_rect, &rect );
+    offset_rect( &rect, win->client_rect.left, win->client_rect.top );
 
     LIST_FOR_EACH_ENTRY( ptr, &win->parent->children, struct window, entry )
     {
         if (ptr == win) break;
         if (!(ptr->style & WS_VISIBLE)) continue;
         if (ptr->ex_style & WS_EX_TRANSPARENT) continue;
-        if (!intersect_rect( &tmp, &ptr->visible_rect, &req->rect )) continue;
-        if (ptr->win_region && !rect_in_region( ptr->win_region, &req->rect )) continue;
+        if (!intersect_rect( &tmp, &ptr->visible_rect, &rect )) continue;
+        if (ptr->win_region && !rect_in_region( ptr->win_region, &rect )) continue;
         /* found a window obscuring the rectangle, now move win above this one */
         /* making sure to not violate the topmost rule */
         if (!(ptr->ex_style & WS_EX_TOPMOST) || (win->ex_style & WS_EX_TOPMOST))




More information about the wine-cvs mailing list