Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package fcitx5-qt for openSUSE:Factory 
checked in at 2023-05-23 14:53:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fcitx5-qt (Old)
 and      /work/SRC/openSUSE:Factory/.fcitx5-qt.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fcitx5-qt"

Tue May 23 14:53:53 2023 rev:8 rq:1088351 version:5.0.17

Changes:
--------
--- /work/SRC/openSUSE:Factory/fcitx5-qt/fcitx5-qt.changes      2022-11-27 
12:53:21.203319824 +0100
+++ /work/SRC/openSUSE:Factory/.fcitx5-qt.new.1533/fcitx5-qt.changes    
2023-05-23 14:54:14.786377713 +0200
@@ -1,0 +2,9 @@
+Mon May 22 09:52:06 UTC 2023 - Marguerite Su <i...@marguerite.su>
+
+- Update to 5.0.17
+  * fix an issue related to fractional scale with Qt 6.5 in the client
+side input panel.
+  * fix committing preedit when focus out
+  * workaround QTBUG-108522 in QCompleter
+
+-------------------------------------------------------------------

Old:
----
  fcitx5-qt-5.0.16.tar.xz

New:
----
  fcitx5-qt-5.0.17.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ fcitx5-qt.spec ++++++
--- /var/tmp/diff_new_pack.f1BntB/_old  2023-05-23 14:54:15.358381097 +0200
+++ /var/tmp/diff_new_pack.f1BntB/_new  2023-05-23 14:54:15.366381144 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package fcitx5-qt
 #
-# Copyright (c) 2022 SUSE LLC
+# Copyright (c) 2023 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -21,15 +21,13 @@
 %else
 %define build_qt4 0
 %endif
-
 %if 0%{?suse_version} >= 1550
 %define build_qt6 1
 %else
 %define build_qt6 0
 %endif
-
 Name:           fcitx5-qt
-Version:        5.0.16
+Version:        5.0.17
 Release:        0
 Summary:        Qt library and IM module for fcitx5
 License:        BSD-3-Clause AND LGPL-2.1-or-later
@@ -38,33 +36,32 @@
 Source:         
https://download.fcitx-im.org/fcitx5/%{name}/%{name}-%{version}.tar.xz
 BuildRequires:  cmake
 BuildRequires:  extra-cmake-modules
+BuildRequires:  fcitx5-devel
 BuildRequires:  fdupes
 BuildRequires:  gcc-c++
-%if %build_qt4
-BuildRequires:  libqt4-devel
-%endif
 BuildRequires:  libqt5-qtbase-devel
 BuildRequires:  libqt5-qtbase-private-headers-devel
 BuildRequires:  libqt5-qtx11extras-devel
-%if %build_qt6
+BuildRequires:  libxcb-devel
+BuildRequires:  libxkbcommon-devel
+%if %{build_qt4}
+BuildRequires:  libqt4-devel
+%endif
+%if %{build_qt6}
 BuildRequires:  qt6-base-devel
 BuildRequires:  qt6-base-private-devel
 %endif
-BuildRequires:  fcitx5-devel
-BuildRequires:  libxcb-devel
-BuildRequires:  libxkbcommon-devel
-BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 
 %description
 Qt library and IM module for fcitx5.
 
-%if %build_qt4
+%if %{build_qt4}
 %package -n fcitx5-qt4
 Summary:        Qt4 IM module for Fcitx5
 Group:          System/I18n/Chinese
+Supplements:    (fcitx5 and libqt4)
 Provides:       fcitx-qt4 = %{version}
 Obsoletes:      fcitx-qt4 < 5.0.0
-Supplements:    (fcitx5 and libqt4)
 
 %description -n fcitx5-qt4
 Qt4 IM module for Fcitx5.
@@ -77,13 +74,13 @@
 This package provides Qt4 DBus Addons library for Fcitx5.
 %endif
 
-%if %build_qt6
+%if %{build_qt6}
 %package -n fcitx5-qt6
 Summary:        Qt6 IM module for Fcitx5
 Group:          System/I18n/Chinese
+Supplements:    (fcitx5 and libQt6Core6)
 Provides:       fcitx-qt6 = %{version}
 Obsoletes:      fcitx-qt6 < 5.0.0
-Supplements:    (fcitx5 and libQt6Core6)
 
 %description -n fcitx5-qt6
 Qt6 IM module for Fcitx5.
@@ -99,9 +96,9 @@
 %package -n fcitx5-qt5
 Summary:        Qt5 IM module for Fcitx5
 Group:          System/I18n/Chinese
+Supplements:    (fcitx5 and libqt5-qtbase)
 Provides:       fcitx-qt5 = %{version}
 Obsoletes:      fcitx-qt5 < 5.0.0
-Supplements:    (fcitx5 and libqt5-qtbase)
 
 %description -n fcitx5-qt5
 Qt5 IM module for Fcitx5.
@@ -123,14 +120,14 @@
 %package devel
 Summary:        Development files for fcitx5-qt
 Group:          Development/Libraries/C and C++
-%if %build_qt4
-Requires:       fcitx5-qt4 = %{version}
-Requires:       libFcitx5Qt4DBusAddons1 = %{version}
-%endif
 Requires:       fcitx5-qt5 = %{version}
 Requires:       libFcitx5Qt5DBusAddons1 = %{version}
 Requires:       libFcitx5Qt5WidgetsAddons2 = %{version}
-%if %build_qt6
+%if %{build_qt4}
+Requires:       fcitx5-qt4 = %{version}
+Requires:       libFcitx5Qt4DBusAddons1 = %{version}
+%endif
+%if %{build_qt6}
 Requires:       fcitx5-qt6 = %{version}
 Requires:       libFcitx5Qt6DBusAddons1 = %{version}
 %endif
@@ -143,35 +140,35 @@
 
 %build
 ARGS=""
-%if !%build_qt4
+%if !%{build_qt4}
 ARGS="$ARGS -DENABLE_QT4=OFF"
 %endif
-%if %build_qt6
+%if %{build_qt6}
 ARGS="$ARGS -DENABLE_QT6=ON"
 %endif
 %cmake -DCMAKE_INSTALL_LIBEXECDIR=%{_libexecdir} $ARGS
-make %{?_smp_mflags}
+%make_build
 
 %install
 %cmake_install
 %find_lang %{name}
 %fdupes -s %{buildroot}
 
-%if %build_qt4
+%if %{build_qt4}
 %post -n libFcitx5Qt4DBusAddons1 -p /sbin/ldconfig
 %postun -n libFcitx5Qt4DBusAddons1 -p /sbin/ldconfig
 %endif
+
 %post -n libFcitx5Qt5DBusAddons1 -p /sbin/ldconfig
 %post -n libFcitx5Qt5WidgetsAddons2 -p /sbin/ldconfig
 %postun -n libFcitx5Qt5DBusAddons1 -p /sbin/ldconfig
 %postun -n libFcitx5Qt5WidgetsAddons2 -p /sbin/ldconfig
