From 82838e15ecff4d85df42dd2567ef0b0a57b5eb38 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 23 Jul 2013 12:59:29 -0700 Subject: [PATCH] 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 | 0 src/video/x11/SDL_x11clipboard.c | 20 ++++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) mode change 100755 => 100644 src/thread/windows/SDL_systhread.c 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 bdeb4da8a..54b5eb602 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 @@ X11_GetClipboardText(_THIS) 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 @@ X11_GetClipboardText(_THIS) 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(""); + } } }