static void CliprdrStream_Delete(CliprdrStream* instance);
+static BOOL try_open_clipboard(HWND hwnd)
+{
+ size_t x;
+ for (x = 0; x < 10; x++)
+ {
+ if (OpenClipboard(hwnd))
+ return TRUE;
+ Sleep(10);
+ }
+ return FALSE;
+}
+
/**
* IStream
*/
if (!clipboard->legacyApi)
return clipboard->GetUpdatedClipboardFormats(lpuiFormats, cFormats, pcFormatsOut);
- clipboardOpen = OpenClipboard(clipboard->hwnd);
+ clipboardOpen = try_open_clipboard(clipboard->hwnd);
if (!clipboardOpen)
- return FALSE;
+ {
+ *pcFormatsOut = 0;
+ return TRUE; /* Other app holding clipboard */
+ }
while (index < cFormats)
{
static UINT cliprdr_send_format_list(wfClipboard* clipboard)
{
UINT rc;
- int count;
+ int count = 0;
UINT32 index;
- UINT32 numFormats;
+ UINT32 numFormats = 0;
UINT32 formatId = 0;
char formatName[1024];
- CLIPRDR_FORMAT* formats;
+ CLIPRDR_FORMAT* formats = NULL;
CLIPRDR_FORMAT_LIST formatList;
if (!clipboard)
ZeroMemory(&formatList, sizeof(CLIPRDR_FORMAT_LIST));
- if (!OpenClipboard(clipboard->hwnd))
- return ERROR_INTERNAL_ERROR;
-
- count = CountClipboardFormats();
- numFormats = (UINT32)count;
- formats = (CLIPRDR_FORMAT*)calloc(numFormats, sizeof(CLIPRDR_FORMAT));
-
- if (!formats)
+ /* Ignore if other app is holding clipboard */
+ if (try_open_clipboard(clipboard->hwnd))
{
- CloseClipboard();
- return CHANNEL_RC_NO_MEMORY;
- }
+ count = CountClipboardFormats();
+ numFormats = (UINT32)count;
+ formats = (CLIPRDR_FORMAT*)calloc(numFormats, sizeof(CLIPRDR_FORMAT));
- index = 0;
+ if (!formats)
+ {
+ CloseClipboard();
+ return CHANNEL_RC_NO_MEMORY;
+ }
- if (IsClipboardFormatAvailable(CF_HDROP))
- {
- formats[index++].formatId = RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW);
- formats[index++].formatId = RegisterClipboardFormat(CFSTR_FILECONTENTS);
- }
- else
- {
- while (formatId = EnumClipboardFormats(formatId))
- formats[index++].formatId = formatId;
- }
+ index = 0;
- numFormats = index;
+ if (IsClipboardFormatAvailable(CF_HDROP))
+ {
+ formats[index++].formatId = RegisterClipboardFormat(CFSTR_FILEDESCRIPTORW);
+ formats[index++].formatId = RegisterClipboardFormat(CFSTR_FILECONTENTS);
+ }
+ else
+ {
+ while (formatId = EnumClipboardFormats(formatId))
+ formats[index++].formatId = formatId;
+ }
- if (!CloseClipboard())
- {
- free(formats);
- return ERROR_INTERNAL_ERROR;
- }
+ numFormats = index;
- for (index = 0; index < numFormats; index++)
- {
- if (GetClipboardFormatNameA(formats[index].formatId, formatName, sizeof(formatName)))
+ if (!CloseClipboard())
+ {
+ free(formats);
+ return ERROR_INTERNAL_ERROR;
+ }
+
+ for (index = 0; index < numFormats; index++)
{
- formats[index].formatName = _strdup(formatName);
+ if (GetClipboardFormatNameA(formats[index].formatId, formatName, sizeof(formatName)))
+ {
+ formats[index].formatName = _strdup(formatName);
+ }
}
}
DEBUG_CLIPRDR("info: WM_RENDERALLFORMATS");
/* discard all contexts in clipboard */
- if (!OpenClipboard(clipboard->hwnd))
+ if (!try_open_clipboard(clipboard->hwnd))
{
DEBUG_CLIPRDR("OpenClipboard failed with 0x%x", GetLastError());
break;
}
else
{
- if (!OpenClipboard(clipboard->hwnd))
- return ERROR_INTERNAL_ERROR;
+ if (!try_open_clipboard(clipboard->hwnd))
+ return CHANNEL_RC_OK; /* Ignore, other app holding clipboard */
if (EmptyClipboard())
{
}
else
{
- if (!OpenClipboard(clipboard->hwnd))
- return ERROR_INTERNAL_ERROR;
+ /* Ignore if other app is holding the clipboard */
+ if (try_open_clipboard(clipboard->hwnd))
+ {
+ hClipdata = GetClipboardData(requestedFormatId);
- hClipdata = GetClipboardData(requestedFormatId);
+ if (!hClipdata)
+ {
+ CloseClipboard();
+ return ERROR_INTERNAL_ERROR;
+ }
- if (!hClipdata)
- {
+ globlemem = (char*)GlobalLock(hClipdata);
+ size = (int)GlobalSize(hClipdata);
+ buff = malloc(size);
+ CopyMemory(buff, globlemem, size);
+ GlobalUnlock(hClipdata);
CloseClipboard();
- return ERROR_INTERNAL_ERROR;
}
-
- globlemem = (char*)GlobalLock(hClipdata);
- size = (int)GlobalSize(hClipdata);
- buff = malloc(size);
- CopyMemory(buff, globlemem, size);
- GlobalUnlock(hClipdata);
- CloseClipboard();
}
response.msgFlags = CB_RESPONSE_OK;