Alexandre Julliard : server: Always ignore the root window position when computing coordinates offsets.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Oct 26 06:32:14 CDT 2006


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Oct 26 12:51:54 2006 +0200

server: Always ignore the root window position when computing coordinates offsets.

---

 server/window.c |   79 +++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 53 insertions(+), 26 deletions(-)

diff --git a/server/window.c b/server/window.c
index ea6dc3b..22112b8 100644
--- a/server/window.c
+++ b/server/window.c
@@ -638,7 +638,7 @@ static int all_windows_from_point( struc
     struct window *ptr;
 
     /* make point relative to top window */
-    for (ptr = top->parent; ptr; ptr = ptr->parent)
+    for (ptr = top->parent; ptr && !is_desktop_window(ptr); ptr = ptr->parent)
     {
         x -= ptr->client_rect.left;
         y -= ptr->client_rect.top;
@@ -651,9 +651,12 @@ static int all_windows_from_point( struc
         x >= top->client_rect.left && x < top->client_rect.right &&
         y >= top->client_rect.top && y < top->client_rect.bottom)
     {
-        if (!get_window_children_from_point( top, x - top->client_rect.left,
-                                             y - top->client_rect.top, array ))
-            return 0;
+        if (!is_desktop_window(top))
+        {
+            x -= top->client_rect.left;
+            y -= top->client_rect.top;
+        }
+        if (!get_window_children_from_point( top, x, y, array )) return 0;
     }
     /* now add window to the array */
     if (!add_handle_to_array( array, top->handle )) return 0;
@@ -746,7 +749,7 @@ static struct region *intersect_window_r
 /* convert coordinates from client to screen coords */
 static inline void client_to_screen( struct window *win, int *x, int *y )
 {
-    for ( ; win; win = win->parent)
+    for ( ; win && !is_desktop_window(win); win = win->parent)
     {
         *x += win->client_rect.left;
         *y += win->client_rect.top;
@@ -756,10 +759,13 @@ static inline void client_to_screen( str
 /* map the region from window to screen coordinates */
 static inline void map_win_region_to_screen( struct window *win, struct region *region )
 {
-    int x = win->window_rect.left;
-    int y = win->window_rect.top;
-    client_to_screen( win->parent, &x, &y );
-    offset_region( region, x, y );
+    if (!is_desktop_window(win))
+    {
+        int x = win->window_rect.left;
+        int y = win->window_rect.top;
+        client_to_screen( win->parent, &x, &y );
+        offset_region( region, x, y );
+    }
 }
 
 
@@ -849,19 +855,29 @@ static struct region *get_visible_region
         set_region_client_rect( region, win );
         if (win->win_region && !intersect_window_region( region, win )) goto error;
     }
-    offset_x = win->window_rect.left;
-    offset_y = win->window_rect.top;
 
     /* clip children */
 
     if (flags & DCX_CLIPCHILDREN)
     {
-        if (!clip_children( win, NULL, region, win->client_rect.left, win->client_rect.top ))
-            goto error;
+        if (is_desktop_window(win)) offset_x = offset_y = 0;
+        else
+        {
+            offset_x = win->client_rect.left;
+            offset_y = win->client_rect.top;
+        }
+        if (!clip_children( win, NULL, region, offset_x, offset_y )) goto error;
     }
 
     /* clip siblings of ancestors */
 
+    if (is_desktop_window(win)) offset_x = offset_y = 0;
+    else
+    {
+        offset_x = win->window_rect.left;
+        offset_y = win->window_rect.top;
+    }
+
     if (top && top != win && (tmp = create_empty_region()) != NULL)
     {
         while (win != top && win->parent)
@@ -873,9 +889,12 @@ static struct region *get_visible_region
             }
             /* clip to parent client area */
             win = win->parent;
-            offset_x += win->client_rect.left;
-            offset_y += win->client_rect.top;
-            offset_region( region, win->client_rect.left, win->client_rect.top );
+            if (!is_desktop_window(win))
+            {
+                offset_x += win->client_rect.left;
+                offset_y += win->client_rect.top;
+                offset_region( region, win->client_rect.left, win->client_rect.top );
+            }
             set_region_client_rect( tmp, win );
             if (win->win_region && !intersect_window_region( tmp, win )) goto error;
             if (!intersect_region( region, region, tmp )) goto error;
@@ -913,7 +932,8 @@ static struct region *crop_region_to_win
     /* get bounding rect in client coords */
     if (frame) set_region_rect( tmp, &win->window_rect );
     else set_region_client_rect( tmp, win );
-    offset_region( tmp, -win->client_rect.left, -win->client_rect.top );
+    if (!is_desktop_window(win))
+        offset_region( tmp, -win->client_rect.left, -win->client_rect.top );
 
     /* intersect specified region with bounding rect */
     if (region && !intersect_region( tmp, region, tmp )) goto done;
@@ -1271,7 +1291,7 @@ static void expose_window( struct window
 
     offset_x = win->window_rect.left - win->client_rect.left;
     offset_y = win->window_rect.top - win->client_rect.top;
-    for (ptr = win; ptr != parent; ptr = ptr->parent)
+    for (ptr = win; ptr != parent && !is_desktop_window(ptr); ptr = ptr->parent)
     {
         offset_x += ptr->client_rect.left;
         offset_y += ptr->client_rect.top;
@@ -1351,7 +1371,8 @@ static void set_window_pos( struct windo
         if (tmp)
         {
             set_region_rect( tmp, window_rect );
-            offset_region( tmp, -window_rect->left, -window_rect->top );
+            if (!is_desktop_window(win))
+                offset_region( tmp, -window_rect->left, -window_rect->top );
             if (intersect_region( tmp, win->update_region, tmp ))
                 set_update_region( win, tmp );
             else
@@ -1381,7 +1402,8 @@ static void set_window_pos( struct windo
             set_region_rect( new_vis_rgn, window_rect );
             if (subtract_region( tmp, new_vis_rgn, tmp ))
             {
-                offset_region( tmp, -client_rect->left, -client_rect->top );
+                if (!is_desktop_window(win))
+                    offset_region( tmp, -client_rect->left, -client_rect->top );
                 redraw_window( win, tmp, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN );
             }
             free_region( tmp );
@@ -1768,7 +1790,7 @@ DECL_HANDLER(get_windows_offset)
     if (req->from)
     {
         if (!(win = get_window( req->from ))) return;
-        while (win)
+        while (win && !is_desktop_window(win))
         {
             reply->x += win->client_rect.left;
             reply->y += win->client_rect.top;
@@ -1778,7 +1800,7 @@ DECL_HANDLER(get_windows_offset)
     if (req->to)
     {
         if (!(win = get_window( req->to ))) return;
-        while (win)
+        while (win && !is_desktop_window(win))
         {
             reply->x -= win->client_rect.left;
             reply->y -= win->client_rect.top;
@@ -1807,10 +1829,15 @@ DECL_HANDLER(get_visible_region)
     reply->top_win   = top->handle;
     reply->top_org_x = top->visible_rect.left;
     reply->top_org_y = top->visible_rect.top;
-    reply->win_org_x = (req->flags & DCX_WINDOW) ? win->window_rect.left : win->client_rect.left;
-    reply->win_org_y = (req->flags & DCX_WINDOW) ? win->window_rect.top : win->client_rect.top;
-    client_to_screen( top->parent, &reply->top_org_x, &reply->top_org_y );
-    client_to_screen( win->parent, &reply->win_org_x, &reply->win_org_y );
+
+    if (!is_desktop_window(top))
+    {
+        reply->win_org_x = (req->flags & DCX_WINDOW) ? win->window_rect.left : win->client_rect.left;
+        reply->win_org_y = (req->flags & DCX_WINDOW) ? win->window_rect.top : win->client_rect.top;
+        client_to_screen( top->parent, &reply->top_org_x, &reply->top_org_y );
+        client_to_screen( win->parent, &reply->win_org_x, &reply->win_org_y );
+    }
+    else reply->win_org_x = reply->win_org_y = 0;
 }
 
 




More information about the wine-cvs mailing list