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