-%if %build_qt6
+%if %{build_qt6}
 %post -n libFcitx5Qt6DBusAddons1 -p /sbin/ldconfig
 %postun -n libFcitx5Qt6DBusAddons1 -p /sbin/ldconfig
 %endif
 
 %files -n fcitx5-qt5 -f %{name}.lang
-%defattr(-,root,root)
 %doc README.md
 %license LICENSES
 %{_libexecdir}/fcitx5-qt5-gui-wrapper
@@ -179,41 +176,34 @@
 %{_fcitx5_qt5dir}/libfcitx-quickphrase-editor5.so
 
%{_libdir}/qt5/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so
 
-%if %build_qt6
+%if %{build_qt6}
 %files -n fcitx5-qt6
-%defattr(-,root,root)
 
%{_libdir}/qt6/plugins/platforminputcontexts/libfcitx5platforminputcontextplugin.so
 
 %files -n libFcitx5Qt6DBusAddons1
-%defattr(-,root,root)
 %{_libdir}/libFcitx5Qt6DBusAddons.so.1
 %{_libdir}/libFcitx5Qt6DBusAddons.so.%{version}
 %endif
 
-%if %build_qt4
+%if %{build_qt4}
 %files -n fcitx5-qt4
-%defattr(-,root,root)
 %{_libdir}/qt4/plugins/inputmethods/libqtim-fcitx5.so
 
 %files -n libFcitx5Qt4DBusAddons1
-%defattr(-,root,root)
 %{_libdir}/libFcitx5Qt4DBusAddons.so.1
 %{_libdir}/libFcitx5Qt4DBusAddons.so.%{version}
 %endif
 
 %files -n libFcitx5Qt5DBusAddons1
-%defattr(-,root,root)
 %{_libdir}/libFcitx5Qt5DBusAddons.so.1
 %{_libdir}/libFcitx5Qt5DBusAddons.so.%{version}
 
 %files -n libFcitx5Qt5WidgetsAddons2
-%defattr(-,root,root)
 %{_libdir}/libFcitx5Qt5WidgetsAddons.so.2
 %{_libdir}/libFcitx5Qt5WidgetsAddons.so.%{version}
 
 %files devel
-%defattr(-,root,root)
-%if %build_qt4
+%if %{build_qt4}
 %{_includedir}/Fcitx5Qt4
 %{_libdir}/libFcitx5Qt4DBusAddons.so
 %{_libdir}/cmake/Fcitx5Qt4DBusAddons
@@ -223,7 +213,7 @@
 %{_libdir}/cmake/Fcitx5Qt5WidgetsAddons
 %{_libdir}/libFcitx5Qt5DBusAddons.so
 %{_libdir}/libFcitx5Qt5WidgetsAddons.so
-%if %build_qt6
+%if %{build_qt6}
 %{_includedir}/Fcitx5Qt6
 %{_libdir}/libFcitx5Qt6DBusAddons.so
 %{_libdir}/cmake/Fcitx5Qt6DBusAddons

++++++ fcitx5-qt-5.0.16.tar.xz -> fcitx5-qt-5.0.17.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-qt-5.0.16/CMakeLists.txt 
new/fcitx5-qt-5.0.17/CMakeLists.txt
--- old/fcitx5-qt-5.0.16/CMakeLists.txt 2022-11-20 08:08:07.882028000 +0100
+++ new/fcitx5-qt-5.0.17/CMakeLists.txt 2023-03-11 05:02:02.935756700 +0100
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.16)
-project(fcitx5-qt VERSION 5.0.16)
+project(fcitx5-qt VERSION 5.0.17)
 set(FCITX5_QT_VERSION ${PROJECT_VERSION})
 
 set(REQUIRED_QT4_VERSION 4.8.0)
@@ -79,7 +79,7 @@
 endif()
 
 if(ENABLE_QT6)
-  find_package(Qt6 ${REQUIRED_QT6_VERSION} CONFIG REQUIRED Core DBus)
+  find_package(Qt6 ${REQUIRED_QT6_VERSION} CONFIG REQUIRED Core DBus Widgets)
   find_package(Qt6Gui ${REQUIRED_QT6_VERSION} REQUIRED Private)
   add_subdirectory(qt6)
 endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-qt-5.0.16/po/zh_TW.po 
new/fcitx5-qt-5.0.17/po/zh_TW.po
--- old/fcitx5-qt-5.0.16/po/zh_TW.po    2022-05-14 10:47:02.118577200 +0200
+++ new/fcitx5-qt-5.0.17/po/zh_TW.po    2022-12-20 01:47:35.366205000 +0100
@@ -7,14 +7,15 @@
 # Billy SU <billy4195...@gmail.com>, 2020
 # bruh, 2020
 # csslayer <wen...@gmail.com>, 2022
+# Neko ◣ 0xFF, 2022
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: fcitx5-qt\n"
 "Report-Msgid-Bugs-To: fcitx-...@googlegroups.com\n"
-"POT-Creation-Date: 2022-05-02 03:03+0000\n"
+"POT-Creation-Date: 2022-12-16 20:25+0000\n"
 "PO-Revision-Date: 2017-12-20 02:52+0000\n"
-"Last-Translator: csslayer <wen...@gmail.com>, 2022\n"
+"Last-Translator: Neko ◣ 0xFF, 2022\n"
 "Language-Team: Chinese (Taiwan) (https://www.transifex.com/fcitx/teams/12005/";
 "zh_TW/)\n"
 "Language: zh_TW\n"
@@ -135,7 +136,7 @@
 msgid "E&xport"
 msgstr "匯出 (&X)"
 
-#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:319
+#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:355
 msgid "Empty"
 msgstr "空"
 
@@ -153,7 +154,7 @@
 
 #: qt5/guiwrapper/org.fcitx.fcitx5-qt5-gui-wrapper.desktop.in.in:3
 msgid "Fcitx 5 Qt5 Gui Wrapper"
-msgstr ""
+msgstr "Fcitx 5 Qt5 圖形界面封装器"
 
 #: qt5/quickphrase-editor/editor.cpp:237 qt5/quickphrase-editor/editor.cpp:279
 msgid "File Operation Failed"
@@ -165,29 +166,29 @@
 
 #: qt5/guiwrapper/org.fcitx.fcitx5-qt5-gui-wrapper.desktop.in.in:4
 msgid "Input Method Configuration helper"
-msgstr ""
+msgstr "輸入法設定助手"
 
 #: qt5/quickphrase-editor/editor.cpp:225
 msgid "Invalid filename"
 msgstr "無效的檔案名稱"
 
-#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:180
+#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:179
 msgid "Key code mode"
 msgstr "關鍵代碼模式"
 
-#: qt5/quickphrase-editor/model.cpp:71
+#: qt5/quickphrase-editor/model.cpp:73
 msgid "Keyword"
 msgstr "關鍵字"
 
 #: qt5/guiwrapper/org.fcitx.fcitx5-qt5-gui-wrapper.desktop.in.in:5
 msgid "Load configuration plugin for Fcitx Addon"
-msgstr ""
+msgstr "戴入Fcitx 附加組件的配置插件 "
 
 #: qt5/guiwrapper/wrapperapp.cpp:33
 msgid "Parent window ID"
 msgstr "父視窗 ID"
 
