From 11c3867349be49768f1364453fff8b7e4f912098 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 23 Sep 2016 14:07:08 +0900 Subject: [PATCH] user32: Add an UpdateClipboard entry point to allow the driver to refresh the clipboard before it's open. Signed-off-by: Alexandre Julliard --- 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 1693aaecb56..43729e618e3 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 32acf28ba48..1745b5016a7 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 c8b283a0d07..3b9b200cb88 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);