Add a timeout to the clipboard code to avoid hangs when using synergy. When a timeout is detected we set the clipboard so that we own it so that future timeouts are avoided. Testing has confirmed that this timeout and setting only occurs when the clipboard contains text from my Windows machine. macosx_10_4_supported
authorSam Lantinga <slouken@libsdl.org>
Tue, 23 Jul 2013 12:59:29 -0700
changeset 7506 ccf5fbfa2afa
parent 7505 bc709c9493e7
child 7507 885b4aab4190
Add a timeout to the clipboard code to avoid hangs when using synergy. When a timeout is detected we set the clipboard so that we own it so that future timeouts are avoided. Testing has confirmed that this timeout and setting only occurs when the clipboard contains text from my Windows machine.

That is, if you copy from the Windows clipboard and then launch Dota and then repeatedly paste to a terminal window then the text will disappear when Dota hits the timeout. If you then select on the Linux side you can repeatedly paste. If you select again on Windows then the text will get cleared again.

Note that Dota only looks at the clipboard when it has focus.

CR: Saml
src/thread/windows/SDL_systhread.c
src/video/x11/SDL_x11clipboard.c
--- a/src/video/x11/SDL_x11clipboard.c	Tue Jul 23 12:55:19 2013 -0700
+++ b/src/video/x11/SDL_x11clipboard.c	Tue Jul 23 12:59:29 2013 -0700
@@ -26,6 +26,7 @@
 
 #include "SDL_events.h"
 #include "SDL_x11video.h"
+#include "SDL_timer.h"
 
 
 /* If you don't support UTF-8, you might use XA_STRING here */
@@ -94,10 +95,12 @@
     unsigned long overflow;
     unsigned char *src;
     char *text;
+    Uint32 waitStart;
+    Uint32 waitElapsed;
     Atom XA_CLIPBOARD = XInternAtom(display, "CLIPBOARD", 0);
     if (XA_CLIPBOARD == None) {
         SDL_SetError("Couldn't access X clipboard");
-        return NULL;
+        return SDL_strdup("");
     }
 
     text = NULL;
@@ -116,10 +119,23 @@
         XConvertSelection(display, XA_CLIPBOARD, format, selection, owner,
             CurrentTime);
 
-        /* FIXME: Should we have a timeout here? */
+        /* When using synergy on Linux and when data has been put in the clipboard
+           on the remote (Windows anyway) machine then selection_waiting may never
+           be set to False. Time out after a while. */
+        waitStart = SDL_GetTicks();
         videodata->selection_waiting = SDL_TRUE;
         while (videodata->selection_waiting) {
             SDL_PumpEvents();
+            waitElapsed = SDL_GetTicks() - waitStart;
+            /* Wait one second for a clipboard response. */
+            if (waitElapsed > 1000) {
+                videodata->selection_waiting = SDL_FALSE;
+                SDL_SetError("Clipboard timeout");
+                /* We need to set the clipboard text so that next time we won't
+                   timeout, otherwise we will hang on every call to this function. */
+                X11_SetClipboardText(_this, "");
+                return SDL_strdup("");
+            }
         }
     }