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
diff --git a/src/thread/windows/SDL_systhread.c b/src/thread/windows/SDL_systhread.c
old mode 100755
new mode 100644
diff --git a/src/video/x11/SDL_x11clipboard.c b/src/video/x11/SDL_x11clipboard.c
index bdeb4da..54b5eb6 100644
--- a/src/video/x11/SDL_x11clipboard.c
+++ b/src/video/x11/SDL_x11clipboard.c
@@ -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("");
+            }
         }
     }