[newlib-cygwin] Cygwin: clipboard: Add workaround for ERROR_CLIPBOARD_NOT_OPEN

Takashi Yano via Cygwin-cvs <[email protected]> Sat, 13 Jun 2026 07:28:06 +0000 (GMT)
Newsgroups gmane.os.cygwin.cvs
Message-ID <[email protected]>
https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3D7fd670a36b9=
a26c357f61650a6ec4a0e09936b7c

commit 7fd670a36b9a26c357f61650a6ec4a0e09936b7c
Author: Takashi Yano <[email protected]>
Date:   Tue Jun 9 09:14:57 2026 +0900

    Cygwin: clipboard: Add workaround for ERROR_CLIPBOARD_NOT_OPEN
   =20
    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.
   =20
    Addresses: https://cygwin.com/pipermail/cygwin/2026-February/259438.html
    Signed-off-by: Takashi Yano <[email protected]>
    Reviewed-by: Mark Geisert <[email protected]>

Diff:
---
 winsup/cygwin/fhandler/clipboard.cc | 21 +++++++++++++++++++--
 winsup/cygwin/release/3.6.10        |  3 +++
 2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/winsup/cygwin/fhandler/clipboard.cc b/winsup/cygwin/fhandler/c=
lipboard.cc
index 12691c7c1..116feb599 100644
--- a/winsup/cygwin/fhandler/clipboard.cc
+++ b/winsup/cygwin/fhandler/clipboard.cc
@@ -25,11 +25,28 @@ details. */
 static inline bool
 open_clipboard ()
 {
-  const int max_retry =3D 10;
+  const int max_retry =3D 20;
   for (int i =3D 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 =3D GetLastError ();
+	  /* Here, ERROR_NOT_FOUND means the clipboard does not contains
+	     valid CF_UNICODETEXT. OpenClipboard() must have succeeded. */
+	  if (err =3D=3D ERROR_NOT_FOUND)
+	    return true;
+	  CloseClipboard ();
+	  if (err !=3D ERROR_CLIPBOARD_NOT_OPEN)
+	    return false;
+	}
       Sleep (1);
     }
   return false;
diff --git a/winsup/cygwin/release/3.6.10 b/winsup/cygwin/release/3.6.10
index e29c3d6c0..506f79b21 100644
--- a/winsup/cygwin/release/3.6.10
+++ b/winsup/cygwin/release/3.6.10
@@ -8,3 +8,6 @@ Fixes:
=20
 - Fix behaviour with OPEN_MAX files open
   Addresses: https://cygwin.com/pipermail/cygwin/2026-May/259664.html
+
+- Add workaround for clipboard access error.
+  Addresses: https://cygwin.com/pipermail/cygwin/2026-February/259438.html