mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-30 04:48:36 +00:00
server: Merge get_surface_region / get_window_region requests together.
This commit is contained in:
parent
5481415d43
commit
7cdf20267c
|
@ -1717,7 +1717,7 @@ static BOOL get_window_info( HWND hwnd, WINDOWINFO *info )
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static NTSTATUS get_window_region( HWND hwnd, HRGN *region )
|
||||
static NTSTATUS get_window_region( HWND hwnd, BOOL surface, HRGN *region, RECT *visible )
|
||||
{
|
||||
NTSTATUS status;
|
||||
RGNDATA *data;
|
||||
|
@ -1728,9 +1728,10 @@ static NTSTATUS get_window_region( HWND hwnd, HRGN *region )
|
|||
{
|
||||
if (!(data = malloc( FIELD_OFFSET( RGNDATA, Buffer[size] )))) return STATUS_NO_MEMORY;
|
||||
|
||||
SERVER_START_REQ( get_surface_region )
|
||||
SERVER_START_REQ( get_window_region )
|
||||
{
|
||||
req->window = wine_server_user_handle( hwnd );
|
||||
req->surface = surface;
|
||||
wine_server_set_reply( req, data->Buffer, size );
|
||||
if (!(status = wine_server_call( req )))
|
||||
{
|
||||
|
@ -1742,7 +1743,10 @@ static NTSTATUS get_window_region( HWND hwnd, HRGN *region )
|
|||
data->rdh.nCount = reply_size / sizeof(RECT);
|
||||
data->rdh.nRgnSize = reply_size;
|
||||
*region = NtGdiExtCreateRegion( NULL, data->rdh.dwSize + data->rdh.nRgnSize, data );
|
||||
NtGdiOffsetRgn( *region, -reply->visible_rect.left, -reply->visible_rect.top );
|
||||
visible->left = reply->visible_rect.left;
|
||||
visible->top = reply->visible_rect.top;
|
||||
visible->right = reply->visible_rect.right;
|
||||
visible->bottom = reply->visible_rect.bottom;
|
||||
}
|
||||
}
|
||||
else size = reply->total_size;
|
||||
|
@ -1762,14 +1766,16 @@ static void update_surface_region( HWND hwnd )
|
|||
{
|
||||
WND *win = get_win_ptr( hwnd );
|
||||
HRGN region;
|
||||
RECT visible;
|
||||
|
||||
if (!win || win == WND_DESKTOP || win == WND_OTHER_PROCESS) return;
|
||||
if (!win->surface) goto done;
|
||||
|
||||
if (get_window_region( hwnd, ®ion )) goto done;
|
||||
if (get_window_region( hwnd, TRUE, ®ion, &visible )) goto done;
|
||||
if (!region) win->surface->funcs->set_region( win->surface, 0 );
|
||||
else
|
||||
{
|
||||
NtGdiOffsetRgn( region, -visible.left, -visible.top );
|
||||
win->surface->funcs->set_region( win->surface, region );
|
||||
NtGdiDeleteObjectApp( region );
|
||||
}
|
||||
|
@ -1959,41 +1965,17 @@ static BOOL apply_window_pos( HWND hwnd, HWND insert_after, UINT swp_flags,
|
|||
int WINAPI NtUserGetWindowRgnEx( HWND hwnd, HRGN hrgn, UINT unk )
|
||||
{
|
||||
NTSTATUS status;
|
||||
HRGN win_rgn = 0;
|
||||
RGNDATA *data;
|
||||
size_t size = 256;
|
||||
int ret = ERROR;
|
||||
HRGN win_rgn;
|
||||
RECT visible;
|
||||
|
||||
do
|
||||
if ((status = get_window_region( hwnd, FALSE, &win_rgn, &visible )))
|
||||
{
|
||||
if (!(data = malloc( sizeof(*data) + size - 1 )))
|
||||
{
|
||||
RtlSetLastWin32Error( ERROR_OUTOFMEMORY );
|
||||
return ERROR;
|
||||
}
|
||||
SERVER_START_REQ( get_window_region )
|
||||
{
|
||||
req->window = wine_server_user_handle( hwnd );
|
||||
wine_server_set_reply( req, data->Buffer, size );
|
||||
if (!(status = wine_server_call( req )))
|
||||
{
|
||||
size_t reply_size = wine_server_reply_size( reply );
|
||||
if (reply_size)
|
||||
{
|
||||
data->rdh.dwSize = sizeof(data->rdh);
|
||||
data->rdh.iType = RDH_RECTANGLES;
|
||||
data->rdh.nCount = reply_size / sizeof(RECT);
|
||||
data->rdh.nRgnSize = reply_size;
|
||||
win_rgn = NtGdiExtCreateRegion( NULL, data->rdh.dwSize + data->rdh.nRgnSize, data );
|
||||
}
|
||||
}
|
||||
else size = reply->total_size;
|
||||
}
|
||||
SERVER_END_REQ;
|
||||
free( data );
|
||||
} while (status == STATUS_BUFFER_OVERFLOW);
|
||||
set_ntstatus( status );
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
if (set_ntstatus( status ) && win_rgn)
|
||||
if (win_rgn)
|
||||
{
|
||||
ret = NtGdiCombineRgn( hrgn, win_rgn, 0, RGN_COPY );
|
||||
NtGdiDeleteObjectApp( win_rgn );
|
||||
|
|
|
@ -3544,12 +3544,14 @@ struct get_visible_region_reply
|
|||
|
||||
|
||||
|
||||
struct get_surface_region_request
|
||||
struct get_window_region_request
|
||||
{
|
||||
struct request_header __header;
|
||||
user_handle_t window;
|
||||
int surface;
|
||||
char __pad_20[4];
|
||||
};
|
||||
struct get_surface_region_reply
|
||||
struct get_window_region_reply
|
||||
{
|
||||
struct reply_header __header;
|
||||
rectangle_t visible_rect;
|
||||
|
@ -3560,21 +3562,6 @@ struct get_surface_region_reply
|
|||
|
||||
|
||||
|
||||
struct get_window_region_request
|
||||
{
|
||||
struct request_header __header;
|
||||
user_handle_t window;
|
||||
};
|
||||
struct get_window_region_reply
|
||||
{
|
||||
struct reply_header __header;
|
||||
data_size_t total_size;
|
||||
/* VARARG(region,rectangles); */
|
||||
char __pad_12[4];
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct set_window_region_request
|
||||
{
|
||||
struct request_header __header;
|
||||
|
@ -5809,7 +5796,6 @@ enum request
|
|||
REQ_set_window_text,
|
||||
REQ_get_windows_offset,
|
||||
REQ_get_visible_region,
|
||||
REQ_get_surface_region,
|
||||
REQ_get_window_region,
|
||||
REQ_set_window_region,
|
||||
REQ_get_update_region,
|
||||
|
@ -6101,7 +6087,6 @@ union generic_request
|
|||
struct set_window_text_request set_window_text_request;
|
||||
struct get_windows_offset_request get_windows_offset_request;
|
||||
struct get_visible_region_request get_visible_region_request;
|
||||
struct get_surface_region_request get_surface_region_request;
|
||||
struct get_window_region_request get_window_region_request;
|
||||
struct set_window_region_request set_window_region_request;
|
||||
struct get_update_region_request get_update_region_request;
|
||||
|
@ -6391,7 +6376,6 @@ union generic_reply
|
|||
struct set_window_text_reply set_window_text_reply;
|
||||
struct get_windows_offset_reply get_windows_offset_reply;
|
||||
struct get_visible_region_reply get_visible_region_reply;
|
||||
struct get_surface_region_reply get_surface_region_reply;
|
||||
struct get_window_region_reply get_window_region_reply;
|
||||
struct set_window_region_reply set_window_region_reply;
|
||||
struct get_update_region_reply get_update_region_reply;
|
||||
|
@ -6524,7 +6508,7 @@ union generic_reply
|
|||
|
||||
/* ### protocol_version begin ### */
|
||||
|
||||
#define SERVER_PROTOCOL_VERSION 802
|
||||
#define SERVER_PROTOCOL_VERSION 803
|
||||
|
||||
/* ### protocol_version end ### */
|
||||
|
||||
|
|
|
@ -2592,20 +2592,12 @@ enum coords_relative
|
|||
@END
|
||||
|
||||
|
||||
/* Get the visible surface region of a window */
|
||||
@REQ(get_surface_region)
|
||||
user_handle_t window; /* handle to the window */
|
||||
@REPLY
|
||||
rectangle_t visible_rect; /* window visible rect in screen coords */
|
||||
data_size_t total_size; /* total size of the resulting region */
|
||||
VARARG(region,rectangles); /* list of rectangles for the region (in screen coords) */
|
||||
@END
|
||||
|
||||
|
||||
/* Get the window region */
|
||||
@REQ(get_window_region)
|
||||
user_handle_t window; /* handle to the window */
|
||||
int surface; /* get the visible surface region */
|
||||
@REPLY
|
||||
rectangle_t visible_rect; /* window visible rect in screen coords */
|
||||
data_size_t total_size; /* total size of the resulting region */
|
||||
VARARG(region,rectangles); /* list of rectangles for the region (in window coords) */
|
||||
@END
|
||||
|
|
|
@ -275,7 +275,6 @@ DECL_HANDLER(get_window_text);
|
|||
DECL_HANDLER(set_window_text);
|
||||
DECL_HANDLER(get_windows_offset);
|
||||
DECL_HANDLER(get_visible_region);
|
||||
DECL_HANDLER(get_surface_region);
|
||||
DECL_HANDLER(get_window_region);
|
||||
DECL_HANDLER(set_window_region);
|
||||
DECL_HANDLER(get_update_region);
|
||||
|
@ -566,7 +565,6 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] =
|
|||
(req_handler)req_set_window_text,
|
||||
(req_handler)req_get_windows_offset,
|
||||
(req_handler)req_get_visible_region,
|
||||
(req_handler)req_get_surface_region,
|
||||
(req_handler)req_get_window_region,
|
||||
(req_handler)req_set_window_region,
|
||||
(req_handler)req_get_update_region,
|
||||
|
@ -1655,15 +1653,12 @@ C_ASSERT( FIELD_OFFSET(struct get_visible_region_reply, win_rect) == 28 );
|
|||
C_ASSERT( FIELD_OFFSET(struct get_visible_region_reply, paint_flags) == 44 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_visible_region_reply, total_size) == 48 );
|
||||
C_ASSERT( sizeof(struct get_visible_region_reply) == 56 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_surface_region_request, window) == 12 );
|
||||
C_ASSERT( sizeof(struct get_surface_region_request) == 16 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_surface_region_reply, visible_rect) == 8 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_surface_region_reply, total_size) == 24 );
|
||||
C_ASSERT( sizeof(struct get_surface_region_reply) == 32 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_window_region_request, window) == 12 );
|
||||
C_ASSERT( sizeof(struct get_window_region_request) == 16 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_window_region_reply, total_size) == 8 );
|
||||
C_ASSERT( sizeof(struct get_window_region_reply) == 16 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_window_region_request, surface) == 16 );
|
||||
C_ASSERT( sizeof(struct get_window_region_request) == 24 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_window_region_reply, visible_rect) == 8 );
|
||||
C_ASSERT( FIELD_OFFSET(struct get_window_region_reply, total_size) == 24 );
|
||||
C_ASSERT( sizeof(struct get_window_region_reply) == 32 );
|
||||
C_ASSERT( FIELD_OFFSET(struct set_window_region_request, window) == 12 );
|
||||
C_ASSERT( FIELD_OFFSET(struct set_window_region_request, redraw) == 16 );
|
||||
C_ASSERT( sizeof(struct set_window_region_request) == 24 );
|
||||
|
|
|
@ -3189,26 +3189,16 @@ static void dump_get_visible_region_reply( const struct get_visible_region_reply
|
|||
dump_varargs_rectangles( ", region=", cur_size );
|
||||
}
|
||||
|
||||
static void dump_get_surface_region_request( const struct get_surface_region_request *req )
|
||||
{
|
||||
fprintf( stderr, " window=%08x", req->window );
|
||||
}
|
||||
|
||||
static void dump_get_surface_region_reply( const struct get_surface_region_reply *req )
|
||||
{
|
||||
dump_rectangle( " visible_rect=", &req->visible_rect );
|
||||
fprintf( stderr, ", total_size=%u", req->total_size );
|
||||
dump_varargs_rectangles( ", region=", cur_size );
|
||||
}
|
||||
|
||||
static void dump_get_window_region_request( const struct get_window_region_request *req )
|
||||
{
|
||||
fprintf( stderr, " window=%08x", req->window );
|
||||
fprintf( stderr, ", surface=%d", req->surface );
|
||||
}
|
||||
|
||||
static void dump_get_window_region_reply( const struct get_window_region_reply *req )
|
||||
{
|
||||
fprintf( stderr, " total_size=%u", req->total_size );
|
||||
dump_rectangle( " visible_rect=", &req->visible_rect );
|
||||
fprintf( stderr, ", total_size=%u", req->total_size );
|
||||
dump_varargs_rectangles( ", region=", cur_size );
|
||||
}
|
||||
|
||||
|
@ -4757,7 +4747,6 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = {
|
|||
(dump_func)dump_set_window_text_request,
|
||||
(dump_func)dump_get_windows_offset_request,
|
||||
(dump_func)dump_get_visible_region_request,
|
||||
(dump_func)dump_get_surface_region_request,
|
||||
(dump_func)dump_get_window_region_request,
|
||||
(dump_func)dump_set_window_region_request,
|
||||
(dump_func)dump_get_update_region_request,
|
||||
|
@ -5045,7 +5034,6 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = {
|
|||
NULL,
|
||||
(dump_func)dump_get_windows_offset_reply,
|
||||
(dump_func)dump_get_visible_region_reply,
|
||||
(dump_func)dump_get_surface_region_reply,
|
||||
(dump_func)dump_get_window_region_reply,
|
||||
NULL,
|
||||
(dump_func)dump_get_update_region_reply,
|
||||
|
@ -5333,7 +5321,6 @@ static const char * const req_names[REQ_NB_REQUESTS] = {
|
|||
"set_window_text",
|
||||
"get_windows_offset",
|
||||
"get_visible_region",
|
||||
"get_surface_region",
|
||||
"get_window_region",
|
||||
"set_window_region",
|
||||
"get_update_region",
|
||||
|
|
|
@ -2631,30 +2631,28 @@ DECL_HANDLER(get_visible_region)
|
|||
}
|
||||
|
||||
|
||||
/* get the surface visible region of a window */
|
||||
DECL_HANDLER(get_surface_region)
|
||||
{
|
||||
struct region *region;
|
||||
struct window *win = get_window( req->window );
|
||||
|
||||
if (!win || !is_visible( win )) return;
|
||||
|
||||
if ((region = get_surface_region( win )))
|
||||
{
|
||||
rectangle_t *data = get_region_data_and_free( region, get_reply_max_size(), &reply->total_size );
|
||||
if (data) set_reply_data_ptr( data, reply->total_size );
|
||||
}
|
||||
reply->visible_rect = win->visible_rect;
|
||||
}
|
||||
|
||||
|
||||
/* get the window region */
|
||||
/* get the window regions */
|
||||
DECL_HANDLER(get_window_region)
|
||||
{
|
||||
rectangle_t *data;
|
||||
struct region *region;
|
||||
struct window *win = get_window( req->window );
|
||||
|
||||
if (!win) return;
|
||||
|
||||
reply->visible_rect = win->visible_rect;
|
||||
if (req->surface)
|
||||
{
|
||||
if (!is_visible( win )) return;
|
||||
|
||||
if ((region = get_surface_region( win )))
|
||||
{
|
||||
rectangle_t *data = get_region_data_and_free( region, get_reply_max_size(), &reply->total_size );
|
||||
if (data) set_reply_data_ptr( data, reply->total_size );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!win->win_region) return;
|
||||
|
||||
if (win->ex_style & WS_EX_LAYOUTRTL)
|
||||
|
|
Loading…
Reference in a new issue