Alexandre Julliard : server: Invalidate the correct region when custom valid rects are specified.

Alexandre Julliard julliard at winehq.org
Wed Jan 23 05:25:00 CST 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Jan 22 20:06:35 2008 +0100

server: Invalidate the correct region when custom valid rects are specified.

---

 server/window.c |   44 ++++++++++++++++++++++++--------------------
 1 files changed, 24 insertions(+), 20 deletions(-)

diff --git a/server/window.c b/server/window.c
index 6c1b816..3c067b6 100644
--- a/server/window.c
+++ b/server/window.c
@@ -1500,42 +1500,46 @@ static void set_window_pos( struct window *win, struct window *previous,
         client_changed = (client_rect->left   - old_client_rect.left   != x_offset ||
                           client_rect->right  - old_client_rect.right  != x_offset ||
                           client_rect->top    - old_client_rect.top    != y_offset ||
-                          client_rect->bottom - old_client_rect.bottom != y_offset);
+                          client_rect->bottom - old_client_rect.bottom != y_offset ||
+                          !valid_rects ||
+                          memcmp( &valid_rects[0], client_rect, sizeof(*client_rect) ));
     }
 
     if (frame_changed || client_changed)
     {
-        struct region *tmp = create_empty_region();
+        struct region *win_rgn = old_vis_rgn;  /* reuse previous region */
 
-        if (tmp)
+        set_region_rect( win_rgn, window_rect );
+        if (valid_rects)
         {
             /* subtract the valid portion of client rect from the total region */
-            if (!client_changed)
-                set_region_rect( tmp, client_rect );
-            else if (valid_rects)
-                set_region_rect( tmp, &valid_rects[0] );
-
-            set_region_rect( old_vis_rgn, window_rect );
-            if (!subtract_region( tmp, old_vis_rgn, tmp )) free_region( tmp );
-            else
+            struct region *tmp = create_empty_region();
+            if (tmp)
             {
-                if (!is_desktop_window(win))
-                    offset_region( tmp, -client_rect->left, -client_rect->top );
-                if (exposed_rgn)
-                {
-                    union_region( exposed_rgn, exposed_rgn, tmp );
-                    free_region( tmp );
-                }
-                else exposed_rgn = tmp;
+                set_region_rect( tmp, &valid_rects[0] );
+                if (subtract_region( tmp, win_rgn, tmp )) win_rgn = tmp;
+                else free_region( tmp );
             }
         }
+        if (!is_desktop_window(win))
+            offset_region( win_rgn, -client_rect->left, -client_rect->top );
+        if (exposed_rgn)
+        {
+            union_region( exposed_rgn, exposed_rgn, win_rgn );
+            if (win_rgn != old_vis_rgn) free_region( win_rgn );
+        }
+        else
+        {
+            exposed_rgn = win_rgn;
+            if (win_rgn == old_vis_rgn) old_vis_rgn = NULL;
+        }
     }
 
     if (exposed_rgn)
         redraw_window( win, exposed_rgn, 1, RDW_INVALIDATE | RDW_ERASE | RDW_FRAME | RDW_ALLCHILDREN );
 
 done:
-    free_region( old_vis_rgn );
+    if (old_vis_rgn) free_region( old_vis_rgn );
     if (exposed_rgn) free_region( exposed_rgn );
     clear_error();  /* we ignore out of memory errors once the new rects have been set */
 }




More information about the wine-cvs mailing list