Re: [PATCH v3] Cygwin: clipboard: Add workaround for ERROR_CLIPBOARD_NOT_OPEN
Takashi Yano <[email protected]> Sat, 13 Jun 2026 16:33:11 +0900
| Newsgroups | gmane.os.cygwin.patches |
|---|---|
| Message-ID | <[email protected]> |
On Fri, 12 Jun 2026 22:55:05 -0700 Mark Geisert wrote: > Hi Takashi, > > On 6/12/2026 7:54 PM, Takashi Yano wrote: > > 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(). > > Thanks for catching this ^^^ I was just about to mention it myself... > > > 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 (); > > Given the ambiguity of "ERROR_NOT_FOUND" I would add a one-line comment > here saying ERROR_NOT_FOUND means GetClipboardData() couldn't find > CF_UNICODETEXT data, but it would return data if you ask for the correct > format. This latter case means the clipboard is indeed open. (Or some > briefer way of saying this complicated case.) > > Hmm. Maybe more than one line for that comment. With that, patch is GTG. Thanks! Pushed. -- Takashi Yano <[email protected]>