-#: qt5/quickphrase-editor/model.cpp:73
+#: qt5/quickphrase-editor/model.cpp:75
 msgid "Phrase"
 msgstr "字詞"
 
@@ -223,11 +224,11 @@
 "內容已修改。\n"
 "您想要儲存還是放棄這些修改?"
 
-#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:356
+#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:392
 msgid "The key you just pressed is not supported by Qt."
 msgstr "Qt 不支援你剛輸入的按鍵組合"
 
-#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:357
+#: qt5/widgetsaddons/fcitxqtkeysequencewidget.cpp:393
 msgid "Unsupported Key"
 msgstr "不支援的按鍵組合"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt4/dbusaddons/fcitxqtinputcontextproxy.h 
new/fcitx5-qt-5.0.17/qt4/dbusaddons/fcitxqtinputcontextproxy.h
--- old/fcitx5-qt-5.0.16/qt4/dbusaddons/fcitxqtinputcontextproxy.h      
2022-11-16 02:02:01.301831700 +0100
+++ new/fcitx5-qt-5.0.17/qt4/dbusaddons/fcitxqtinputcontextproxy.h      
2022-12-16 03:22:07.600773000 +0100
@@ -74,6 +74,7 @@
                             int candidateIndex, int layoutHint, bool hasPrev,
                             bool hasNext);
     void inputContextCreated(const QByteArray &uuid);
+    void notifyFocusOut();
 
 private:
     Q_PRIVATE_SLOT(d_func(), void availabilityChanged());
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt4/dbusaddons/fcitxqtinputcontextproxy_p.h 
new/fcitx5-qt-5.0.17/qt4/dbusaddons/fcitxqtinputcontextproxy_p.h
--- old/fcitx5-qt-5.0.16/qt4/dbusaddons/fcitxqtinputcontextproxy_p.h    
2021-12-28 06:48:15.046992800 +0100
+++ new/fcitx5-qt-5.0.17/qt4/dbusaddons/fcitxqtinputcontextproxy_p.h    
2022-12-16 03:22:07.600773000 +0100
@@ -146,6 +146,8 @@
         QObject::connect(icproxy_,
                          SIGNAL(DeleteSurroundingText(int, unsigned int)), q,
                          SIGNAL(deleteSurroundingText(int, unsigned int)));
+        QObject::connect(icproxy_, SIGNAL(NotifyFocusOut()), q,
+                         SIGNAL(notifyFocusOut()));
 
         delete createInputContextWatcher_;
         createInputContextWatcher_ = nullptr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt4/dbusaddons/fcitxqtinputcontextproxyimpl.h 
new/fcitx5-qt-5.0.17/qt4/dbusaddons/fcitxqtinputcontextproxyimpl.h
--- old/fcitx5-qt-5.0.16/qt4/dbusaddons/fcitxqtinputcontextproxyimpl.h  
2022-11-16 02:02:49.428560300 +0100
+++ new/fcitx5-qt-5.0.17/qt4/dbusaddons/fcitxqtinputcontextproxyimpl.h  
2022-12-16 03:22:07.600773000 +0100
@@ -162,6 +162,7 @@
                    const QString &langCode);
     void DeleteSurroundingText(int offset, unsigned int nchar);
     void ForwardKey(unsigned int keyval, unsigned int state, bool type);
+    void NotifyFocusOut();
     void UpdateClientSideUI(FcitxQtFormattedPreeditList preedit, int cursorpos,
                             FcitxQtFormattedPreeditList auxUp,
                             FcitxQtFormattedPreeditList auxDown,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt4/inputcontext/qfcitxinputcontext.cpp 
new/fcitx5-qt-5.0.17/qt4/inputcontext/qfcitxinputcontext.cpp
--- old/fcitx5-qt-5.0.16/qt4/inputcontext/qfcitxinputcontext.cpp        
2022-06-02 20:18:43.997487800 +0200
+++ new/fcitx5-qt-5.0.17/qt4/inputcontext/qfcitxinputcontext.cpp        
2022-12-16 03:22:07.600773000 +0100
@@ -543,6 +543,12 @@
     }
 }
 
+void QFcitxInputContext::serverSideFocusOut() {
+    if (lastWindow_ == qApp->focusWidget()) {
+        commitPreedit();
+    }
+}
+
 void QFcitxInputContext::createICData(QWidget *w) {
     auto iter = icMap_.find(w);
     if (iter == icMap_.end()) {
@@ -571,6 +577,8 @@
             SLOT(updateFormattedPreedit(FcitxQtFormattedPreeditList, int)));
         connect(data.proxy, SIGNAL(deleteSurroundingText(int, uint)), this,
                 SLOT(deleteSurroundingText(int, uint)));
+        connect(data.proxy, SIGNAL(notifyFocusOut()), this,
+                SLOT(serverSideFocusOut()));
     }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt4/inputcontext/qfcitxinputcontext.h 
new/fcitx5-qt-5.0.17/qt4/inputcontext/qfcitxinputcontext.h
--- old/fcitx5-qt-5.0.16/qt4/inputcontext/qfcitxinputcontext.h  2021-01-26 
23:01:06.724472300 +0100
+++ new/fcitx5-qt-5.0.17/qt4/inputcontext/qfcitxinputcontext.h  2022-12-16 
03:22:07.600773000 +0100
@@ -114,6 +114,7 @@
     void deleteSurroundingText(int offset, unsigned int nchar);
     void forwardKey(unsigned int keyval, unsigned int state, bool type);
     void createInputContextFinished(const QByteArray &uuid);
+    void serverSideFocusOut();
     void cleanUp();
     void windowDestroyed(QObject *object);
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/dbusaddons/fcitxqtinputcontextproxy.h 
new/fcitx5-qt-5.0.17/qt5/dbusaddons/fcitxqtinputcontextproxy.h
--- old/fcitx5-qt-5.0.16/qt5/dbusaddons/fcitxqtinputcontextproxy.h      
2022-11-16 02:02:01.305165000 +0100
+++ new/fcitx5-qt-5.0.17/qt5/dbusaddons/fcitxqtinputcontextproxy.h      
2022-12-16 03:22:07.600773000 +0100
@@ -73,6 +73,7 @@
                             int candidateIndex, int layoutHint, bool hasPrev,
                             bool hasNext);
     void inputContextCreated(const QByteArray &uuid);
+    void notifyFocusOut();
 
 private:
     FcitxQtInputContextProxyPrivate *const d_ptr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/dbusaddons/fcitxqtinputcontextproxy_p.h 
new/fcitx5-qt-5.0.17/qt5/dbusaddons/fcitxqtinputcontextproxy_p.h
--- old/fcitx5-qt-5.0.16/qt5/dbusaddons/fcitxqtinputcontextproxy_p.h    
2022-07-26 09:21:11.514872000 +0200
+++ new/fcitx5-qt-5.0.17/qt5/dbusaddons/fcitxqtinputcontextproxy_p.h    
2022-12-16 03:22:07.600773000 +0100
@@ -144,6 +144,9 @@
         QObject::connect(icproxy_,
                          &FcitxQtInputContextProxyImpl::UpdateClientSideUI, q,
                          &FcitxQtInputContextProxy::updateClientSideUI);
