From 79d2e0a9be65b0219247d873690fc4439c8ba4aa Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Tue, 23 Aug 2016 16:29:00 +0900 Subject: [PATCH] server: Add a request to return clipboard information. Signed-off-by: Alexandre Julliard --- dlls/user32/clipboard.c | 18 +++++++----------- include/wine/server_protocol.h | 21 ++++++++++++++++++++- server/clipboard.c | 14 ++++++++++++++ server/protocol.def | 10 ++++++++++ server/request.h | 8 ++++++++ server/trace.c | 15 +++++++++++++++ 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c index 454d035ba9e..6292076eb0f 100644 --- a/dlls/user32/clipboard.c +++ b/dlls/user32/clipboard.c @@ -227,10 +227,9 @@ HWND WINAPI GetClipboardOwner(void) { HWND hWndOwner = 0; - SERVER_START_REQ( set_clipboard_info ) + SERVER_START_REQ( get_clipboard_info ) { - req->flags = 0; - if (!wine_server_call_err( req )) hWndOwner = wine_server_ptr_handle( reply->old_owner ); + if (!wine_server_call_err( req )) hWndOwner = wine_server_ptr_handle( reply->owner ); } SERVER_END_REQ; @@ -247,10 +246,9 @@ HWND WINAPI GetOpenClipboardWindow(void) { HWND hWndOpen = 0; - SERVER_START_REQ( set_clipboard_info ) + SERVER_START_REQ( get_clipboard_info ) { - req->flags = 0; - if (!wine_server_call_err( req )) hWndOpen = wine_server_ptr_handle( reply->old_clipboard ); + if (!wine_server_call_err( req )) hWndOpen = wine_server_ptr_handle( reply->window ); } SERVER_END_REQ; @@ -292,10 +290,9 @@ HWND WINAPI GetClipboardViewer(void) { HWND hWndViewer = 0; - SERVER_START_REQ( set_clipboard_info ) + SERVER_START_REQ( get_clipboard_info ) { - req->flags = 0; - if (!wine_server_call_err( req )) hWndViewer = wine_server_ptr_handle( reply->old_viewer ); + if (!wine_server_call_err( req )) hWndViewer = wine_server_ptr_handle( reply->viewer ); } SERVER_END_REQ; @@ -461,9 +458,8 @@ DWORD WINAPI GetClipboardSequenceNumber(VOID) { DWORD seqno = 0; - SERVER_START_REQ( set_clipboard_info ) + SERVER_START_REQ( get_clipboard_info ) { - req->flags = 0; if (!wine_server_call_err( req )) seqno = reply->seqno; } SERVER_END_REQ; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index c865bb8c1c3..2b17ef62ced 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4526,6 +4526,22 @@ struct empty_clipboard_reply +struct get_clipboard_info_request +{ + struct request_header __header; + char __pad_12[4]; +}; +struct get_clipboard_info_reply +{ + struct reply_header __header; + user_handle_t window; + user_handle_t owner; + user_handle_t viewer; + unsigned int seqno; +}; + + + struct set_clipboard_viewer_request { struct request_header __header; @@ -5674,6 +5690,7 @@ enum request REQ_close_clipboard, REQ_set_clipboard_info, REQ_empty_clipboard, + REQ_get_clipboard_info, REQ_set_clipboard_viewer, REQ_open_token, REQ_set_global_windows, @@ -5957,6 +5974,7 @@ union generic_request struct close_clipboard_request close_clipboard_request; struct set_clipboard_info_request set_clipboard_info_request; struct empty_clipboard_request empty_clipboard_request; + struct get_clipboard_info_request get_clipboard_info_request; struct set_clipboard_viewer_request set_clipboard_viewer_request; struct open_token_request open_token_request; struct set_global_windows_request set_global_windows_request; @@ -6238,6 +6256,7 @@ union generic_reply struct close_clipboard_reply close_clipboard_reply; struct set_clipboard_info_reply set_clipboard_info_reply; struct empty_clipboard_reply empty_clipboard_reply; + struct get_clipboard_info_reply get_clipboard_info_reply; struct set_clipboard_viewer_reply set_clipboard_viewer_reply; struct open_token_reply open_token_reply; struct set_global_windows_reply set_global_windows_reply; @@ -6298,6 +6317,6 @@ union generic_reply struct terminate_job_reply terminate_job_reply; }; -#define SERVER_PROTOCOL_VERSION 511 +#define SERVER_PROTOCOL_VERSION 512 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/clipboard.c b/server/clipboard.c index c906e702324..5c4f6000f16 100644 --- a/server/clipboard.c +++ b/server/clipboard.c @@ -248,6 +248,20 @@ DECL_HANDLER(empty_clipboard) } +/* Get clipboard information */ +DECL_HANDLER(get_clipboard_info) +{ + struct clipboard *clipboard = get_process_clipboard(); + + if (!clipboard) return; + + reply->window = clipboard->open_win; + reply->owner = clipboard->owner_win; + reply->viewer = clipboard->viewer; + reply->seqno = get_seqno( clipboard ); +} + + /* set the clipboard viewer window */ DECL_HANDLER(set_clipboard_viewer) { diff --git a/server/protocol.def b/server/protocol.def index 56145469c8a..5b207847d4b 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3199,6 +3199,16 @@ enum caret_state @END +/* Get clipboard information */ +@REQ(get_clipboard_info) +@REPLY + user_handle_t window; /* clipboard window */ + user_handle_t owner; /* clipboard owner */ + user_handle_t viewer; /* clipboard viewer */ + unsigned int seqno; /* current sequence number */ +@END + + /* Set the clipboard viewer window */ @REQ(set_clipboard_viewer) user_handle_t viewer; /* clipboard viewer */ diff --git a/server/request.h b/server/request.h index b4f25a7513d..c5236f520f6 100644 --- a/server/request.h +++ b/server/request.h @@ -330,6 +330,7 @@ DECL_HANDLER(open_clipboard); DECL_HANDLER(close_clipboard); DECL_HANDLER(set_clipboard_info); DECL_HANDLER(empty_clipboard); +DECL_HANDLER(get_clipboard_info); DECL_HANDLER(set_clipboard_viewer); DECL_HANDLER(open_token); DECL_HANDLER(set_global_windows); @@ -612,6 +613,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_close_clipboard, (req_handler)req_set_clipboard_info, (req_handler)req_empty_clipboard, + (req_handler)req_get_clipboard_info, (req_handler)req_set_clipboard_viewer, (req_handler)req_open_token, (req_handler)req_set_global_windows, @@ -2035,6 +2037,12 @@ C_ASSERT( FIELD_OFFSET(struct set_clipboard_info_reply, old_viewer) == 20 ); C_ASSERT( FIELD_OFFSET(struct set_clipboard_info_reply, seqno) == 24 ); C_ASSERT( sizeof(struct set_clipboard_info_reply) == 32 ); C_ASSERT( sizeof(struct empty_clipboard_request) == 16 ); +C_ASSERT( sizeof(struct get_clipboard_info_request) == 16 ); +C_ASSERT( FIELD_OFFSET(struct get_clipboard_info_reply, window) == 8 ); +C_ASSERT( FIELD_OFFSET(struct get_clipboard_info_reply, owner) == 12 ); +C_ASSERT( FIELD_OFFSET(struct get_clipboard_info_reply, viewer) == 16 ); +C_ASSERT( FIELD_OFFSET(struct get_clipboard_info_reply, seqno) == 20 ); +C_ASSERT( sizeof(struct get_clipboard_info_reply) == 24 ); C_ASSERT( FIELD_OFFSET(struct set_clipboard_viewer_request, viewer) == 12 ); C_ASSERT( FIELD_OFFSET(struct set_clipboard_viewer_request, previous) == 16 ); C_ASSERT( sizeof(struct set_clipboard_viewer_request) == 24 ); diff --git a/server/trace.c b/server/trace.c index b3b6793aaae..6c9518eaaa3 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3774,6 +3774,18 @@ static void dump_empty_clipboard_request( const struct empty_clipboard_request * { } +static void dump_get_clipboard_info_request( const struct get_clipboard_info_request *req ) +{ +} + +static void dump_get_clipboard_info_reply( const struct get_clipboard_info_reply *req ) +{ + fprintf( stderr, " window=%08x", req->window ); + fprintf( stderr, ", owner=%08x", req->owner ); + fprintf( stderr, ", viewer=%08x", req->viewer ); + fprintf( stderr, ", seqno=%08x", req->seqno ); +} + static void dump_set_clipboard_viewer_request( const struct set_clipboard_viewer_request *req ) { fprintf( stderr, " viewer=%08x", req->viewer ); @@ -4613,6 +4625,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_close_clipboard_request, (dump_func)dump_set_clipboard_info_request, (dump_func)dump_empty_clipboard_request, + (dump_func)dump_get_clipboard_info_request, (dump_func)dump_set_clipboard_viewer_request, (dump_func)dump_open_token_request, (dump_func)dump_set_global_windows_request, @@ -4892,6 +4905,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_close_clipboard_reply, (dump_func)dump_set_clipboard_info_reply, NULL, + (dump_func)dump_get_clipboard_info_reply, (dump_func)dump_set_clipboard_viewer_reply, (dump_func)dump_open_token_reply, (dump_func)dump_set_global_windows_reply, @@ -5171,6 +5185,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "close_clipboard", "set_clipboard_info", "empty_clipboard", + "get_clipboard_info", "set_clipboard_viewer", "open_token", "set_global_windows",