Alexandre Julliard : server: Expose areas revealed by changes to the window region.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 5 13:10:26 CST 2007


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Mar  5 16:43:09 2007 +0100

server: Expose areas revealed by changes to the window region.

---

 dlls/user32/winpos.c           |    2 ++
 include/wine/server_protocol.h |    3 ++-
 server/protocol.def            |    1 +
 server/trace.c                 |    1 +
 server/window.c                |   30 ++++++++++++++++++++++++++++--
 5 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/dlls/user32/winpos.c b/dlls/user32/winpos.c
index 46f9a26..635e968 100644
--- a/dlls/user32/winpos.c
+++ b/dlls/user32/winpos.c
@@ -250,6 +250,7 @@ int WINAPI SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL bRedraw )
         SERVER_START_REQ( set_window_region )
         {
             req->window = hwnd;
+            req->redraw = (bRedraw != 0);
             if (data->rdh.nCount)
                 wine_server_add_data( req, data->Buffer, data->rdh.nCount * sizeof(RECT) );
             else
@@ -263,6 +264,7 @@ int WINAPI SetWindowRgn( HWND hwnd, HRGN hrgn, BOOL bRedraw )
         SERVER_START_REQ( set_window_region )
         {
             req->window = hwnd;
+            req->redraw = (bRedraw != 0);
             ret = !wine_server_call_err( req );
         }
         SERVER_END_REQ;
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index db13e0c..02851dc 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -3060,6 +3060,7 @@ struct set_window_region_request
 {
     struct request_header __header;
     user_handle_t  window;
+    int            redraw;
     /* VARARG(region,rectangles); */
 };
 struct set_window_region_reply
@@ -4671,6 +4672,6 @@ union generic_reply
     struct get_token_impersonation_level_reply get_token_impersonation_level_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 278
+#define SERVER_PROTOCOL_VERSION 279
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index 69daab3..d88bbe8 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2233,6 +2233,7 @@ enum message_type
 /* Set the window region */
 @REQ(set_window_region)
     user_handle_t  window;        /* handle to the window */
+    int            redraw;        /* redraw the window? */
     VARARG(region,rectangles);    /* list of rectangles for the region */
 @END
 
diff --git a/server/trace.c b/server/trace.c
index d4bcf08..56cc7f6 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2708,6 +2708,7 @@ static void dump_get_window_region_reply( const struct get_window_region_reply *
 static void dump_set_window_region_request( const struct set_window_region_request *req )
 {
     fprintf( stderr, " window=%p,", req->window );
+    fprintf( stderr, " redraw=%d,", req->redraw );
     fprintf( stderr, " region=" );
     dump_varargs_rectangles( cur_size );
 }
diff --git a/server/window.c b/server/window.c
index c526185..03ed61e 100644
--- a/server/window.c
+++ b/server/window.c
@@ -1443,6 +1443,33 @@ done:
 }
 
 
+/* set the window region, updating the update region if necessary */
+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 (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 )))
+    {
+        /* expose anything revealed by the change */
+        if (xor_region( new_vis_rgn, old_vis_rgn, new_vis_rgn ))
+            expose_window( win, top, new_vis_rgn );
+        free_region( new_vis_rgn );
+    }
+
+    if (old_vis_rgn) free_region( old_vis_rgn );
+    clear_error();  /* we ignore out of memory errors since the region has been set */
+}
+
+
 /* create a window */
 DECL_HANDLER(create_window)
 {
@@ -1900,8 +1927,7 @@ DECL_HANDLER(set_window_region)
         if (!(region = create_region_from_req_data( get_req_data(), get_req_data_size() )))
             return;
     }
-    if (win->win_region) free_region( win->win_region );
-    win->win_region = region;
+    set_window_region( win, region, req->redraw );
 }
 
 




More information about the wine-cvs mailing list