|
@@ -102,23 +102,31 @@ int WIN_SetClipboardText(SDL_VideoDevice *_this, const char *text)
|
|
|
|
|
|
char *WIN_GetClipboardText(SDL_VideoDevice *_this)
|
|
|
{
|
|
|
- char *text;
|
|
|
-
|
|
|
- text = NULL;
|
|
|
- if (IsClipboardFormatAvailable(TEXT_FORMAT) &&
|
|
|
- OpenClipboard(GetWindowHandle(_this))) {
|
|
|
- HANDLE hMem;
|
|
|
- LPTSTR tstr;
|
|
|
-
|
|
|
- hMem = GetClipboardData(TEXT_FORMAT);
|
|
|
- if (hMem) {
|
|
|
- tstr = (LPTSTR)GlobalLock(hMem);
|
|
|
- text = WIN_StringToUTF8(tstr);
|
|
|
- GlobalUnlock(hMem);
|
|
|
- } else {
|
|
|
- WIN_SetError("Couldn't get clipboard data");
|
|
|
+ char *text = NULL;
|
|
|
+
|
|
|
+ if (IsClipboardFormatAvailable(TEXT_FORMAT)) {
|
|
|
+ /* Retry to open the clipboard in case another application has it open */
|
|
|
+ const int MAX_ATTEMPTS = 3;
|
|
|
+ int attempt;
|
|
|
+
|
|
|
+ for (attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) {
|
|
|
+ if (OpenClipboard(GetWindowHandle(_this))) {
|
|
|
+ HANDLE hMem;
|
|
|
+ LPTSTR tstr;
|
|
|
+
|
|
|
+ hMem = GetClipboardData(TEXT_FORMAT);
|
|
|
+ if (hMem) {
|
|
|
+ tstr = (LPTSTR)GlobalLock(hMem);
|
|
|
+ text = WIN_StringToUTF8(tstr);
|
|
|
+ GlobalUnlock(hMem);
|
|
|
+ } else {
|
|
|
+ WIN_SetError("Couldn't get clipboard data");
|
|
|
+ }
|
|
|
+ CloseClipboard();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ SDL_Delay(10);
|
|
|
}
|
|
|
- CloseClipboard();
|
|
|
}
|
|
|
if (text == NULL) {
|
|
|
text = SDL_strdup("");
|