+        QObject::connect(icproxy_,
+                         &FcitxQtInputContextProxyImpl::NotifyFocusOut, q,
+                         &FcitxQtInputContextProxy::notifyFocusOut);
 
         delete createInputContextWatcher_;
         createInputContextWatcher_ = nullptr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/dbusaddons/fcitxqtinputcontextproxyimpl.h 
new/fcitx5-qt-5.0.17/qt5/dbusaddons/fcitxqtinputcontextproxyimpl.h
--- old/fcitx5-qt-5.0.16/qt5/dbusaddons/fcitxqtinputcontextproxyimpl.h  
2022-11-16 02:02:01.305165000 +0100
+++ new/fcitx5-qt-5.0.17/qt5/dbusaddons/fcitxqtinputcontextproxyimpl.h  
2022-12-16 03:22:07.600773000 +0100
@@ -147,6 +147,7 @@
     void CurrentIM(const QString &name, const QString &uniqueName, const 
QString &langCode);
     void DeleteSurroundingText(int offset, unsigned int nchar);
     void ForwardKey(unsigned int keyval, unsigned int state, bool type);
+    void NotifyFocusOut();
     void UpdateClientSideUI(FcitxQtFormattedPreeditList preedit, int 
cursorpos, FcitxQtFormattedPreeditList auxUp, FcitxQtFormattedPreeditList 
auxDown, FcitxQtStringKeyValueList candidates, int candidateIndex, int 
layoutHint, bool hasPrev, bool hasNext);
     void UpdateFormattedPreedit(FcitxQtFormattedPreeditList str, int 
cursorpos);
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/dbusaddons/interfaces/org.fcitx.Fcitx.InputContext1.xml
 
new/fcitx5-qt-5.0.17/qt5/dbusaddons/interfaces/org.fcitx.Fcitx.InputContext1.xml
--- 
old/fcitx5-qt-5.0.16/qt5/dbusaddons/interfaces/org.fcitx.Fcitx.InputContext1.xml
    2022-11-16 02:02:01.305165000 +0100
+++ 
new/fcitx5-qt-5.0.17/qt5/dbusaddons/interfaces/org.fcitx.Fcitx.InputContext1.xml
    2022-12-15 19:23:46.340683000 +0100
@@ -101,5 +101,7 @@
       <arg name="state" type="u"/>
       <arg name="type" type="b"/>
     </signal>
+    <signal name="NotifyFocusOut">
+    </signal>
   </interface>
 </node>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/platforminputcontext/CMakeLists.txt 
new/fcitx5-qt-5.0.17/qt5/platforminputcontext/CMakeLists.txt
--- old/fcitx5-qt-5.0.16/qt5/platforminputcontext/CMakeLists.txt        
2022-05-17 06:11:02.655533300 +0200
+++ new/fcitx5-qt-5.0.17/qt5/platforminputcontext/CMakeLists.txt        
2022-11-26 23:37:11.697840000 +0100
@@ -40,6 +40,7 @@
                           Qt5::Core
                           Qt5::Gui
                           Qt5::DBus
+                          Qt5::Widgets
                           XCB::XCB
                           Fcitx5Qt5::DBusAddons
                           XKBCommon::XKBCommon
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/platforminputcontext/fcitxcandidatewindow.cpp 
new/fcitx5-qt-5.0.17/qt5/platforminputcontext/fcitxcandidatewindow.cpp
--- old/fcitx5-qt-5.0.16/qt5/platforminputcontext/fcitxcandidatewindow.cpp      
2022-09-09 01:15:23.014234300 +0200
+++ new/fcitx5-qt-5.0.17/qt5/platforminputcontext/fcitxcandidatewindow.cpp      
2023-02-01 20:59:07.684791300 +0100
@@ -83,11 +83,21 @@
     QRect boundingRect_;
 };
 
