From 2bf890d95f19f0de7e59927d1d1e65ca548af326 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Wed, 14 Sep 2016 15:20:54 +0900 Subject: [PATCH] server: Return the owner window in the release_clipboard request. Signed-off-by: Alexandre Julliard --- dlls/user32/clipboard.c | 10 +++++++--- include/wine/server_protocol.h | 4 ++-- server/clipboard.c | 6 ++++-- server/protocol.def | 1 + server/request.h | 1 + server/trace.c | 1 + 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c index e8ee10d9e90..01fdde7d224 100644 --- a/dlls/user32/clipboard.c +++ b/dlls/user32/clipboard.c @@ -453,18 +453,22 @@ static UINT get_clipboard_flags(void) */ void CLIPBOARD_ReleaseOwner( HWND hwnd ) { - HWND viewer = 0; + HWND viewer = 0, owner = 0; SendMessageW( hwnd, WM_RENDERALLFORMATS, 0, 0 ); SERVER_START_REQ( release_clipboard ) { req->owner = wine_server_user_handle( hwnd ); - if (!wine_server_call( req )) viewer = wine_server_ptr_handle( reply->viewer ); + if (!wine_server_call( req )) + { + viewer = wine_server_ptr_handle( reply->viewer ); + owner = wine_server_ptr_handle( reply->owner ); + } } SERVER_END_REQ; - if (viewer) SendNotifyMessageW( viewer, WM_DRAWCLIPBOARD, (WPARAM)GetClipboardOwner(), 0 ); + if (viewer) SendNotifyMessageW( viewer, WM_DRAWCLIPBOARD, (WPARAM)owner, 0 ); } diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index e8b33b0f727..e71e98be814 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -4536,7 +4536,7 @@ struct release_clipboard_reply { struct reply_header __header; user_handle_t viewer; - char __pad_12[4]; + user_handle_t owner; }; @@ -6365,6 +6365,6 @@ union generic_reply struct terminate_job_reply terminate_job_reply; }; -#define SERVER_PROTOCOL_VERSION 515 +#define SERVER_PROTOCOL_VERSION 516 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/clipboard.c b/server/clipboard.c index 323fdb9787c..a5e0c37dd3c 100644 --- a/server/clipboard.c +++ b/server/clipboard.c @@ -353,9 +353,11 @@ DECL_HANDLER(release_clipboard) if (!(owner = get_valid_window_handle( req->owner ))) return; if (clipboard->owner_win == owner) + { reply->viewer = release_clipboard( clipboard ); - else - set_error( STATUS_INVALID_OWNER ); + reply->owner = clipboard->owner_win; + } + else set_error( STATUS_INVALID_OWNER ); } diff --git a/server/protocol.def b/server/protocol.def index 86b209e2c88..3a4f9c16e49 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3205,6 +3205,7 @@ enum caret_state user_handle_t owner; /* clipboard owner to release */ @REPLY user_handle_t viewer; /* first clipboard viewer */ + user_handle_t owner; /* current clipboard owner */ @END diff --git a/server/request.h b/server/request.h index 58aebbc845f..29c0ccf25d6 100644 --- a/server/request.h +++ b/server/request.h @@ -2046,6 +2046,7 @@ C_ASSERT( sizeof(struct empty_clipboard_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct release_clipboard_request, owner) == 12 ); C_ASSERT( sizeof(struct release_clipboard_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct release_clipboard_reply, viewer) == 8 ); +C_ASSERT( FIELD_OFFSET(struct release_clipboard_reply, owner) == 12 ); C_ASSERT( sizeof(struct release_clipboard_reply) == 16 ); C_ASSERT( sizeof(struct get_clipboard_info_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_clipboard_info_reply, window) == 8 ); diff --git a/server/trace.c b/server/trace.c index d99c4b20c5f..db52b0af139 100644 --- a/server/trace.c +++ b/server/trace.c @@ -3782,6 +3782,7 @@ static void dump_release_clipboard_request( const struct release_clipboard_reque static void dump_release_clipboard_reply( const struct release_clipboard_reply *req ) { fprintf( stderr, " viewer=%08x", req->viewer ); + fprintf( stderr, ", owner=%08x", req->owner ); } static void dump_get_clipboard_info_request( const struct get_clipboard_info_request *req ) -- 2.11.4.GIT