Module: wine Branch: master Commit: 25d9fc3ecc0bd283437e5d52e3c4ba3b7ed1b303 URL: http://source.winehq.org/git/wine.git/?a=commit;h=25d9fc3ecc0bd283437e5d52e3...
Author: Alexandre Julliard julliard@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 );