From 65b62485be4a7ce1f584b84231f69d829743b61c Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Fri, 17 May 2024 03:24:20 +0400 Subject: [PATCH] Forward input method event from Dialogs::Widget to search field --- .../SourceFiles/dialogs/dialogs_widget.cpp | 28 +++++++++++++++++++ Telegram/SourceFiles/dialogs/dialogs_widget.h | 3 ++ 2 files changed, 31 insertions(+) diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp index 575516ffa..6e5c30b7b 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.cpp @@ -82,6 +82,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/qt/qt_common_adapters.h" #include +#include #include #include @@ -239,6 +240,8 @@ Widget::Widget( : nullptr) , _searchTimer([=] { searchMessages(); }) , _singleMessageSearch(&controller->session()) { + setAttribute(Qt::WA_InputMethodEnabled); + const auto makeChildListShown = [](PeerId peerId, float64 shown) { return InnerWidget::ChildListShown{ peerId, shown }; }; @@ -3298,6 +3301,31 @@ void Widget::keyPressEvent(QKeyEvent *e) { } } +void Widget::inputMethodEvent(QInputMethodEvent *e) { + const auto cursor = _search->rawTextEdit()->textCursor(); + bool isGettingInput = !e->commitString().isEmpty() + || e->preeditString() != cursor.block().layout()->preeditAreaText() + || e->replacementLength() > 0; + + if (!isGettingInput || _postponeProcessSearchFocusChange) { + Window::AbstractSectionWidget::inputMethodEvent(e); + return; + } + + // This delay in search focus processing allows us not to create + // _suggestions in case the event inserts some non-whitespace search + // query while still show _suggestions animated, if it is a space. + _postponeProcessSearchFocusChange = true; + _search->setFocusFast(); + QCoreApplication::sendEvent(_search->rawTextEdit(), e); + _postponeProcessSearchFocusChange = false; + processSearchFocusChange(); +} + +QVariant Widget::inputMethodQuery(Qt::InputMethodQuery query) const { + return _search->rawTextEdit()->inputMethodQuery(query); +} + bool Widget::redirectToSearchPossible() const { return !_openedFolder && !_openedForum diff --git a/Telegram/SourceFiles/dialogs/dialogs_widget.h b/Telegram/SourceFiles/dialogs/dialogs_widget.h index 5ff9828d5..aa6dbdf93 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_widget.h +++ b/Telegram/SourceFiles/dialogs/dialogs_widget.h @@ -135,6 +135,8 @@ public: bool cancelSearch(); bool cancelSearchByMouseBack(); + QVariant inputMethodQuery(Qt::InputMethodQuery query) const override; + ~Widget(); protected: @@ -144,6 +146,7 @@ protected: void dropEvent(QDropEvent *e) override; void resizeEvent(QResizeEvent *e) override; void keyPressEvent(QKeyEvent *e) override; + void inputMethodEvent(QInputMethodEvent *e) override; void paintEvent(QPaintEvent *e) override; private: