Alexandre Julliard : server: Return the owner window in the release_clipboard request.

Alexandre Julliard julliard at winehq.org
Wed Sep 14 10:28:51 CDT 2016


Module: wine
Branch: master
Commit: 2bf890d95f19f0de7e59927d1d1e65ca548af326
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=2bf890d95f19f0de7e59927d1d1e65ca548af326

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Sep 14 15:20:54 2016 +0900

server: Return the owner window in the release_clipboard request.

Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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 e8ee10d..01fdde7 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 e8b33b0..e71e98b 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 323fdb9..a5e0c37 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 86b209e..3a4f9c1 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 58aebbc..29c0ccf 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 d99c4b2..db52b0a 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 )




More information about the wine-cvs mailing list