Module: wine Branch: master Commit: 11c3867349be49768f1364453fff8b7e4f912098 URL: http://source.winehq.org/git/wine.git/?a=commit;h=11c3867349be49768f1364453f...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Sep 23 14:07:08 2016 +0900
user32: Add an UpdateClipboard entry point to allow the driver to refresh the clipboard before it's open.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/clipboard.c | 14 ++++++++++++-- dlls/user32/driver.c | 12 ++++++++++++ dlls/user32/user_private.h | 1 + 3 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/dlls/user32/clipboard.c b/dlls/user32/clipboard.c index 1693aae..43729e6 100644 --- a/dlls/user32/clipboard.c +++ b/dlls/user32/clipboard.c @@ -523,6 +523,8 @@ BOOL WINAPI OpenClipboard( HWND hwnd )
TRACE( "%p\n", hwnd );
+ USER_Driver->pUpdateClipboard(); + SERVER_START_REQ( open_clipboard ) { req->window = wine_server_user_handle( hwnd ); @@ -759,7 +761,11 @@ HANDLE WINAPI SetClipboardData( UINT format, HANDLE data ) */ INT WINAPI CountClipboardFormats(void) { - INT count = USER_Driver->pCountClipboardFormats(); + INT count; + + USER_Driver->pUpdateClipboard(); + + count = USER_Driver->pCountClipboardFormats(); TRACE("returning %d\n", count); return count; } @@ -790,7 +796,11 @@ UINT WINAPI EnumClipboardFormats( UINT format ) */ BOOL WINAPI IsClipboardFormatAvailable( UINT format ) { - BOOL ret = USER_Driver->pIsClipboardFormatAvailable( format ); + BOOL ret; + + USER_Driver->pUpdateClipboard(); + + ret = USER_Driver->pIsClipboardFormatAvailable( format ); TRACE( "%s -> %u\n", debugstr_format( format ), ret ); return ret; } diff --git a/dlls/user32/driver.c b/dlls/user32/driver.c index 32acf28..1745b50 100644 --- a/dlls/user32/driver.c +++ b/dlls/user32/driver.c @@ -128,6 +128,7 @@ static const USER_DRIVER *load_driver(void) GET_USER_FUNC(EnumClipboardFormats); GET_USER_FUNC(IsClipboardFormatAvailable); GET_USER_FUNC(EndClipboardUpdate); + GET_USER_FUNC(UpdateClipboard); GET_USER_FUNC(ChangeDisplaySettingsEx); GET_USER_FUNC(EnumDisplayMonitors); GET_USER_FUNC(EnumDisplaySettingsEx); @@ -369,6 +370,10 @@ static BOOL CDECL nulldrv_SetClipboardData( UINT format, HANDLE handle, BOOL own return FALSE; }
+static void CDECL nulldrv_UpdateClipboard(void) +{ +} + static LONG CDECL nulldrv_ChangeDisplaySettingsEx( LPCWSTR name, LPDEVMODEW mode, HWND hwnd, DWORD flags, LPVOID lparam ) { @@ -548,6 +553,7 @@ static USER_DRIVER null_driver = nulldrv_GetClipboardData, nulldrv_IsClipboardFormatAvailable, nulldrv_SetClipboardData, + nulldrv_UpdateClipboard, /* display modes */ nulldrv_ChangeDisplaySettingsEx, nulldrv_EnumDisplayMonitors, @@ -716,6 +722,11 @@ static BOOL CDECL loaderdrv_SetClipboardData( UINT format, HANDLE handle, BOOL o return load_driver()->pSetClipboardData( format, handle, owner ); }
+static void CDECL loaderdrv_UpdateClipboard(void) +{ + load_driver()->pUpdateClipboard(); +} + static LONG CDECL loaderdrv_ChangeDisplaySettingsEx( LPCWSTR name, LPDEVMODEW mode, HWND hwnd, DWORD flags, LPVOID lparam ) { @@ -805,6 +816,7 @@ static USER_DRIVER lazy_load_driver = loaderdrv_GetClipboardData, loaderdrv_IsClipboardFormatAvailable, loaderdrv_SetClipboardData, + loaderdrv_UpdateClipboard, /* display modes */ loaderdrv_ChangeDisplaySettingsEx, loaderdrv_EnumDisplayMonitors, diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index c8b283a..3b9b200 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -87,6 +87,7 @@ typedef struct tagUSER_DRIVER { HANDLE (CDECL *pGetClipboardData)(UINT); /* Get specified selection data */ BOOL (CDECL *pIsClipboardFormatAvailable)(UINT); /* Check if specified format is available */ BOOL (CDECL *pSetClipboardData)(UINT, HANDLE, BOOL); /* Set specified selection data */ + void (CDECL *pUpdateClipboard)(void); /* display modes */ LONG (CDECL *pChangeDisplaySettingsEx)(LPCWSTR,LPDEVMODEW,HWND,DWORD,LPVOID); BOOL (CDECL *pEnumDisplayMonitors)(HDC,LPRECT,MONITORENUMPROC,LPARAM);