winex11: Implement the UpdateClipboard entry point to refresh the cache.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Alexandre Julliard 2016-09-23 14:07:59 +09:00
parent 11c3867349
commit adf96003a5
2 changed files with 22 additions and 53 deletions

View file

@ -95,6 +95,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(clipboard);
#define SELECTION_RETRIES 500 /* wait for .5 seconds */
#define SELECTION_WAIT 1000 /* us */
#define SELECTION_UPDATE_DELAY 2000 /* delay between checks of the X11 selection */
/* Selection masks */
#define S_NOSELECTION 0
#define S_PRIMARY 1
@ -224,10 +226,6 @@ static unsigned int nb_current_x11_formats;
static struct list data_list = LIST_INIT( data_list );
static UINT ClipDataCount = 0;
/*
* Clipboard sequence number
*/
static UINT wSeqNo = 0;
/**************************************************************************
* Internal Clipboard implementation methods
@ -586,39 +584,6 @@ static void X11DRV_CLIPBOARD_FreeData(LPWINE_CLIPDATA lpData)
}
/**************************************************************************
* X11DRV_CLIPBOARD_UpdateCache
*/
static BOOL X11DRV_CLIPBOARD_UpdateCache(void)
{
BOOL bret = TRUE;
if (!selectionAcquired)
{
DWORD seqno = GetClipboardSequenceNumber();
if (!seqno)
{
ERR("Failed to retrieve clipboard information.\n");
bret = FALSE;
}
else if (wSeqNo < seqno)
{
empty_clipboard();
if (X11DRV_CLIPBOARD_QueryAvailableData(thread_init_display()) < 0)
{
ERR("Failed to cache clipboard data owned by another process.\n");
bret = FALSE;
}
wSeqNo = seqno;
}
}
return bret;
}
/**************************************************************************
* X11DRV_CLIPBOARD_RenderFormat
*/
@ -2379,8 +2344,6 @@ void CDECL X11DRV_EmptyClipboard(void)
*/
BOOL CDECL X11DRV_SetClipboardData(UINT wFormat, HANDLE hData, BOOL owner)
{
if (!owner) X11DRV_CLIPBOARD_UpdateCache();
return X11DRV_CLIPBOARD_InsertClipboardData( wFormat, hData );
}
@ -2390,10 +2353,6 @@ BOOL CDECL X11DRV_SetClipboardData(UINT wFormat, HANDLE hData, BOOL owner)
*/
INT CDECL X11DRV_CountClipboardFormats(void)
{
X11DRV_CLIPBOARD_UpdateCache();
TRACE(" count=%d\n", ClipDataCount);
return ClipDataCount;
}
@ -2405,10 +2364,6 @@ UINT CDECL X11DRV_EnumClipboardFormats(UINT wFormat)
{
struct list *ptr = NULL;
TRACE("(%04X)\n", wFormat);
X11DRV_CLIPBOARD_UpdateCache();
if (!wFormat)
{
ptr = list_head( &data_list );
@ -2431,10 +2386,6 @@ BOOL CDECL X11DRV_IsClipboardFormatAvailable(UINT wFormat)
{
BOOL bRet = FALSE;
TRACE("(%04X)\n", wFormat);
X11DRV_CLIPBOARD_UpdateCache();
if (wFormat != 0 && X11DRV_CLIPBOARD_LookupData(wFormat))
bRet = TRUE;
@ -2453,8 +2404,6 @@ HANDLE CDECL X11DRV_GetClipboardData(UINT wFormat)
TRACE("(%04X)\n", wFormat);
X11DRV_CLIPBOARD_UpdateCache();
if ((lpRender = X11DRV_CLIPBOARD_LookupData(wFormat)))
{
if ( !lpRender->hData )
@ -2468,6 +2417,25 @@ HANDLE CDECL X11DRV_GetClipboardData(UINT wFormat)
}
/**************************************************************************
* X11DRV_UpdateClipboard
*/
void CDECL X11DRV_UpdateClipboard(void)
{
static ULONG last_update;
ULONG now;
if (selectionAcquired) return;
now = GetTickCount();
if ((int)(now - last_update) <= SELECTION_UPDATE_DELAY) return;
last_update = now;
empty_clipboard();
if (X11DRV_CLIPBOARD_QueryAvailableData(thread_init_display()) < 0)
ERR("Failed to cache clipboard data owned by another process.\n");
}
/**************************************************************************
* ResetSelectionOwner
*

View file

@ -47,6 +47,7 @@
@ cdecl SetWindowText(long wstr) X11DRV_SetWindowText
@ cdecl ShowWindow(long long ptr long) X11DRV_ShowWindow
@ cdecl SysCommand(long long long) X11DRV_SysCommand
@ cdecl UpdateClipboard() X11DRV_UpdateClipboard
@ cdecl UpdateLayeredWindow(long ptr ptr) X11DRV_UpdateLayeredWindow
@ cdecl WindowMessage(long long long long) X11DRV_WindowMessage
@ cdecl WindowPosChanging(long long long ptr ptr ptr ptr) X11DRV_WindowPosChanging