From 627afffeb42b6f75aa36b4b5eeeca3da5fa5d06a Mon Sep 17 00:00:00 2001 From: attila Date: Wed, 27 Apr 2022 15:44:45 +0200 Subject: [PATCH] Android: Fix dismissing screen keyboard when interacting with TextEditor --- .../juce_gui_basics/native/juce_android_Windowing.cpp | 2 +- .../native/juce_mac_NSViewComponentPeer.mm | 2 +- .../juce_gui_basics/native/juce_win32_Windowing.cpp | 7 ++++++- modules/juce_gui_basics/widgets/juce_TextEditor.cpp | 4 ++-- .../juce_gui_basics/windows/juce_ComponentPeer.cpp | 7 ++++++- modules/juce_gui_basics/windows/juce_ComponentPeer.h | 11 ++++++++++- 6 files changed, 26 insertions(+), 7 deletions(-) diff --git a/modules/juce_gui_basics/native/juce_android_Windowing.cpp b/modules/juce_gui_basics/native/juce_android_Windowing.cpp index 09f63334ac..3e06ce65d7 100644 --- a/modules/juce_gui_basics/native/juce_android_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_android_Windowing.cpp @@ -933,7 +933,7 @@ public: if (! isTimerRunning()) startTimer (500); - } + } //============================================================================== void handlePaintCallback (jobject canvas, jobject paint) diff --git a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm index 17361fc7e2..783fc9fe09 100644 --- a/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm +++ b/modules/juce_gui_basics/native/juce_mac_NSViewComponentPeer.mm @@ -1628,7 +1628,7 @@ public: void textInputRequired (Point, TextInputTarget&) override {} - void dismissPendingTextInput() override + void closeInputMethodContext() override { stringBeingComposed.clear(); const auto* inputContext = [NSTextInputContext currentInputContext]; diff --git a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp index 9542001359..135e3241f6 100644 --- a/modules/juce_gui_basics/native/juce_win32_Windowing.cpp +++ b/modules/juce_gui_basics/native/juce_win32_Windowing.cpp @@ -1874,9 +1874,14 @@ public: OnScreenKeyboard::getInstance()->activate(); } - void dismissPendingTextInput() override + void closeInputMethodContext() override { imeHandler.handleSetContext (hwnd, false); + } + + void dismissPendingTextInput() override + { + closeInputMethodContext(); if (uwpViewSettings.isTabletModeActivatedForWindow (hwnd)) OnScreenKeyboard::getInstance()->deactivate(); diff --git a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp index f9a46d3d51..d9a310570b 100644 --- a/modules/juce_gui_basics/widgets/juce_TextEditor.cpp +++ b/modules/juce_gui_basics/widgets/juce_TextEditor.cpp @@ -1831,7 +1831,7 @@ void TextEditor::mouseDown (const MouseEvent& e) e.mods.isShiftDown()); if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + peer->closeInputMethodContext(); } else { @@ -1954,7 +1954,7 @@ bool TextEditor::moveCaretWithTransaction (const int newPos, const bool selectin moveCaretTo (newPos, selecting); if (auto* peer = getPeer()) - peer->dismissPendingTextInput(); + peer->closeInputMethodContext(); return true; } diff --git a/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp b/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp index 4558e5d0bb..16329ad0db 100644 --- a/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp +++ b/modules/juce_gui_basics/windows/juce_ComponentPeer.cpp @@ -267,7 +267,12 @@ TextInputTarget* ComponentPeer::findCurrentTextInputTarget() return nullptr; } -void ComponentPeer::dismissPendingTextInput() {} +void ComponentPeer::closeInputMethodContext() {} + +void ComponentPeer::dismissPendingTextInput() +{ + closeInputMethodContext(); +} //============================================================================== void ComponentPeer::handleBroughtToFront() diff --git a/modules/juce_gui_basics/windows/juce_ComponentPeer.h b/modules/juce_gui_basics/windows/juce_ComponentPeer.h index 7733756c7c..80db10ef1f 100644 --- a/modules/juce_gui_basics/windows/juce_ComponentPeer.h +++ b/modules/juce_gui_basics/windows/juce_ComponentPeer.h @@ -356,7 +356,16 @@ public: */ virtual void textInputRequired (Point position, TextInputTarget&) = 0; - /** If there's some kind of OS input-method in progress, this should dismiss it. */ + /** If there's a currently active input-method context - i.e. characters are being + composed using multiple keystrokes - this should commit the current state of the + context to the text and clear the context. + */ + virtual void closeInputMethodContext(); + + /** If there's some kind of OS input-method in progress, this should dismiss it. + + Overrides of this function should call closeInputMethodContext(). + */ virtual void dismissPendingTextInput(); /** Returns the currently focused TextInputTarget, or null if none is found. */