diff --git a/qt/aqt/reviewer.py b/qt/aqt/reviewer.py index 64af05c3d..4ad68a626 100644 --- a/qt/aqt/reviewer.py +++ b/qt/aqt/reviewer.py @@ -653,12 +653,6 @@ class Reviewer: def _onTypedAnswer(self, val: None) -> None: self.typedAnswer = val or "" self._showAnswer() - self.unfocus_typing_box() - - def unfocus_typing_box(self) -> None: - # shifting focus to the bottom area works around a WebEngine/IME bug - # https://github.com/ankitects/anki/issues/1952 - self.bottom.web.setFocus() # Bottom bar ########################################################################## diff --git a/qt/aqt/webview.py b/qt/aqt/webview.py index be856a31d..bc82352f6 100644 --- a/qt/aqt/webview.py +++ b/qt/aqt/webview.py @@ -294,8 +294,9 @@ class AnkiWebView(QWebEngineView): w.close() else: # in the main window, removes focus from type in area - if mw.state == "review": - mw.reviewer.unfocus_typing_box() + parent = self.parent() + assert isinstance(parent, QWidget) + parent.setFocus() break w = w.parent() diff --git a/ts/reviewer/index.ts b/ts/reviewer/index.ts index ad0b9a560..83cfd0cba 100644 --- a/ts/reviewer/index.ts +++ b/ts/reviewer/index.ts @@ -237,3 +237,17 @@ export function _blockDefaultDragDropBehavior(): void { document.ondragover = handler; document.ondrop = handler; } + +// work around WebEngine/IME bug in Qt6 +// https://github.com/ankitects/anki/issues/1952 +const dummyButton = document.createElement("button"); +dummyButton.style.position = "absolute"; +dummyButton.style.left = "-9999px"; +document.addEventListener("focusout", (event) => { + const target = event.target; + if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement) { + document.body.appendChild(dummyButton); + dummyButton.focus(); + document.body.removeChild(dummyButton); + } +});