From 25c3f2cb24fa4a748d01530da02b7aa6d7d45990 Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Thu, 1 Mar 2018 15:53:25 +1000 Subject: [PATCH] work around issues writing to Windows clipboard https://anki.tenderapp.com/discussions/beta-testing/1014-cannot-copy-from-fields-in-anki-210beta36 --- aqt/editor.py | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/aqt/editor.py b/aqt/editor.py index 6e54f7087..67541d567 100644 --- a/aqt/editor.py +++ b/aqt/editor.py @@ -21,7 +21,7 @@ from anki.hooks import runHook, runFilter from aqt.sound import getAudio from aqt.webview import AnkiWebView from aqt.utils import shortcut, showInfo, showWarning, getFile, \ - openHelp, tooltip, downArrow + openHelp, tooltip, downArrow, showCritical import aqt from bs4 import BeautifulSoup import requests @@ -903,6 +903,36 @@ class EditorWebView(AnkiWebView): return html = mime.html() mime.setHtml("" + html) + if isWin: + self._windowsSetMimeData(clip, mime) + else: + clip.setMimeData(mime) + + def _windowsSetMimeData(self, clip, mime): + import win32clipboard, time + from ctypes import windll + + grabbed = False + for i in range(10): + try: + win32clipboard.OpenClipboard(self.editor.parentWindow.winId()) + grabbed = True + break + except: + time.sleep(0.01) + continue + + if not grabbed: + hwnd = win32clipboard.GetOpenClipboardWindow() + + longpid = ctypes.c_ulong() + result = windll.user32.GetWindowThreadProcessId(hwnd, ctypes.byref(longpid)) + pid = longpid.value + + showCritical(_("Unable to access clipboard - locked by process %d" % pid)) + return + + win32clipboard.CloseClipboard() clip.setMimeData(mime) def contextMenuEvent(self, evt):