diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 5eeec43c5bd..25ba8813dd6 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -140,6 +140,15 @@ typedef struct } property_data_t; +typedef struct +{ + int left; + int top; + int right; + int bottom; +} rectangle_t; + + @@ -1652,6 +1661,36 @@ struct get_window_tree_request }; +struct set_window_rectangles_request +{ + struct request_header __header; + user_handle_t handle; + rectangle_t window; + rectangle_t client; +}; + + + +struct get_window_rectangles_request +{ + struct request_header __header; + user_handle_t handle; + rectangle_t window; + rectangle_t client; +}; + + + +struct get_windows_offset_request +{ + struct request_header __header; + user_handle_t from; + user_handle_t to; + int x; + int y; +}; + + struct set_window_property_request { @@ -1823,6 +1862,9 @@ enum request REQ_get_window_parents, REQ_get_window_children, REQ_get_window_tree, + REQ_set_window_rectangles, + REQ_get_window_rectangles, + REQ_get_windows_offset, REQ_set_window_property, REQ_remove_window_property, REQ_get_window_property, @@ -1963,12 +2005,15 @@ union generic_request struct get_window_parents_request get_window_parents; struct get_window_children_request get_window_children; struct get_window_tree_request get_window_tree; + struct set_window_rectangles_request set_window_rectangles; + struct get_window_rectangles_request get_window_rectangles; + struct get_windows_offset_request get_windows_offset; struct set_window_property_request set_window_property; struct remove_window_property_request remove_window_property; struct get_window_property_request get_window_property; struct get_window_properties_request get_window_properties; }; -#define SERVER_PROTOCOL_VERSION 59 +#define SERVER_PROTOCOL_VERSION 60 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 95bc13a9b4e..78955d9197f 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -141,6 +141,15 @@ typedef struct handle_t handle; /* handle stored in property */ } property_data_t; +/* structure to specify window rectangles */ +typedef struct +{ + int left; + int top; + int right; + int bottom; +} rectangle_t; + /****************************************************************/ /* Request declarations */ @@ -1478,6 +1487,32 @@ enum message_type user_handle_t last_child; /* last child */ @END +/* Set the window and client rectangles of a window */ +@REQ(set_window_rectangles) + user_handle_t handle; /* handle to the window */ + rectangle_t window; /* window rectangle */ + rectangle_t client; /* client rectangle */ +@END + + +/* Get the window and client rectangles of a window */ +@REQ(get_window_rectangles) + user_handle_t handle; /* handle to the window */ +@REPLY + rectangle_t window; /* window rectangle */ + rectangle_t client; /* client rectangle */ +@END + + +/* Get the coordinates offset between two windows */ +@REQ(get_windows_offset) + user_handle_t from; /* handle to the first window */ + user_handle_t to; /* handle to the second window */ +@REPLY + int x; /* x coordinate offset */ + int y; /* y coordinate offset */ +@END + /* Set a window property */ @REQ(set_window_property) diff --git a/server/request.h b/server/request.h index 8939854b57e..6202c002e27 100644 --- a/server/request.h +++ b/server/request.h @@ -194,6 +194,9 @@ DECL_HANDLER(get_window_info); DECL_HANDLER(get_window_parents); DECL_HANDLER(get_window_children); DECL_HANDLER(get_window_tree); +DECL_HANDLER(set_window_rectangles); +DECL_HANDLER(get_window_rectangles); +DECL_HANDLER(get_windows_offset); DECL_HANDLER(set_window_property); DECL_HANDLER(remove_window_property); DECL_HANDLER(get_window_property); @@ -333,6 +336,9 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_get_window_parents, (req_handler)req_get_window_children, (req_handler)req_get_window_tree, + (req_handler)req_set_window_rectangles, + (req_handler)req_get_window_rectangles, + (req_handler)req_get_windows_offset, (req_handler)req_set_window_property, (req_handler)req_remove_window_property, (req_handler)req_get_window_property, diff --git a/server/trace.c b/server/trace.c index f4ec2d7d7aa..1d3330ed398 100644 --- a/server/trace.c +++ b/server/trace.c @@ -43,6 +43,12 @@ static void dump_uints( const int *ptr, int len ) fputc( '}', stderr ); } +static void dump_rectangle( const void *req, const rectangle_t *rect ) +{ + fprintf( stderr, "{%d,%d;%d,%d}", + rect->left, rect->top, rect->right, rect->bottom ); +} + static void dump_context( const CONTEXT *context ) { #ifdef __i386__ @@ -1761,6 +1767,42 @@ static void dump_get_window_tree_reply( const struct get_window_tree_request *re fprintf( stderr, " last_child=%08x", req->last_child ); } +static void dump_set_window_rectangles_request( const struct set_window_rectangles_request *req ) +{ + fprintf( stderr, " handle=%08x,", req->handle ); + fprintf( stderr, " window=" ); + dump_rectangle( req, &req->window ); + fprintf( stderr, "," ); + fprintf( stderr, " client=" ); + dump_rectangle( req, &req->client ); +} + +static void dump_get_window_rectangles_request( const struct get_window_rectangles_request *req ) +{ + fprintf( stderr, " handle=%08x", req->handle ); +} + +static void dump_get_window_rectangles_reply( const struct get_window_rectangles_request *req ) +{ + fprintf( stderr, " window=" ); + dump_rectangle( req, &req->window ); + fprintf( stderr, "," ); + fprintf( stderr, " client=" ); + dump_rectangle( req, &req->client ); +} + +static void dump_get_windows_offset_request( const struct get_windows_offset_request *req ) +{ + fprintf( stderr, " from=%08x,", req->from ); + fprintf( stderr, " to=%08x", req->to ); +} + +static void dump_get_windows_offset_reply( const struct get_windows_offset_request *req ) +{ + fprintf( stderr, " x=%d,", req->x ); + fprintf( stderr, " y=%d", req->y ); +} + static void dump_set_window_property_request( const struct set_window_property_request *req ) { fprintf( stderr, " window=%08x,", req->window ); @@ -1932,6 +1974,9 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_get_window_parents_request, (dump_func)dump_get_window_children_request, (dump_func)dump_get_window_tree_request, + (dump_func)dump_set_window_rectangles_request, + (dump_func)dump_get_window_rectangles_request, + (dump_func)dump_get_windows_offset_request, (dump_func)dump_set_window_property_request, (dump_func)dump_remove_window_property_request, (dump_func)dump_get_window_property_request, @@ -2069,6 +2114,9 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_get_window_children_reply, (dump_func)dump_get_window_tree_reply, (dump_func)0, + (dump_func)dump_get_window_rectangles_reply, + (dump_func)dump_get_windows_offset_reply, + (dump_func)0, (dump_func)dump_remove_window_property_reply, (dump_func)dump_get_window_property_reply, (dump_func)dump_get_window_properties_reply, @@ -2204,6 +2252,9 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "get_window_parents", "get_window_children", "get_window_tree", + "set_window_rectangles", + "get_window_rectangles", + "get_windows_offset", "set_window_property", "remove_window_property", "get_window_property", diff --git a/server/window.c b/server/window.c index ff9ba82db5d..1559d44928c 100644 --- a/server/window.c +++ b/server/window.c @@ -40,6 +40,8 @@ struct window user_handle_t handle; /* full handle for this window */ struct thread *thread; /* thread owning the window */ atom_t atom; /* class atom */ + rectangle_t window_rect; /* window rectangle */ + rectangle_t client_rect; /* client rectangle */ int prop_inuse; /* number of in-use window properties */ int prop_alloc; /* number of allocated window properties */ struct property *properties; /* window properties array */ @@ -476,6 +478,61 @@ DECL_HANDLER(get_window_tree) } +/* set the window and client rectangles of a window */ +DECL_HANDLER(set_window_rectangles) +{ + struct window *win = get_window( req->handle ); + + if (win) + { + win->window_rect = req->window; + win->client_rect = req->client; + } +} + + +/* get the window and client rectangles of a window */ +DECL_HANDLER(get_window_rectangles) +{ + struct window *win = get_window( req->handle ); + + if (win) + { + req->window = win->window_rect; + req->client = win->client_rect; + } +} + + +/* get the coordinates offset between two windows */ +DECL_HANDLER(get_windows_offset) +{ + struct window *win; + + req->x = req->y = 0; + if (req->from) + { + if (!(win = get_window( req->from ))) return; + while (win) + { + req->x += win->client_rect.left; + req->y += win->client_rect.top; + win = win->parent; + } + } + if (req->to) + { + if (!(win = get_window( req->to ))) return; + while (win) + { + req->x -= win->client_rect.left; + req->y -= win->client_rect.top; + win = win->parent; + } + } +} + + /* set a window property */ DECL_HANDLER(set_window_property) { diff --git a/tools/make_requests b/tools/make_requests index ade770fb556..3e2c536635e 100755 --- a/tools/make_requests +++ b/tools/make_requests @@ -18,6 +18,7 @@ "handle_t" => "%d", "atom_t" => "%04x", "user_handle_t" => "%08x", + "rectangle_t" => "&dump_rectangle", ); my @requests = ();