From 76065e843ba8b70db92297de00aa5660d88b7817 Mon Sep 17 00:00:00 2001 From: Hikaru Y Date: Mon, 3 Oct 2022 11:53:09 +0900 Subject: [PATCH] Fix scrolling with keys / keyboard event listeners not working on answer side (#2099) * Revert "Fix reviewer shortcuts being inaccessible due to IME" This reverts commit 5bf031f1e33c51034c31cec359ae62e621e115a6. * Work around WebEngine/IME bug in Qt6 --- qt/aqt/reviewer.py | 6 ------ qt/aqt/webview.py | 5 +++-- ts/reviewer/index.ts | 14 ++++++++++++++ 3 files changed, 17 insertions(+), 8 deletions(-) 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); + } +});