Alexandre Julliard : server: Check for the current owner window on the server side for releases.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Jun 3 09:43:08 CDT 2015


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Jun  3 18:46:01 2015 +0900

server: Check for the current owner window on the server side for releases.

---

 dlls/user32/clipboard.c    | 17 +++--------------
 dlls/user32/user_private.h |  2 +-
 dlls/user32/win.c          |  3 +--
 server/clipboard.c         |  9 +++++----
 4 files changed, 10 insertions(+), 21 deletions(-)

diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c
index c55b830..cd3fdd75 100644
--- a/dlls/user32/clipboard.c
+++ b/dlls/user32/clipboard.c
@@ -121,26 +121,15 @@ static BOOL CLIPBOARD_GetClipboardInfo(LPCLIPBOARDINFO cbInfo)
 /**************************************************************************
  *	CLIPBOARD_ReleaseOwner
  */
-BOOL CLIPBOARD_ReleaseOwner(void)
+void CLIPBOARD_ReleaseOwner( HWND hwnd )
 {
-    BOOL bRet = FALSE;
-
     SERVER_START_REQ( set_clipboard_info )
     {
         req->flags = SET_CB_RELOWNER | SET_CB_SEQNO;
-
-        if (wine_server_call_err( req ))
-        {
-            ERR("Failed to set clipboard.\n");
-        }
-        else
-        {
-            bRet = TRUE;
-        }
+        req->owner = wine_server_user_handle( hwnd );
+        wine_server_call( req );
     }
     SERVER_END_REQ;
-
-    return bRet;
 }
 
 
diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h
index e0c1b43..1fbecb9 100644
--- a/dlls/user32/user_private.h
+++ b/dlls/user32/user_private.h
@@ -222,7 +222,7 @@ extern HMODULE user32_module DECLSPEC_HIDDEN;
 struct dce;
 struct tagWND;
 
-extern BOOL CLIPBOARD_ReleaseOwner(void) DECLSPEC_HIDDEN;
+extern void CLIPBOARD_ReleaseOwner( HWND hwnd ) DECLSPEC_HIDDEN;
 extern BOOL FOCUS_MouseActivate( HWND hwnd ) DECLSPEC_HIDDEN;
 extern BOOL set_capture_window( HWND hwnd, UINT gui_flags, HWND *prev_ret ) DECLSPEC_HIDDEN;
 extern void free_dce( struct dce *dce, HWND hwnd ) DECLSPEC_HIDDEN;
diff --git a/dlls/user32/win.c b/dlls/user32/win.c
index 7090cb0..7a3f484 100644
--- a/dlls/user32/win.c
+++ b/dlls/user32/win.c
@@ -1875,8 +1875,7 @@ BOOL WINAPI DestroyWindow( HWND hwnd )
     WIN_SendDestroyMsg( hwnd );
     if (!IsWindow( hwnd )) return TRUE;
 
-    if (GetClipboardOwner() == hwnd)
-        CLIPBOARD_ReleaseOwner();
+    CLIPBOARD_ReleaseOwner( hwnd );
 
       /* Destroy the window storage */
 
diff --git a/server/clipboard.c b/server/clipboard.c
index 7a77ed2..9acee98 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -172,11 +172,12 @@ static int set_clipboard_owner( struct clipboard *clipboard, user_handle_t win )
     return 1;
 }
 
-static int release_clipboard_owner( struct clipboard *clipboard )
+static int release_clipboard_owner( struct clipboard *clipboard, user_handle_t win )
 {
-    if (clipboard->open_thread && clipboard->open_thread->process != current->process)
+    if ((clipboard->open_thread && clipboard->open_thread->process != current->process) ||
+        (win && clipboard->owner_win != get_user_full_handle( win )))
     {
-        set_error(STATUS_WAS_LOCKED);
+        set_win32_error( ERROR_CLIPBOARD_NOT_OPEN );
         return 0;
     }
     clipboard->owner_win = 0;
@@ -221,7 +222,7 @@ DECL_HANDLER(set_clipboard_info)
     }
     else if (req->flags & SET_CB_RELOWNER)
     {
-        if (!release_clipboard_owner( clipboard )) return;
+        if (!release_clipboard_owner( clipboard, req->owner )) return;
     }
 
     if (req->flags & SET_CB_VIEWER) clipboard->viewer = get_user_full_handle( req->viewer );




More information about the wine-cvs mailing list