Module: wine Branch: master Commit: 1767b4558a02e59757553b8ae183c3690879be95 URL: http://source.winehq.org/git/wine.git/?a=commit;h=1767b4558a02e59757553b8ae1...
Author: Alexandre Julliard julliard@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 ); }