-FcitxCandidateWindow::FcitxCandidateWindow(QWindow *window, FcitxTheme *theme)
-    : QWindow(), theme_(theme), parent_(window) {
-    setFlags(Qt::ToolTip | Qt::FramelessWindowHint |
-             Qt::BypassWindowManagerHint | Qt::WindowDoesNotAcceptFocus |
-             Qt::NoDropShadowWindowHint);
+FcitxCandidateWindow::FcitxCandidateWindow(QWindow *window,
+                                           QFcitxPlatformInputContext *context)
+    : QWindow(), context_(context), theme_(context->theme()), parent_(window) {
+    constexpr Qt::WindowFlags commonFlags = Qt::FramelessWindowHint |
+                                            Qt::WindowDoesNotAcceptFocus |
+                                            Qt::NoDropShadowWindowHint;
+    if (isWayland_) {
+        // Qt::ToolTip ensures wayland doesn't grab focus.
+        // Not using Qt::BypassWindowManagerHint ensures wayland handle
+        // fractional scale.
+        setFlags(Qt::ToolTip | commonFlags);
+    } else {
+        // Qt::Popup ensures X11 doesn't apply tooltip animation under kwin.
+        setFlags(Qt::Popup | Qt::BypassWindowManagerHint | commonFlags);
+    }
     if (isWayland_) {
         setTransientParent(parent_);
     }
@@ -356,7 +366,7 @@
     bool candidatesVisible = !candidates.isEmpty();
     bool visible =
         preeditVisible || auxUpVisbile || auxDownVisible || candidatesVisible;
-    auto window = QGuiApplication::focusWindow();
+    auto window = context_->focusWindowWrapper();
     if (!theme_ || !visible || !window || window != parent_) {
         hide();
         return;
@@ -413,8 +423,7 @@
         sizeWithoutShadow.setHeight(0);
     }
 
-    QRect cursorRect =
-        QGuiApplication::inputMethod()->cursorRectangle().toRect();
+    QRect cursorRect = context_->cursorRectangleWrapper();
     QRect screenGeometry;
     // Try to apply the screen edge detection over the window, because if we
     // intent to use this with wayland. It we have no information above screen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/platforminputcontext/fcitxcandidatewindow.h 
new/fcitx5-qt-5.0.17/qt5/platforminputcontext/fcitxcandidatewindow.h
--- old/fcitx5-qt-5.0.16/qt5/platforminputcontext/fcitxcandidatewindow.h        
2021-03-05 16:48:24.646558500 +0100
+++ new/fcitx5-qt-5.0.17/qt5/platforminputcontext/fcitxcandidatewindow.h        
2022-11-26 23:37:11.697840000 +0100
@@ -21,14 +21,15 @@
 
 namespace fcitx {
 
-struct FcitxQtICData;
 class FcitxTheme;
 class MultilineText;
+class QFcitxPlatformInputContext;
 
 class FcitxCandidateWindow : public QWindow {
     Q_OBJECT
 public:
-    explicit FcitxCandidateWindow(QWindow *window, FcitxTheme *theme);
+    explicit FcitxCandidateWindow(QWindow *window,
+                                  QFcitxPlatformInputContext *context);
     ~FcitxCandidateWindow();
 
     void render(QPainter *painter);
@@ -69,6 +70,7 @@
     const bool isWayland_ =
         QGuiApplication::platformName().startsWith("wayland");
     QSize actualSize_;
+    QPointer<QFcitxPlatformInputContext> context_;
     QPointer<FcitxTheme> theme_;
     QBackingStore *backingStore_;
     QTextLayout upperLayout_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/platforminputcontext/qfcitxplatforminputcontext.cpp 
new/fcitx5-qt-5.0.17/qt5/platforminputcontext/qfcitxplatforminputcontext.cpp
--- 
old/fcitx5-qt-5.0.16/qt5/platforminputcontext/qfcitxplatforminputcontext.cpp    
    2022-11-18 20:22:31.226828600 +0100
+++ 
new/fcitx5-qt-5.0.17/qt5/platforminputcontext/qfcitxplatforminputcontext.cpp    
    2023-03-11 02:43:45.844250200 +0100
@@ -7,11 +7,12 @@
 
 #include <QDBusConnection>
 #include <QDebug>
-#include <QGuiApplication>
 #include <QInputMethod>
 #include <QKeyEvent>
+#include <QMetaMethod>
 #include <QPalette>
 #include <QTextCharFormat>
+#include <QWidget>
 #include <QWindow>
 #include <qpa/qplatformcursor.h>
 #include <qpa/qplatformnativeinterface.h>
@@ -132,18 +133,6 @@
     return locale;
 }
 
-static bool objectAcceptsInputMethod() {
-    bool enabled = false;
-    QObject *object = qApp->focusObject();
-    if (object) {
-        QInputMethodQueryEvent query(Qt::ImEnabled);
-        QGuiApplication::sendEvent(object, &query);
-        enabled = query.value(Qt::ImEnabled).toBool();
-    }
-
-    return enabled;
-}
-
 struct xkb_context *_xkb_context_new_helper() {
     struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
     if (context) {
@@ -153,6 +142,95 @@
     return context;
 }
 
+QObject *deepestFocusProxy(QObject *object) {
+    auto *widget = qobject_cast<QWidget *>(object);
+    if (!widget) {
+        return object;
+    }
+
+    while (auto *proxy = widget->focusProxy()) {
+        widget = proxy;
+    }
+    return widget;
+}
+
+FcitxQtICData::FcitxQtICData(QFcitxPlatformInputContext *context,
+                             QWindow *window)
+    : proxy(new FcitxQtInputContextProxy(context->watcher(), context)),
+      context_(context), window_(window) {
+    proxy->setProperty("icData",
+                       QVariant::fromValue(static_cast<void *>(this)));
+    QObject::connect(window, &QWindow::visibilityChanged, proxy,
+                     [this](bool visible) {
+                         if (!visible) {
+                             resetCandidateWindow();
+                         }
+                     });
+    QObject::connect(context_->watcher(), &FcitxQtWatcher::availabilityChanged,
+                     proxy, [this](bool avail) {
+                         if (!avail) {
+                             resetCandidateWindow();
+                         }
+                     });
+    window->installEventFilter(this);
+}
+FcitxQtICData::~FcitxQtICData() {
+    if (window_) {
+        window_->removeEventFilter(this);
+    }
+    delete proxy;
+    resetCandidateWindow();
+}
+
+bool FcitxQtICData::eventFilter(QObject *, QEvent *event) {
+    if (event->type() != QMouseEvent::MouseButtonPress) {
+        return false;
+    }
+    auto focusObject = context_->focusObjectWrapper();
+    if (!focusObject) {
+        return false;
+    }
+    if (!window_ || window_ != context_->focusWindowWrapper() ||
+        !context_->hasPreedit()) {
+        return false;
+    }
+    if (focusObject->metaObject()->className() ==
+            QLatin1String("KateViewInternal") ||
+        (focusObject->metaObject()->className() == QLatin1String("QtWidget") &&
+         QCoreApplication::applicationFilePath().endsWith("soffice.bin")) ||
+        focusObject->metaObject()->className() ==
+            QLatin1String("Konsole::TerminalDisplay")) {
+        if (context_->commitPreedit()) {
+            if (proxy->isValid()) {
+                proxy->reset();
+            }
+        }
+    }
+    return false;
+}
+
+FcitxCandidateWindow *FcitxQtICData::candidateWindow() {
+    if (!candidateWindow_) {
+        candidateWindow_ = new FcitxCandidateWindow(window(), context_);
+        QObject::connect(
+            candidateWindow_, &FcitxCandidateWindow::candidateSelected, proxy,
+            [proxy = proxy](int index) { proxy->selectCandidate(index); });
+        QObject::connect(candidateWindow_, &FcitxCandidateWindow::prevClicked,
+                         proxy, [proxy = proxy]() { proxy->prevPage(); });
+        QObject::connect(candidateWindow_, &FcitxCandidateWindow::nextClicked,
+                         proxy, [proxy = proxy]() { proxy->nextPage(); });
+    }
+    return candidateWindow_;
+}
+
+void FcitxQtICData::resetCandidateWindow() {
+    if (auto *w = candidateWindow_.data()) {
+        candidateWindow_ = nullptr;
+        w->deleteLater();
+        return;
+    }
+}
+
 QFcitxPlatformInputContext::QFcitxPlatformInputContext()
     : watcher_(new FcitxQtWatcher(
           QDBusConnection::connectToBus(QDBusConnection::SessionBus, "fcitx"),
@@ -180,6 +258,30 @@
     delete watcher_;
 }
 
+bool QFcitxPlatformInputContext::objectAcceptsInputMethod() const {
+    bool enabled = false;
+    QObject *object = qGuiApp->focusObject();
+    if (object) {
+        QInputMethodQueryEvent query(Qt::ImEnabled);
+        QGuiApplication::sendEvent(object, &query);
+        enabled = query.value(Qt::ImEnabled).toBool();
+    }
+
+    QObject *realFocusObject = focusObjectWrapper();
+    // Make sure we don't query same object twice.
+    if (realFocusObject && realFocusObject != object && !enabled) {
+        QInputMethodQueryEvent query(Qt::ImEnabled);
+        QGuiApplication::sendEvent(realFocusObject, &query);
+        enabled = query.value(Qt::ImEnabled).toBool();
+    }
+
+    return enabled;
+}
+
+bool QFcitxPlatformInputContext::shouldDisableInputMethod() const {
+    return !inputMethodAccepted() && !objectAcceptsInputMethod();
+}
+
 void QFcitxPlatformInputContext::cleanUp() {
     icMap_.clear();
 
@@ -214,16 +316,21 @@
     }
 }
 
-void QFcitxPlatformInputContext::commitPreedit(QPointer<QObject> input) {
-    if (!input)
-        return;
-    if (commitPreedit_.length() <= 0)
-        return;
+bool QFcitxPlatformInputContext::commitPreedit(QPointer<QObject> input) {
+    if (!input) {
+        return false;
+    }
+    if (preeditList_.isEmpty()) {
+        return false;
+    }
     QInputMethodEvent e;
-    e.setCommitString(commitPreedit_);
+    if (!commitPreedit_.isEmpty()) {
+        e.setCommitString(commitPreedit_);
+    }
     commitPreedit_.clear();
     preeditList_.clear();
     QCoreApplication::sendEvent(input, &e);
+    return true;
 }
 
 bool checkUtf8(const QByteArray &byteArray) {
@@ -243,7 +350,7 @@
 }
 
 void QFcitxPlatformInputContext::update(Qt::InputMethodQueries queries) {
-    QWindow *window = qApp->focusWindow();
+    QWindow *window = focusWindowWrapper();
     FcitxQtInputContextProxy *proxy = validICByWindow(window);
     if (!proxy)
         return;
@@ -251,7 +358,7 @@
     FcitxQtICData &data = *static_cast<FcitxQtICData *>(
         proxy->property("icData").value<void *>());
 
-    QObject *input = qApp->focusObject();
+    QObject *input = focusObjectWrapper();
     if (!input)
         return;
 
@@ -263,7 +370,7 @@
     }
 
     if (queries & Qt::ImEnabled) {
-        if (!inputMethodAccepted() || !objectAcceptsInputMethod()) {
+        if (shouldDisableInputMethod()) {
             addCapability(data, FcitxCapabilityFlag_Disable);
         } else {
             removeCapability(data, FcitxCapabilityFlag_Disable);
@@ -302,8 +409,8 @@
     do {
         if (!useSurroundingText_)
             break;
-        if (!((queries & Qt::ImSurroundingText) &&
-              (queries & Qt::ImCursorPosition)))
+        if (!(queries & (Qt::ImSurroundingText | Qt::ImCursorPosition |
+                         Qt::ImAnchorPosition)))
             break;
         if ((data.capability & FcitxCapabilityFlag_Password) ||
             (data.capability & FcitxCapabilityFlag_Sensitive))
@@ -354,10 +461,28 @@
     } while (0);
 }
 
-void QFcitxPlatformInputContext::commit() { QPlatformInputContext::commit(); }
+void QFcitxPlatformInputContext::commit() {
+    FcitxQtInputContextProxy *proxy = validICByWindow(lastWindow_);
+    commitPreedit(lastObject_);
+    if (proxy) {
+        proxy->reset();
+        FcitxQtICData &data = *static_cast<FcitxQtICData *>(
+            proxy->property("icData").value<void *>());
+        data.resetCandidateWindow();
+    }
+}
 
 void QFcitxPlatformInputContext::setFocusObject(QObject *object) {
     Q_UNUSED(object);
+
+    // Since we have a wrapper, it's possible that real focus object is not
+    // changed. Do not emit focusOut and focusIn if:
+    // realFocusObject does not change.
+    QObject *realFocusObject = focusObjectWrapper();
+    if (lastObject_ == realFocusObject) {
+        return;
+    }
+
     FcitxQtInputContextProxy *proxy = validICByWindow(lastWindow_);
     commitPreedit(lastObject_);
     if (proxy) {
@@ -367,9 +492,9 @@
         data.resetCandidateWindow();
     }
 
-    QWindow *window = qApp->focusWindow();
+    QWindow *window = focusWindowWrapper();
     lastWindow_ = window;
-    lastObject_ = object;
+    lastObject_ = realFocusObject;
     // Always create IC Data for window.
     if (window) {
         proxy = validICByWindow(window);
@@ -412,7 +537,7 @@
 }
 
 void QFcitxPlatformInputContext::cursorRectChanged() {
-    QWindow *inputWindow = qApp->focusWindow();
+    QWindow *inputWindow = focusWindowWrapper();
     if (!inputWindow)
         return;
     FcitxQtInputContextProxy *proxy = validICByWindow(inputWindow);
@@ -422,7 +547,7 @@
     FcitxQtICData &data = *static_cast<FcitxQtICData *>(
         proxy->property("icData").value<void *>());
 
-    QRect r = qApp->inputMethod()->cursorRectangle().toRect();
+    QRect r = cursorRectangleWrapper();
     if (!r.isValid())
         return;
 
@@ -467,7 +592,7 @@
     data->rect = QRect();
 
     if (proxy->isValid()) {
-        QWindow *window = qApp->focusWindow();
+        QWindow *window = focusWindowWrapper();
         setFocusGroupForX11(uuid);
         if (window && window == w) {
             cursorRectChanged();
@@ -493,7 +618,7 @@
     }
     flag |= FcitxCapabilityFlag_ClientSideInputPanel;
 
-    if (!inputMethodAccepted() || !objectAcceptsInputMethod()) {
+    if (shouldDisableInputMethod()) {
         flag |= FcitxCapabilityFlag_Disable;
     }
 
@@ -514,7 +639,7 @@
     cursorPos_ = 0;
     preeditList_.clear();
     commitPreedit_.clear();
-    QObject *input = qApp->focusObject();
+    QObject *input = qGuiApp->focusObject();
     if (!input)
         return;
 
@@ -525,7 +650,7 @@
 
 void QFcitxPlatformInputContext::updateFormattedPreedit(
     const FcitxQtFormattedPreeditList &preeditList, int cursorPos) {
-    QObject *input = qApp->focusObject();
+    QObject *input = qGuiApp->focusObject();
     if (!input)
         return;
     if (cursorPos == cursorPos_ && preeditList == preeditList_)
@@ -586,7 +711,7 @@
     const FcitxQtFormattedPreeditList &auxDown,
     const FcitxQtStringKeyValueList &candidates, int candidateIndex,
     int layoutHint, bool hasPrev, bool hasNext) {
-    QObject *input = qApp->focusObject();
+    QObject *input = qGuiApp->focusObject();
     if (!input) {
         return;
     }
@@ -599,12 +724,9 @@
     FcitxQtICData *data =
         static_cast<FcitxQtICData *>(proxy->property("icData").value<void 
*>());
     auto w = data->window();
-    auto window = qApp->focusWindow();
+    auto window = focusWindowWrapper();
     if (window && w == window) {
-        if (!theme_) {
-            theme_ = new FcitxTheme(this);
-        }
-        data->candidateWindow(theme_)->updateClientSideUI(
+        data->candidateWindow()->updateClientSideUI(
             preedit, cursorpos, auxUp, auxDown, candidates, candidateIndex,
             layoutHint, hasPrev, hasNext);
     }
@@ -612,7 +734,7 @@
 
 void QFcitxPlatformInputContext::deleteSurroundingText(int offset,
                                                        unsigned int _nchar) {
-    QObject *input = qApp->focusObject();
+    QObject *input = qGuiApp->focusObject();
     if (!input)
         return;
 
@@ -678,8 +800,8 @@
     FcitxQtICData &data = *static_cast<FcitxQtICData *>(
         proxy->property("icData").value<void *>());
     auto *w = data.window();
-    QObject *input = qApp->focusObject();
-    auto window = qApp->focusWindow();
+    QObject *input = qGuiApp->focusObject();
+    auto window = focusWindowWrapper();
     if (input && window && w == window) {
         std::unique_ptr<QKeyEvent> keyevent{
             createKeyEvent(keyval, state, type, data.event.get())};
@@ -700,6 +822,12 @@
     }
 }
 
+void QFcitxPlatformInputContext::serverSideFocusOut() {
+    if (lastObject_ == focusObjectWrapper()) {
+        commitPreedit();
+    }
+}
+
 QLocale QFcitxPlatformInputContext::locale() const { return locale_; }
 
 bool QFcitxPlatformInputContext::hasCapability(Capability) const {
@@ -711,7 +839,7 @@
     if (iter == icMap_.end()) {
         auto result =
             icMap_.emplace(std::piecewise_construct, std::forward_as_tuple(w),
-                           std::forward_as_tuple(watcher_, w));
+                           std::forward_as_tuple(this, w));
         connect(w, &QObject::destroyed, this,
                 &QFcitxPlatformInputContext::windowDestroyed);
         iter = result.first;
@@ -736,6 +864,8 @@
                 &QFcitxPlatformInputContext::updateCurrentIM);
         connect(data.proxy, &FcitxQtInputContextProxy::updateClientSideUI, 
this,
                 &QFcitxPlatformInputContext::updateClientSideUI);
+        connect(data.proxy, &FcitxQtInputContextProxy::notifyFocusOut, this,
+                &QFcitxPlatformInputContext::serverSideFocusOut);
     }
 }
 
@@ -835,16 +965,16 @@
         quint32 state = keyEvent->nativeModifiers();
         bool isRelease = keyEvent->type() == QEvent::KeyRelease;
 
-        if (!inputMethodAccepted() && !objectAcceptsInputMethod())
+        if (shouldDisableInputMethod())
             break;
 
-        QObject *input = qApp->focusObject();
+        QObject *input = qGuiApp->focusObject();
 
         if (!input) {
             break;
         }
 
-        FcitxQtInputContextProxy *proxy = validICByWindow(qApp->focusWindow());
+        FcitxQtInputContextProxy *proxy = 
validICByWindow(focusWindowWrapper());
 
         if (!proxy) {
             if (filterEventFallback(keyval, keycode, state, isRelease)) {
@@ -880,7 +1010,7 @@
             }
         } else {
             ProcessKeyWatcher *watcher = new ProcessKeyWatcher(
-                *keyEvent, qApp->focusWindow(), reply, proxy);
+                *keyEvent, focusWindowWrapper(), reply, proxy);
             connect(watcher, &QDBusPendingCallWatcher::finished, this,
                     &QFcitxPlatformInputContext::processKeyEventFinished);
             return true;
@@ -960,7 +1090,7 @@
     if (icMap_.empty()) {
         return nullptr;
     }
-    QWindow *window = qApp->focusWindow();
+    QWindow *window = focusWindowWrapper();
     return validICByWindow(window);
 }
 
@@ -1017,4 +1147,61 @@
 
     return true;
 }
+
+QWindow *QFcitxPlatformInputContext::focusWindowWrapper() const {
+    QWindow *focusWindow = qGuiApp->focusWindow();
+    do {
+        if (!focusWindow) {
+            break;
+        }
+        QObject *realFocusObject = focusObjectWrapper();
+        if (qGuiApp->focusObject() == realFocusObject) {
+            break;
+        }
+        auto *widget = qobject_cast<QWidget *>(realFocusObject);
+        if (!widget) {
+            break;
+        }
+        auto *window = widget->topLevelWidget()->windowHandle();
+        if (!window) {
+            break;
+        }
+        focusWindow = window;
+    } while (0);
+    return focusWindow;
+}
+
+QObject *QFcitxPlatformInputContext::focusObjectWrapper() const {
+    return deepestFocusProxy(qGuiApp->focusObject());
+}
+
+QRect QFcitxPlatformInputContext::cursorRectangleWrapper() const {
+    QObject *object = focusObjectWrapper();
+    QRect r;
+    if (object && object != qGuiApp->focusObject() && object->isWidgetType()) {
+        // Logic is borrowed from QWidgetPrivate::updateWidgetTransform.
+        // If focusObject mismatches, the inputItemTransform will also 
mismatch,
+        // so we need to do our own calculation.
+        auto *widget = qobject_cast<QWidget *>(object);
+        QTransform t;
+        const QPoint p = widget->mapTo(widget->topLevelWidget(), QPoint(0, 0));
+        t.translate(p.x(), p.y());
+        r = widget->inputMethodQuery(Qt::ImCursorRectangle).toRect();
+        if (r.isValid()) {
+            r = t.mapRect(r);
+        }
+        return r;
+    } else {
+        r = qGuiApp->inputMethod()->cursorRectangle().toRect();
+    }
+    return r;
+}
+
+FcitxTheme *QFcitxPlatformInputContext::theme() {
+    if (!theme_) {
+        theme_ = new FcitxTheme(this);
+    }
+    return theme_;
+}
+
 } // namespace fcitx
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt5/platforminputcontext/qfcitxplatforminputcontext.h 
new/fcitx5-qt-5.0.17/qt5/platforminputcontext/qfcitxplatforminputcontext.h
--- old/fcitx5-qt-5.0.16/qt5/platforminputcontext/qfcitxplatforminputcontext.h  
2022-11-18 20:18:02.538208700 +0100
+++ new/fcitx5-qt-5.0.17/qt5/platforminputcontext/qfcitxplatforminputcontext.h  
2023-03-11 02:43:45.844250200 +0100
@@ -26,60 +26,19 @@
 namespace fcitx {
 
 class FcitxQtConnection;
-class FcitxTheme;
+class QFcitxPlatformInputContext;
 
-struct FcitxQtICData {
-    FcitxQtICData(FcitxQtWatcher *watcher, QWindow *window)
-        : proxy(new FcitxQtInputContextProxy(watcher, watcher)),
-          watcher_(watcher), window_(window) {
-        proxy->setProperty("icData",
-                           QVariant::fromValue(static_cast<void *>(this)));
-        QObject::connect(window, &QWindow::visibilityChanged, proxy,
-                         [this](bool visible) {
-                             if (!visible) {
-                                 resetCandidateWindow();
-                             }
-                         });
-        QObject::connect(watcher, &FcitxQtWatcher::availabilityChanged, proxy,
-                         [this](bool avail) {
-                             if (!avail) {
-                                 resetCandidateWindow();
-                             }
-                         });
-    }
+class FcitxQtICData : public QObject {
+public:
+    FcitxQtICData(QFcitxPlatformInputContext *context, QWindow *window);
     FcitxQtICData(const FcitxQtICData &that) = delete;
-    ~FcitxQtICData() {
-        delete proxy;
-        resetCandidateWindow();
-    }
+    ~FcitxQtICData();
 
-    FcitxCandidateWindow *candidateWindow(FcitxTheme *theme) {
-        if (!candidateWindow_) {
-            candidateWindow_ = new FcitxCandidateWindow(window(), theme);
-            QObject::connect(
-                candidateWindow_, &FcitxCandidateWindow::candidateSelected,
-                proxy,
-                [proxy = proxy](int index) { proxy->selectCandidate(index); });
-            QObject::connect(candidateWindow_,
-                             &FcitxCandidateWindow::prevClicked, proxy,
-                             [proxy = proxy]() { proxy->prevPage(); });
-            QObject::connect(candidateWindow_,
-                             &FcitxCandidateWindow::nextClicked, proxy,
-                             [proxy = proxy]() { proxy->nextPage(); });
-        }
-        return candidateWindow_;
-    }
+    FcitxCandidateWindow *candidateWindow();
 
     QWindow *window() { return window_.data(); }
-    auto *watcher() { return watcher_; }
 
-    void resetCandidateWindow() {
-        if (auto *w = candidateWindow_.data()) {
-            candidateWindow_ = nullptr;
-            w->deleteLater();
-            return;
-        }
-    }
+    void resetCandidateWindow();
 
     quint64 capability = 0;
     FcitxQtInputContextProxy *proxy;
@@ -89,9 +48,11 @@
     QString surroundingText;
     int surroundingAnchor = -1;
     int surroundingCursor = -1;
+    bool expectingMicroFocusChange = false;
+    bool eventFilter(QObject *watched, QEvent *event) override;
 
 private:
-    FcitxQtWatcher *watcher_;
+    QFcitxPlatformInputContext *context_;
     QPointer<QWindow> window_;
     QPointer<FcitxCandidateWindow> candidateWindow_;
 };
@@ -156,6 +117,17 @@
     QLocale locale() const override;
     bool hasCapability(Capability capability) const override;
 
+    FcitxQtWatcher *watcher() { return watcher_; }
+
+    // Use Wrapper as suffix to avoid upstream add function with same name.
+    QObject *focusObjectWrapper() const;
+    QWindow *focusWindowWrapper() const;
+    QRect cursorRectangleWrapper() const;
+
+    // Initialize theme object on demand.
+    FcitxTheme *theme();
+    bool hasPreedit() const { return !preeditList_.isEmpty(); }
+
 public Q_SLOTS:
     void cursorRectChanged();
     void commitString(const QString &str);
@@ -175,6 +147,8 @@
                             const FcitxQtStringKeyValueList &candidates,
                             int candidateIndex, int layoutHint, bool hasPrev,
                             bool hasNext);
+    void serverSideFocusOut();
+    bool commitPreedit(QPointer<QObject> input = qApp->focusObject());
 private Q_SLOTS:
     void processKeyEventFinished(QDBusPendingCallWatcher *);
 
@@ -204,7 +178,6 @@
     }
 
     void updateCapability(const FcitxQtICData &data);
-    void commitPreedit(QPointer<QObject> input = qApp->focusObject());
     void createICData(QWindow *w);
     FcitxQtInputContextProxy *validIC();
     FcitxQtInputContextProxy *validICByWindow(QWindow *window);
@@ -212,6 +185,8 @@
                              unsigned int state, bool isRelaese);
 
     void updateCursorRect();
+    bool objectAcceptsInputMethod() const;
+    bool shouldDisableInputMethod() const;
 
     FcitxQtWatcher *watcher_;
     QString preedit_;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt6/dbusaddons/fcitxqtinputcontextproxy.h 
new/fcitx5-qt-5.0.17/qt6/dbusaddons/fcitxqtinputcontextproxy.h
--- old/fcitx5-qt-5.0.16/qt6/dbusaddons/fcitxqtinputcontextproxy.h      
2022-11-16 02:02:01.305165000 +0100
+++ new/fcitx5-qt-5.0.17/qt6/dbusaddons/fcitxqtinputcontextproxy.h      
2022-12-16 03:22:07.600773000 +0100
@@ -73,6 +73,7 @@
                             int candidateIndex, int layoutHint, bool hasPrev,
                             bool hasNext);
     void inputContextCreated(const QByteArray &uuid);
+    void notifyFocusOut();
 
 private:
     FcitxQtInputContextProxyPrivate *const d_ptr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt6/dbusaddons/fcitxqtinputcontextproxy_p.h 
new/fcitx5-qt-5.0.17/qt6/dbusaddons/fcitxqtinputcontextproxy_p.h
--- old/fcitx5-qt-5.0.16/qt6/dbusaddons/fcitxqtinputcontextproxy_p.h    
2022-07-26 09:15:07.455659600 +0200
+++ new/fcitx5-qt-5.0.17/qt6/dbusaddons/fcitxqtinputcontextproxy_p.h    
2022-12-16 03:22:07.600773000 +0100
@@ -144,6 +144,9 @@
         QObject::connect(icproxy_,
                          &FcitxQtInputContextProxyImpl::UpdateClientSideUI, q,
                          &FcitxQtInputContextProxy::updateClientSideUI);
+        QObject::connect(icproxy_,
+                         &FcitxQtInputContextProxyImpl::NotifyFocusOut, q,
+                         &FcitxQtInputContextProxy::notifyFocusOut);
 
         delete createInputContextWatcher_;
         createInputContextWatcher_ = nullptr;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt6/dbusaddons/fcitxqtinputcontextproxyimpl.h 
new/fcitx5-qt-5.0.17/qt6/dbusaddons/fcitxqtinputcontextproxyimpl.h
--- old/fcitx5-qt-5.0.16/qt6/dbusaddons/fcitxqtinputcontextproxyimpl.h  
2022-11-16 02:02:01.305165000 +0100
+++ new/fcitx5-qt-5.0.17/qt6/dbusaddons/fcitxqtinputcontextproxyimpl.h  
2022-12-16 03:22:07.600773000 +0100
@@ -147,6 +147,7 @@
     void CurrentIM(const QString &name, const QString &uniqueName, const 
QString &langCode);
     void DeleteSurroundingText(int offset, unsigned int nchar);
     void ForwardKey(unsigned int keyval, unsigned int state, bool type);
+    void NotifyFocusOut();
     void UpdateClientSideUI(FcitxQtFormattedPreeditList preedit, int 
cursorpos, FcitxQtFormattedPreeditList auxUp, FcitxQtFormattedPreeditList 
auxDown, FcitxQtStringKeyValueList candidates, int candidateIndex, int 
layoutHint, bool hasPrev, bool hasNext);
     void UpdateFormattedPreedit(FcitxQtFormattedPreeditList str, int 
cursorpos);
 };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-qt-5.0.16/qt6/platforminputcontext/CMakeLists.txt 
new/fcitx5-qt-5.0.17/qt6/platforminputcontext/CMakeLists.txt
--- old/fcitx5-qt-5.0.16/qt6/platforminputcontext/CMakeLists.txt        
2022-05-17 06:12:29.666836500 +0200
+++ new/fcitx5-qt-5.0.17/qt6/platforminputcontext/CMakeLists.txt        
2022-11-26 23:37:11.701173300 +0100
@@ -41,6 +41,7 @@
                           Qt6::Core
                           Qt6::Gui
                           Qt6::DBus
+                          Qt6::Widgets
                           XCB::XCB
                           Fcitx5Qt6::DBusAddons
                           XKBCommon::XKBCommon

Reply via email to