[PATCH v3] Cygwin: clipboard: Add workaround for ERROR_CLIPBOARD_NOT_OPEN
Takashi Yano <[email protected]> Sat, 13 Jun 2026 11:54:01 +0900
| Newsgroups | gmane.os.cygwin.patches |
|---|---|
| Message-ID | <[email protected]> |
SetClipboardData() and GetClipboardData() occasionally fail with ERROR_CLIPBOARD_NOT_OPEN, even though OpenClipboard() succeeded if NULL HWND is used. Retry until GetClipboardData() does not return ERROR_CLIPBOARD_NOT_OPEN. Addresses: https://cygwin.com/pipermail/cygwin/2026-February/259438.html Signed-off-by: Takashi Yano <[email protected]> Reviewed-by: Mark Geisert <[email protected]> --- v2: Handle ERROR_NOT_FOUND case. Call CloseClipboard() in the loop. v3: Change the timing of CloseClipboard(). winsup/cygwin/fhandler/clipboard.cc | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/winsup/cygwin/fhandler/clipboard.cc b/winsup/cygwin/fhandler/clipboard.cc index 12691c7c1..1273863f4 100644 --- a/winsup/cygwin/fhandler/clipboard.cc +++ b/winsup/cygwin/fhandler/clipboard.cc @@ -25,11 +25,26 @@ details. */ static inline bool open_clipboard () { - const int max_retry = 10; + const int max_retry = 20; for (int i = 0; i < max_retry; i++) { + /* No appropriate HWND exists here. */ if (OpenClipboard (NULL)) - return true; + { + /* SetClipboardData() and GetClipboardData() occasionally + fail with ERROR_CLIPBOARD_NOT_OPEN, even though + OpenClipboard() succeeded if NULL HWND is used. + Retry until GetClipboardData() does not return + ERROR_CLIPBOARD_NOT_OPEN. */ + if (GetClipboardData (CF_UNICODETEXT)) + return true; + DWORD err = GetLastError (); + if (err == ERROR_NOT_FOUND) + return true; + CloseClipboard (); + if (err != ERROR_CLIPBOARD_NOT_OPEN) + return false; + } Sleep (1); } return false; -- 2.51.0