server: Merge get_surface_region / get_window_region requests together.

This commit is contained in:
Rémi Bernon 2024-03-17 20:20:09 +01:00 committed by Alexandre Julliard
parent 5481415d43
commit 7cdf20267c
6 changed files with 48 additions and 110 deletions

View file

@ -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, &region )) goto done;
if (get_window_region( hwnd, TRUE, &region, &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 );

View file

@ -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 ### */

View file

@ -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

View file

@ -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 );

View file

@ -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",

View file

@ -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)