diff --git a/interface/resources/html/raiseAndLowerKeyboard.js b/interface/resources/html/raiseAndLowerKeyboard.js index f40c0d7376..8cdb3c2327 100644 --- a/interface/resources/html/raiseAndLowerKeyboard.js +++ b/interface/resources/html/raiseAndLowerKeyboard.js @@ -18,6 +18,11 @@ window.isKeyboardRaised = false; window.isNumericKeyboard = false; window.isPasswordField = false; + window.lastActiveElement = null; + + function getActiveElement() { + return document.activeElement; + } function shouldSetPasswordField() { var nodeType = document.activeElement.type; @@ -65,10 +70,11 @@ var keyboardRaised = shouldRaiseKeyboard(); var numericKeyboard = shouldSetNumeric(); var passwordField = shouldSetPasswordField(); + var activeElement = getActiveElement(); if (isWindowFocused && (keyboardRaised !== window.isKeyboardRaised || numericKeyboard !== window.isNumericKeyboard - || passwordField !== window.isPasswordField)) { + || passwordField !== window.isPasswordField || activeElement !== window.lastActiveElement)) { if (typeof EventBridge !== "undefined" && EventBridge !== null) { EventBridge.emitWebEvent( @@ -90,6 +96,7 @@ window.isKeyboardRaised = keyboardRaised; window.isNumericKeyboard = numericKeyboard; window.isPasswordField = passwordField; + window.lastActiveElement = activeElement; } }, POLL_FREQUENCY); diff --git a/interface/resources/qml/controls/FlickableWebViewCore.qml b/interface/resources/qml/controls/FlickableWebViewCore.qml index 943f15e1de..bc5883425f 100644 --- a/interface/resources/qml/controls/FlickableWebViewCore.qml +++ b/interface/resources/qml/controls/FlickableWebViewCore.qml @@ -34,10 +34,34 @@ Item { webViewCore.stop(); } + Timer { + id: delayedUnfocuser + repeat: false + interval: 200 + onTriggered: { + + // The idea behind this is to delay unfocusing, so that fast lower/raise will not result actual unfocusing. + // Fast lower/raise happens every time keyboard is being re-raised (see the code below in OffscreenQmlSurface::setKeyboardRaised) + // + // if (raised) { + // item->setProperty("keyboardRaised", QVariant(!raised)); + // } + // + // item->setProperty("keyboardRaised", QVariant(raised)); + // + + webViewCore.runJavaScript("if (document.activeElement) document.activeElement.blur();", function(result) { + console.log('unfocus completed: ', result); + }); + } + } + function unfocus() { - webViewCore.runJavaScript("if (document.activeElement) document.activeElement.blur();", function(result) { - console.log('unfocus completed: ', result); - }); + delayedUnfocuser.start(); + } + + function stopUnfocus() { + delayedUnfocuser.stop(); } function onLoadingChanged(loadRequest) { diff --git a/interface/resources/qml/controls/TabletWebScreen.qml b/interface/resources/qml/controls/TabletWebScreen.qml index bb037ad478..a33dc8a1d7 100644 --- a/interface/resources/qml/controls/TabletWebScreen.qml +++ b/interface/resources/qml/controls/TabletWebScreen.qml @@ -13,6 +13,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/controls/TabletWebView.qml b/interface/resources/qml/controls/TabletWebView.qml index db695dbfb2..41127c2190 100644 --- a/interface/resources/qml/controls/TabletWebView.qml +++ b/interface/resources/qml/controls/TabletWebView.qml @@ -17,6 +17,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false diff --git a/interface/resources/qml/controls/WebView.qml b/interface/resources/qml/controls/WebView.qml index 71bf69fdc8..8e7e5493ae 100644 --- a/interface/resources/qml/controls/WebView.qml +++ b/interface/resources/qml/controls/WebView.qml @@ -15,6 +15,8 @@ Item { onKeyboardRaisedChanged: { if(!keyboardRaised) { webroot.unfocus(); + } else { + webroot.stopUnfocus(); } } property bool punctuationMode: false