Alexandre Julliard : server: Clip the visible region of a window to the desktop window.

Alexandre Julliard julliard at winehq.org
Fri Sep 21 07:23:00 CDT 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 20 19:38:50 2007 +0200

server: Clip the visible region of a window to the desktop window.

---

 server/window.c |   23 +++++++++++------------
 1 files changed, 11 insertions(+), 12 deletions(-)

diff --git a/server/window.c b/server/window.c
index 14d6468..7c246dc 100644
--- a/server/window.c
+++ b/server/window.c
@@ -840,7 +840,7 @@ static inline struct window *get_top_clipping_window( struct window *win )
 
 
 /* compute the visible region of a window, in window coordinates */
-static struct region *get_visible_region( struct window *win, struct window *top, unsigned int flags )
+static struct region *get_visible_region( struct window *win, unsigned int flags )
 {
     struct region *tmp = NULL, *region;
     int offset_x, offset_y;
@@ -853,7 +853,7 @@ static struct region *get_visible_region( struct window *win, struct window *top
 
     /* create a region relative to the window itself */
 
-    if ((flags & DCX_PARENTCLIP) && win != top && win->parent)
+    if ((flags & DCX_PARENTCLIP) && win->parent && !is_desktop_window(win->parent))
     {
         set_region_client_rect( region, win->parent );
         offset_region( region, -win->parent->client_rect.left, -win->parent->client_rect.top );
@@ -891,11 +891,12 @@ static struct region *get_visible_region( struct window *win, struct window *top
         offset_y = win->window_rect.top;
     }
 
-    if (top && top != win && (tmp = create_empty_region()) != NULL)
+    if ((tmp = create_empty_region()) != NULL)
     {
-        while (win != top && win->parent)
+        while (win->parent)
         {
-            if (win->style & WS_CLIPSIBLINGS)
+            /* we don't clip out top-level siblings as that's up to the native windowing system */
+            if ((win->style & WS_CLIPSIBLINGS) && !is_desktop_window( win->parent ))
             {
                 if (!clip_children( win->parent, win, region, 0, 0 )) goto error;
                 if (is_region_empty( region )) break;
@@ -1332,12 +1333,11 @@ static void set_window_pos( struct window *win, struct window *previous,
     const rectangle_t old_window_rect = win->window_rect;
     const rectangle_t old_visible_rect = win->visible_rect;
     const rectangle_t old_client_rect = win->client_rect;
-    struct window *top = get_top_clipping_window( win );
     int visible = (win->style & WS_VISIBLE) || (swp_flags & SWP_SHOWWINDOW);
 
     if (win->parent && !is_visible( win->parent )) visible = 0;
 
-    if (visible && !(old_vis_rgn = get_visible_region( win, top, DCX_WINDOW ))) return;
+    if (visible && !(old_vis_rgn = get_visible_region( win, DCX_WINDOW ))) return;
 
     /* set the new window info before invalidating anything */
 
@@ -1356,7 +1356,7 @@ static void set_window_pos( struct window *win, struct window *previous,
     /* if the window is not visible, everything is easy */
     if (!visible) return;
 
-    if (!(new_vis_rgn = get_visible_region( win, top, DCX_WINDOW )))
+    if (!(new_vis_rgn = get_visible_region( win, DCX_WINDOW )))
     {
         free_region( old_vis_rgn );
         clear_error();  /* ignore error since the window info has been modified already */
@@ -1441,17 +1441,16 @@ done:
 static void set_window_region( struct window *win, struct region *region, int redraw )
 {
     struct region *old_vis_rgn = NULL, *new_vis_rgn;
-    struct window *top = get_top_clipping_window( win );
 
     /* no need to redraw if window is not visible */
     if (redraw && !is_visible( win )) redraw = 0;
 
-    if (redraw) old_vis_rgn = get_visible_region( win, top, DCX_WINDOW );
+    if (redraw) old_vis_rgn = get_visible_region( win, DCX_WINDOW );
 
     if (win->win_region) free_region( win->win_region );
     win->win_region = region;
 
-    if (old_vis_rgn && (new_vis_rgn = get_visible_region( win, top, DCX_WINDOW )))
+    if (old_vis_rgn && (new_vis_rgn = get_visible_region( win, DCX_WINDOW )))
     {
         /* expose anything revealed by the change */
         if (xor_region( new_vis_rgn, old_vis_rgn, new_vis_rgn ))
@@ -1867,7 +1866,7 @@ DECL_HANDLER(get_visible_region)
     if (!win) return;
 
     top = get_top_clipping_window( win );
-    if ((region = get_visible_region( win, top, req->flags )))
+    if ((region = get_visible_region( win, req->flags )))
     {
         rectangle_t *data;
         map_win_region_to_screen( win, region );




More information about the wine-cvs mailing list