Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Add a timeout to the clipboard code to avoid hangs when using synergy…
Browse files Browse the repository at this point in the history
…. 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
  • Loading branch information
slouken committed Jul 23, 2013
1 parent 61f27eb commit 82838e1
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 2 deletions.
Empty file modified src/thread/windows/SDL_systhread.c 100755 → 100644
Empty file.
20 changes: 18 additions & 2 deletions src/video/x11/SDL_x11clipboard.c
Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand All @@ -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("");
}
}
}

Expand Down

0 comments on commit 82838e1

Please sign in to comment.