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