server: Expose areas revealed by changes to the window region.
This commit is contained in:
parent
366dbd2f81
commit
1767b4558a
|
@ -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;
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue