Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package fcitx5-kkc for openSUSE:Factory 
checked in at 2026-10-22 18:24:34
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fcitx5-kkc (Old)
 and      /work/SRC/openSUSE:Factory/.fcitx5-kkc.new.2252680 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "fcitx5-kkc"

Thu Oct 22 18:24:34 2026 rev:13 rq:1386587 version:5.1.11

Changes:
--------
--- /work/SRC/openSUSE:Factory/fcitx5-kkc/fcitx5-kkc.changes    2026-02-09 
11:43:58.019279166 +0100
+++ /work/SRC/openSUSE:Factory/.fcitx5-kkc.new.2252680/fcitx5-kkc.changes       
2026-10-22 18:24:41.973706099 +0200
@@ -1,0 +2,10 @@
+Sat Oct 17 19:53:57 UTC 2026 - Martin Pluskal <[email protected]>
+
+- Update to 5.1.11:
+  * Fix FindLibKKC (correct kkc-1.0 pkgconfig name, link/compile
+    cleanup, keep include dirs working with broken CFLAGS)
+  * UI cleanup: overlay input-method info, signal-driven UI
+    updates, squashed key-event refreshes
+  * Raise floor to fcitx5 >= 5.1.22
+
+-------------------------------------------------------------------

Old:
----
  fcitx5-kkc-5.1.9.tar.zst

New:
----
  fcitx5-kkc-5.1.11.tar.zst

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

Other differences:
------------------
++++++ fcitx5-kkc.spec ++++++
--- /var/tmp/diff_new_pack.dK38iu/_old  2026-10-22 18:24:42.817740281 +0200
+++ /var/tmp/diff_new_pack.dK38iu/_new  2026-10-22 18:24:42.818740321 +0200
@@ -17,38 +17,40 @@
 
 
 Name:           fcitx5-kkc
-Version:        5.1.9
+Version:        5.1.11
 Release:        0
 Summary:        Libkkc input method support for Fcitx5
 License:        GPL-3.0-or-later
-Group:          System/I18n/Japanese
 URL:            https://github.com/fcitx/fcitx5-kkc
 Source:         
https://download.fcitx-im.org/fcitx5/%{name}/%{name}-%{version}.tar.zst
 BuildRequires:  cmake
 BuildRequires:  extra-cmake-modules
-BuildRequires:  fcitx5-devel
 BuildRequires:  fcitx5-qt-devel
 BuildRequires:  gcc-c++
 BuildRequires:  hicolor-icon-theme
-BuildRequires:  libkkc-devel
 BuildRequires:  pkgconfig
 BuildRequires:  qt6-base-devel
 BuildRequires:  zstd
+BuildRequires:  pkgconfig(Fcitx5Config) >= 5.1.22
+BuildRequires:  pkgconfig(Fcitx5Core) >= 5.1.22
+BuildRequires:  pkgconfig(Fcitx5Module) >= 5.1.22
+BuildRequires:  pkgconfig(Fcitx5Utils) >= 5.1.22
+BuildRequires:  pkgconfig(kkc-1.0)
 Requires:       fcitx5
 Requires:       kkc-data
+Supplements:    (fcitx5 and kkc-data)
 Provides:       fcitx-kkc = %{version}
 Obsoletes:      fcitx-kkc <= 0.1.4
 Obsoletes:      fcitx5-kkc-qt6 <= 5.1.6
-Supplements:    (fcitx5 and kkc-data)
 %if 0%{?suse_version} <= 1520
-BuildRequires:  appstream-glib-devel
+BuildRequires:  pkgconfig(appstream-glib)
 %endif
 
 %description
 This package provides libkkc input method support for Fcitx5.
 
 %prep
-%setup -q -n %{name}-%{version}
+%setup -q
 
 %build
 %if 0%{?suse_version} == 1500

++++++ fcitx5-kkc-5.1.9.tar.zst -> fcitx5-kkc-5.1.11.tar.zst ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/CMakeLists.txt 
new/fcitx5-kkc-5.1.11/CMakeLists.txt
--- old/fcitx5-kkc-5.1.9/CMakeLists.txt 2025-12-22 07:18:12.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/CMakeLists.txt        2026-09-06 04:39:57.000000000 
+0200
@@ -1,9 +1,9 @@
-cmake_minimum_required(VERSION 3.6)
+cmake_minimum_required(VERSION 3.13)
 
 # The Project Name
-project(fcitx5-kkc VERSION 5.1.9)
+project(fcitx5-kkc VERSION 5.1.11)
 
-set(REQUIRED_FCITX_VERSION 5.1.13)
+set(REQUIRED_FCITX_VERSION 5.1.22)
 find_package(ECM REQUIRED 1.0.0)
 set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake" 
${CMAKE_MODULE_PATH})
 include(FeatureSummary)
@@ -16,9 +16,6 @@
 find_package(Fcitx5Core ${REQUIRED_FCITX_VERSION} REQUIRED)
 find_package(LibKKC REQUIRED)
 find_package(Gettext REQUIRED)
-pkg_check_modules(Gee IMPORTED_TARGET "gee-0.8" REQUIRED)
-pkg_check_modules(JSonGlib IMPORTED_TARGET "json-glib-1.0" REQUIRED)
-pkg_check_modules(GObject2 IMPORTED_TARGET "gobject-2.0" REQUIRED)
 
 if (ENABLE_QT)
     set(QT_MAJOR_VERSION 6)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/README.md 
new/fcitx5-kkc-5.1.11/README.md
--- old/fcitx5-kkc-5.1.9/README.md      2025-12-22 07:18:12.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/README.md     2026-09-06 04:39:57.000000000 +0200
@@ -3,6 +3,6 @@
 This provides libkkc input method support for fcitx5. Released
 under GPL3+.
 
-[![Jenkins Build 
Status](https://img.shields.io/jenkins/s/https/jenkins.fcitx-im.org/job/fcitx5-kkc.svg)](https://jenkins.fcitx-im.org/job/fcitx5-kkc/)
+[![Jenkins 
Build](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.fcitx-im.org%2Fjob%2Ffcitx5-kkc%2F)](https://jenkins.fcitx-im.org/job/fcitx5-kkc/)
 
 [![Coverity Scan 
Status](https://img.shields.io/coverity/scan/14631.svg)](https://scan.coverity.com/projects/fcitx-fcitx5-kkc)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/cmake/FindLibKKC.cmake 
new/fcitx5-kkc-5.1.11/cmake/FindLibKKC.cmake
--- old/fcitx5-kkc-5.1.9/cmake/FindLibKKC.cmake 2025-12-22 07:18:12.000000000 
+0100
+++ new/fcitx5-kkc-5.1.11/cmake/FindLibKKC.cmake        2026-09-06 
04:39:57.000000000 +0200
@@ -17,38 +17,40 @@
 # use pkg-config to get the directories and then use these values
 # in the find_path() and find_library() calls
 find_package(PkgConfig QUIET)
-pkg_check_modules(PC_LibKKC QUIET libkkc)
+pkg_check_modules(PC_LibKKC QUIET kkc-1.0)
 
 find_path(LIBKKC_INCLUDE_DIR NAMES libkkc/libkkc.h
    HINTS
-   ${PC_LIBKKC_INCLUDEDIR}
-   ${PC_LIBKKC_INCLUDE_DIRS}
+   ${PC_LibKKC_INCLUDEDIR}
+   ${PC_LibKKC_INCLUDE_DIRS}
    )
 
 find_library(LIBKKC_LIBRARIES NAMES kkc
    HINTS
-   ${PC_LIBKKC_LIBDIR}
-   ${PC_LIBKKC_LIBRARY_DIRS}
+   ${PC_LibKKC_LIBDIR}
+   ${PC_LibKKC_LIBRARY_DIRS}
    )
 
-if(PC_LIBKKC_VERSION)
-    set(LIBKKC_VERSION_STRING ${PC_LIBKKC_VERSION})
+if(PC_LibKKC_FOUND)
+    set(LIBKKC_VERSION_STRING ${PC_LibKKC_VERSION})
 endif()
 
 # handle the QUIETLY and REQUIRED arguments and set LIBKKC_FOUND to TRUE if
 # all listed variables are TRUE
 include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(LibKKC
-                                  REQUIRED_VARS LIBKKC_LIBRARIES 
LIBKKC_INCLUDE_DIR
+                                  REQUIRED_VARS LIBKKC_VERSION_STRING 
LIBKKC_LIBRARIES LIBKKC_INCLUDE_DIR
                                   VERSION_VAR LIBKKC_VERSION_STRING)
 
 mark_as_advanced(LIBKKC_INCLUDE_DIR LIBKKC_LIBRARIES)
 
 if (LIBKKC_FOUND AND NOT TARGET LibKKC::LibKKC)
-    add_library(LibKKC::LibKKC UNKNOWN IMPORTED)
+    add_library(LibKKC::LibKKC INTERFACE IMPORTED)
     set_target_properties(LibKKC::LibKKC PROPERTIES
-        IMPORTED_LOCATION "${LIBKKC_LIBRARIES}"
+        INTERFACE_COMPILE_OPTIONS "${PC_LibKKC_CFLAGS}"
         INTERFACE_INCLUDE_DIRECTORIES "${LIBKKC_INCLUDE_DIR}"
+        INTERFACE_LINK_OPTIONS "${PC_LibKKC_LDFLAGS_OTHER}"
+        INTERFACE_LINK_LIBRARIES "${PC_LibKKC_LINK_LIBRARIES}"
     )
 endif()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/gui/CMakeLists.txt 
new/fcitx5-kkc-5.1.11/gui/CMakeLists.txt
--- old/fcitx5-kkc-5.1.9/gui/CMakeLists.txt     2025-12-22 07:18:12.000000000 
+0100
+++ new/fcitx5-kkc-5.1.11/gui/CMakeLists.txt    2026-09-06 04:39:57.000000000 
+0200
@@ -28,7 +28,7 @@
   Qt${QT_MAJOR_VERSION}::Core
   Qt${QT_MAJOR_VERSION}::Widgets
   Fcitx5Qt${QT_MAJOR_VERSION}::WidgetsAddons
-  LibKKC::LibKKC PkgConfig::GObject2 PkgConfig::JSonGlib PkgConfig::Gee
+  LibKKC::LibKKC
   )
 
 install(TARGETS fcitx5-kkc-config DESTINATION 
${CMAKE_INSTALL_LIBDIR}/fcitx5/qt${QT_MAJOR_VERSION})
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/fcitx5-kkc-5.1.9/org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in 
new/fcitx5-kkc-5.1.11/org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in
--- old/fcitx5-kkc-5.1.9/org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in     
2025-12-22 07:18:12.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in    
2026-09-06 04:39:57.000000000 +0200
@@ -14,6 +14,8 @@
   <url type="vcs-browser">https://github.com/fcitx/fcitx5-kkc</url>
   <project_group>Fcitx</project_group>
   <releases>
+    <release version="5.1.11" date="2026-09-05"/>
+    <release version="5.1.10" date="2026-03-17"/>
     <release version="5.1.9" date="2025-12-21"/>
     <release version="5.1.8" date="2025-10-16"/>
     <release version="5.1.7" date="2025-06-15"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/po/LINGUAS 
new/fcitx5-kkc-5.1.11/po/LINGUAS
--- old/fcitx5-kkc-5.1.9/po/LINGUAS     2025-12-22 07:18:12.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/po/LINGUAS    2026-09-06 04:39:57.000000000 +0200
@@ -5,8 +5,10 @@
 fr
 he
 ja
+ka
 ko
 ru
+sv
 tr
 vi
 zh_CN
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/po/ka.po 
new/fcitx5-kkc-5.1.11/po/ka.po
--- old/fcitx5-kkc-5.1.9/po/ka.po       1970-01-01 01:00:00.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/po/ka.po      2026-09-06 04:39:57.000000000 +0200
@@ -0,0 +1,252 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the fcitx5-kkc package.
+#
+# Translators:
+# Temuri Doghonadze <[email protected]>, 2026
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: fcitx5-kkc\n"
+"Report-Msgid-Bugs-To: [email protected]\n"
+"POT-Creation-Date: 2026-02-01 20:24+0000\n"
+"PO-Revision-Date: 2017-12-19 22:05+0000\n"
+"Last-Translator: Temuri Doghonadze <[email protected]>, 2026\n"
+"Language-Team: Georgian (https://app.transifex.com/fcitx/teams/12005/ka/)\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#. i18n: file: gui/addshortcutdialog.ui:42
+#. i18n: ectx: property (text), widget (QLabel, commandLabel_)
+#: rc.cpp:9
+#, kde-format
+msgid "&Command:"
+msgstr "&ბრძანება:"
+
+#. i18n: file: gui/addshortcutdialog.ui:22
+#. i18n: ectx: property (text), widget (QLabel, inputModeLabel_)
+#: rc.cpp:6
+#, kde-format
+msgid "&Input Mode:"
+msgstr "შეყვანის რეჟიმ&ი:"
+
+#. i18n: file: gui/addshortcutdialog.ui:71
+#. i18n: ectx: property (text), widget (QLabel, keyLabel_)
+#: rc.cpp:12
+#, kde-format
+msgid "&Key:"
+msgstr "&გასაღები:"
+
+#. i18n: file: gui/adddictdialog.ui:42
+#. i18n: ectx: property (text), widget (QLabel, pathLabel_)
+#: rc.cpp:24
+#, kde-format
+msgid "&Path:"
+msgstr "&ბილიკი:"
+
+#. i18n: file: gui/adddictdialog.ui:22
+#. i18n: ectx: property (text), widget (QLabel, typeLabel_)
+#: rc.cpp:21
+#, kde-format
+msgid "&Type:"
+msgstr "&ტიპი:"
+
+#: src/kkc.h:98
+msgid "Auto Correct"
+msgstr "ავტოკორექცია"
+
+#: src/kkc.h:96
+msgid "Candidate Layout"
+msgstr "კანდიდატის განლაგება"
+
+#: src/kkc.h:108
+msgid "Candidates Page Down"
+msgstr "კანდიდატების გვერდი ქვემოთ"
+
+#: src/kkc.h:102
+msgid "Candidates Page Up"
+msgstr "კანდიდატების გვერდი ზემოთ"
+
+#: src/kkc.h:120
+msgid "Cursor Down"
+msgstr "კურსორი ქვემოთ"
+
+#: src/kkc.h:114
+msgid "Cursor Up"
+msgstr "კურსორი ზემოთ"
+
+#. i18n: file: gui/addshortcutdialog.ui:14
+#. i18n: ectx: property (windowTitle), widget (QDialog, AddShortcutDialog)
+#. i18n: file: gui/adddictdialog.ui:14
+#. i18n: ectx: property (windowTitle), widget (QDialog, AddDictDialog)
+#: rc.cpp:3 rc.cpp:18
+#, kde-format
+msgid "Dialog"
+msgstr "ფანჯარა"
+
+#: src/kkc.h:131
+msgid "Dictionary"
+msgstr "ლექსიკონი"
+
+#: gui/dictwidget.cpp:36
+msgid "Dictionary Manager"
+msgstr "ლექსიკონის მმართველი"
+
+#: gui/shortcutmodel.cpp:38 src/kkc.cpp:144 src/kkc.h:48
+msgid "Direct input"
+msgstr "პირდაპირი შეყვანა"
+
+#. i18n: file: gui/dictwidget.ui:14
+#. i18n: ectx: property (windowTitle), widget (QWidget, KkcDictWidget)
+#. i18n: file: gui/shortcutwidget.ui:20
+#. i18n: ectx: property (windowTitle), widget (QWidget, KkcShortcutWidget)
+#: rc.cpp:15 rc.cpp:27
+#, kde-format
+msgid "Form"
+msgstr "ფორმა"
+
+#: gui/shortcutmodel.cpp:83
+msgid "Function"
+msgstr "ფუნქცია"
+
+#: gui/shortcutmodel.cpp:37 src/kkc.cpp:141 src/kkc.h:47
+msgid "Half width Katakana"
+msgstr "ნახევარი სიგანის კატაკანა"
+
+#: gui/shortcutmodel.cpp:37 src/kkc.cpp:139 src/kkc.h:46
+msgid "Hiragana"
+msgstr "ჰირაგანა"
+
+#: src/kkc.h:40
+msgid "Horizontal"
+msgstr "ჰორიზონტალური"
+
+#: src/kkc.h:91
+msgid "Initial Input Mode"
+msgstr "საწყისი შეყვანის რეჟიმი"
+
+#: gui/shortcutmodel.cpp:79
+msgid "Input Mode"
+msgstr "შეყვანის რეჟიმი"
+
+#: src/kkc.h:42
+msgid "Japanese"
+msgstr "იაპონური"
+
+#: org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in:8
+msgid "Japanese input method"
+msgstr "შეყვანის იაპონური მეთოდი"
+
+#: org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in:7
+msgid "KKC"
+msgstr "KKC"
+
+#: src/kkc-addon.conf.in.in:2
+msgid "KKC Addon of Fcitx"
+msgstr "Kkc-ის დამატება Fcitx-ისთვის"
+
+#: src/kkc.conf.in:2
+msgid "Kana Kanji"
+msgstr "კანა კანჯი"
+
+#: gui/shortcutmodel.cpp:37 src/kkc.cpp:140 src/kkc.h:46
+msgid "Katakana"
+msgstr "კატაკანა"
+
+#: gui/shortcutmodel.cpp:81
+msgid "Key"
+msgstr "გასაღები"
+
+#: gui/shortcutwidget.cpp:91
+msgid "Key Conflict"
+msgstr "ღილაკების კონფლიქტი"
+
+#: gui/shortcutwidget.cpp:92
+msgid "Key to add is conflict with existing shortcut."
+msgstr "დასამატებელი ღილაკი კონფლიქტშია არსებულ მალსახმობთან."
+
+#: gui/shortcutmodel.cpp:38 src/kkc.cpp:142 src/kkc.h:43 src/kkc.h:47
+msgid "Latin"
+msgstr "ლათინური"
+
+#: src/kkc.h:39
+msgid "Not set"
+msgstr "დაყენებული არაა"
+
+#: src/kkc.h:127
+msgid "Number candidate of Triggers To Show Candidate Window"
+msgstr "ტრიგერების ნომერი კანდიდატის ფანჯრის საჩვენებლად"
+
+#: src/kkc.h:93
+msgid "Page size"
+msgstr "გვერდის ზომა"
+
+#: src/kkc.h:88
+msgid "Punctuation Style"
+msgstr "პუნქტუაციის სტილი"
+
+#. i18n: file: gui/shortcutwidget.ui:28
+#. i18n: ectx: property (text), widget (QLabel, ruleLabel_)
+#: rc.cpp:30
+#, kde-format
+msgid "R&ule:"
+msgstr "_წელი:"
+
+#: src/kkc.h:86
+msgid "Rule"
+msgstr "წესი"
+
+#: src/kkc.h:129
+msgid "Rule Editor"
+msgstr "წესების რედაქტორი"
+
+#: gui/shortcutwidget.cpp:67
+msgid "Save Changes"
+msgstr "ცვლილებების შენახვა"
+
+#: gui/adddictdialog.cpp:73
+msgid "Select Dictionary Directory"
+msgstr "აირჩიეთ ლექსიკონის საქაღალდე"
+
+#: gui/adddictdialog.cpp:58
+msgid "Select Dictionary File"
+msgstr "აირჩიეთ ლექსიკონის ფაილი"
+
+#: gui/shortcutwidget.cpp:58
+msgid "Shortcut Manager"
+msgstr "მალსახმობების მმართველი"
+
+#: src/kkc.h:123
+msgid "Show Annotation"
+msgstr "ანოტაციის ჩვენება"
+
+#: gui/adddictdialog.cpp:31
+msgid "System"
+msgstr "სისტემა"
+
+#: gui/shortcutwidget.cpp:68
+msgid ""
+"The content has changed.\n"
+"Do you want to save the changes or discard them?"
+msgstr ""
+"შემცველობა შეიცვალა.\n"
+"გნებავთ, შეინახოთ ცვლილებები თუ მოვაცილო ისინი?"
+
+#: gui/adddictdialog.cpp:32
+msgid "User"
+msgstr "მომხმარებელი"
+
+#: src/kkc.h:40
+msgid "Vertical"
+msgstr "ვერტიკალური"
+
+#: gui/shortcutmodel.cpp:38 src/kkc.cpp:143 src/kkc.h:43 src/kkc.h:48
+msgid "Wide latin"
+msgstr "ფართო ლათინური"
+
+#: src/kkc.h:44
+msgid "Wide latin Japanese"
+msgstr "ფართო ლათინური იაპონური"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/po/sv.po 
new/fcitx5-kkc-5.1.11/po/sv.po
--- old/fcitx5-kkc-5.1.9/po/sv.po       1970-01-01 01:00:00.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/po/sv.po      2026-09-06 04:39:57.000000000 +0200
@@ -0,0 +1,252 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the fcitx5-kkc package.
+#
+# Translators:
+# Daniel Nylander <[email protected]>, 2026
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: fcitx5-kkc\n"
+"Report-Msgid-Bugs-To: [email protected]\n"
+"POT-Creation-Date: 2026-09-04 20:24+0000\n"
+"PO-Revision-Date: 2017-12-19 22:05+0000\n"
+"Last-Translator: Daniel Nylander <[email protected]>, 2026\n"
+"Language-Team: Swedish (https://app.transifex.com/fcitx/teams/12005/sv/)\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: gui/shortcutwidget.cpp:58
+msgid "Shortcut Manager"
+msgstr "Genvägshanterare"
+
+#: gui/shortcutwidget.cpp:67
+msgid "Save Changes"
+msgstr "Spara ändringar"
+
+#: gui/shortcutwidget.cpp:68
+msgid ""
+"The content has changed.\n"
+"Do you want to save the changes or discard them?"
+msgstr ""
+"Innehållet har ändrats.\n"
+"Vill du spara ändringarna eller förkasta dem?"
+
+#: gui/shortcutwidget.cpp:91
+msgid "Key Conflict"
+msgstr "Tangentkonflikt"
+
+#: gui/shortcutwidget.cpp:92
+msgid "Key to add is conflict with existing shortcut."
+msgstr "Tangenten som ska läggas till står i konflikt med en befintlig genväg."
+
+#: gui/dictwidget.cpp:36
+msgid "Dictionary Manager"
+msgstr "Ordbokshanterare"
+
+#: gui/shortcutmodel.cpp:37 src/kkc.cpp:189 src/kkc.h:46
+msgid "Hiragana"
+msgstr "Hiragana"
+
+#: gui/shortcutmodel.cpp:37 src/kkc.cpp:190 src/kkc.h:46
+msgid "Katakana"
+msgstr "Katakana"
+
+#: gui/shortcutmodel.cpp:37 src/kkc.cpp:191 src/kkc.h:47
+msgid "Half width Katakana"
+msgstr "Katakana med halv bredd"
+
+#: gui/shortcutmodel.cpp:38 src/kkc.cpp:192 src/kkc.h:43 src/kkc.h:47
+msgid "Latin"
+msgstr "Latinsk"
+
+#: gui/shortcutmodel.cpp:38 src/kkc.cpp:193 src/kkc.h:43 src/kkc.h:48
+msgid "Wide latin"
+msgstr "Latinsk med full bredd"
+
+#: gui/shortcutmodel.cpp:38 src/kkc.cpp:194 src/kkc.h:48
+msgid "Direct input"
+msgstr "Direktinmatning"
+
+#: gui/shortcutmodel.cpp:79
+msgid "Input Mode"
+msgstr "Inmatningsläge"
+
+#: gui/shortcutmodel.cpp:81
+msgid "Key"
+msgstr "Tangent"
+
+#: gui/shortcutmodel.cpp:83
+msgid "Function"
+msgstr "Funktion"
+
+#: gui/adddictdialog.cpp:31
+msgid "System"
+msgstr "System"
+
+#: gui/adddictdialog.cpp:32
+msgid "User"
+msgstr "Användare"
+
+#: gui/adddictdialog.cpp:58
+msgid "Select Dictionary File"
+msgstr "Välj ordboksfil"
+
+#: gui/adddictdialog.cpp:73
+msgid "Select Dictionary Directory"
+msgstr "Välj ordbokskatalog"
+
+#: src/kkc.h:39
+msgid "Not set"
+msgstr "Inte inställt"
+
+#: src/kkc.h:40
+msgid "Vertical"
+msgstr "Vertikal"
+
+#: src/kkc.h:40
+msgid "Horizontal"
+msgstr "Horisontell"
+
+#: src/kkc.h:42
+msgid "Japanese"
+msgstr "Japanska"
+
+#: src/kkc.h:44
+msgid "Wide latin Japanese"
+msgstr "Japanska med latinsk fullbredd"
+
+#: src/kkc.h:85
+msgid "Rule"
+msgstr "Regel"
+
+#: src/kkc.h:87
+msgid "Punctuation Style"
+msgstr "Interpunktionsstil"
+
+#: src/kkc.h:90
+msgid "Initial Input Mode"
+msgstr "Ursprungligt inmatningsläge"
+
+#: src/kkc.h:92
+msgid "Page size"
+msgstr "Sidstorlek"
+
+#: src/kkc.h:95
+msgid "Candidate Layout"
+msgstr "Kandidatlayout"
+
+#: src/kkc.h:97
+msgid "Auto Correct"
+msgstr "Automatisk korrigering"
+
+#: src/kkc.h:101
+msgid "Candidates Page Up"
+msgstr "Kandidatlista sida upp"
+
+#: src/kkc.h:107
+msgid "Candidates Page Down"
+msgstr "Kandidatlista sida ned"
+
+#: src/kkc.h:113
+msgid "Cursor Up"
+msgstr "Markör upp"
+
+#: src/kkc.h:119
+msgid "Cursor Down"
+msgstr "Markör ned"
+
+#: src/kkc.h:122
+msgid "Show Annotation"
+msgstr "Visa anteckning"
+
+#: src/kkc.h:126
+msgid "Number candidate of Triggers To Show Candidate Window"
+msgstr "Antal kandidater som utlöser kandidatfönstret"
+
+#: src/kkc.h:128
+msgid "Rule Editor"
+msgstr "Regeleditor"
+
+#: src/kkc.h:130
+msgid "Dictionary"
+msgstr "Ordbok"
+
+#: org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in:7
+msgid "KKC"
+msgstr "KKC"
+
+#: org.fcitx.Fcitx5.Addon.Kkc.metainfo.xml.in:8
+msgid "Japanese input method"
+msgstr "Japansk inmatningsmetod"
+
+#. i18n: file: gui/addshortcutdialog.ui:14
+#. i18n: ectx: property (windowTitle), widget (QDialog, AddShortcutDialog)
+#. i18n: file: gui/adddictdialog.ui:14
+#. i18n: ectx: property (windowTitle), widget (QDialog, AddDictDialog)
+#: rc.cpp:3 rc.cpp:18
+#, kde-format
+msgid "Dialog"
+msgstr "Dialogruta"
+
+#. i18n: file: gui/addshortcutdialog.ui:22
+#. i18n: ectx: property (text), widget (QLabel, inputModeLabel_)
+#: rc.cpp:6
+#, kde-format
+msgid "&Input Mode:"
+msgstr "&Inmatningsläge:"
+
+#. i18n: file: gui/addshortcutdialog.ui:42
+#. i18n: ectx: property (text), widget (QLabel, commandLabel_)
+#: rc.cpp:9
+#, kde-format
+msgid "&Command:"
+msgstr "&Kommando:"
+
+#. i18n: file: gui/addshortcutdialog.ui:71
+#. i18n: ectx: property (text), widget (QLabel, keyLabel_)
+#: rc.cpp:12
+#, kde-format
+msgid "&Key:"
+msgstr "&Tangent:"
+
+#. i18n: file: gui/dictwidget.ui:14
+#. i18n: ectx: property (windowTitle), widget (QWidget, KkcDictWidget)
+#. i18n: file: gui/shortcutwidget.ui:20
+#. i18n: ectx: property (windowTitle), widget (QWidget, KkcShortcutWidget)
+#: rc.cpp:15 rc.cpp:27
+#, kde-format
+msgid "Form"
+msgstr "Formulär"
+
+#. i18n: file: gui/adddictdialog.ui:22
+#. i18n: ectx: property (text), widget (QLabel, typeLabel_)
+#: rc.cpp:21
+#, kde-format
+msgid "&Type:"
+msgstr "&Typ:"
+
+#. i18n: file: gui/adddictdialog.ui:42
+#. i18n: ectx: property (text), widget (QLabel, pathLabel_)
+#: rc.cpp:24
+#, kde-format
+msgid "&Path:"
+msgstr "&Sökväg:"
+
+#. i18n: file: gui/shortcutwidget.ui:28
+#. i18n: ectx: property (text), widget (QLabel, ruleLabel_)
+#: rc.cpp:30
+#, kde-format
+msgid "R&ule:"
+msgstr "&Regel:"
+
+#: src/kkc.conf.in:2
+msgid "Kana Kanji"
+msgstr "Kana Kanji"
+
+#: src/kkc-addon.conf.in.in:2
+msgid "KKC Addon of Fcitx"
+msgstr "KKC-tillägg för Fcitx"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/src/CMakeLists.txt 
new/fcitx5-kkc-5.1.11/src/CMakeLists.txt
--- old/fcitx5-kkc-5.1.9/src/CMakeLists.txt     2025-12-22 07:18:12.000000000 
+0100
+++ new/fcitx5-kkc-5.1.11/src/CMakeLists.txt    2026-09-06 04:39:57.000000000 
+0200
@@ -2,7 +2,7 @@
     kkc.cpp
 )
 add_fcitx5_addon(kkc ${KKC_SOURCES})
-target_link_libraries(kkc Fcitx5::Core Fcitx5::Config LibKKC::LibKKC 
PkgConfig::GObject2 PkgConfig::JSonGlib PkgConfig::Gee)
+target_link_libraries(kkc Fcitx5::Core Fcitx5::Config LibKKC::LibKKC)
 target_include_directories(kkc PRIVATE ${PROJECT_BINARY_DIR})
 set_target_properties(kkc PROPERTIES PREFIX "")
 install(TARGETS kkc DESTINATION "${CMAKE_INSTALL_LIBDIR}/fcitx5")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/src/kkc.cpp 
new/fcitx5-kkc-5.1.11/src/kkc.cpp
--- old/fcitx5-kkc-5.1.9/src/kkc.cpp    2025-12-22 07:18:12.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/src/kkc.cpp   2026-09-06 04:39:57.000000000 +0200
@@ -45,6 +45,7 @@
 #include <memory>
 #include <stdexcept>
 #include <string>
+#include <string_view>
 #include <utility>
 #include <vector>
 
@@ -66,39 +67,70 @@
         kkc_context_set_dictionaries(context_.get(), parent_->dictionaries());
         kkc_context_set_input_mode(context_.get(),
                                    *parent_->config().inputMode);
-        lastMode_ = kkc_context_get_input_mode(context_.get());
         applyConfig();
 
-        signal_ =
-            g_signal_connect(context_.get(), "notify::input-mode",
-                             G_CALLBACK(&KkcState::inputModeChanged), this);
-
-        updateInputMode();
+        g_signal_connect(context_.get(), "notify::input-mode",
+                         G_CALLBACK(&KkcState::inputModeChanged), this);
+        g_signal_connect(context_.get(), "notify::input",
+                         G_CALLBACK(&KkcState::input_changed_cb), this);
+        g_signal_connect(kkc_context_get_candidates(context_.get()),
+                         "populated",
+                         G_CALLBACK(&KkcState::candidates_populated), this);
+        g_signal_connect(
+            kkc_context_get_candidates(context_.get()), "notify::cursor-pos",
+            G_CALLBACK(&KkcState::candidates_cursor_pos_changed), this);
+        g_signal_connect(kkc_context_get_candidates(context_.get()), 
"selected",
+                         G_CALLBACK(&KkcState::candidates_selected), this);
     }
 
     ~KkcState() {
-        g_signal_handler_disconnect(context_.get(), signal_);
+        g_signal_handlers_disconnect_by_data(
+            kkc_context_get_candidates(context_.get()), this);
+        g_signal_handlers_disconnect_by_data(context_.get(), this);
         // In order to workaround libkkc context clear the dictionaries upon
         // context deleting.
         kkc_context_set_dictionaries(context_.get(),
                                      parent_->dummyEmptyDictionaries());
     }
 
+    void keyEvent(KeyEvent &keyEvent);
+    void updateUI();
+    void doUpdateUI();
+    void reset();
+
     static void inputModeChanged(GObject * /*unused*/, GParamSpec * /*unused*/,
                                  gpointer user_data) {
         auto *that = static_cast<KkcState *>(user_data);
         that->updateInputMode();
     }
 
-    void updateInputMode() {
-        parent_->updateInputMode(ic_);
-        auto newMode = kkc_context_get_input_mode(context_.get());
-        if (newMode != lastMode_) {
-            lastMode_ = newMode;
-            modeChanged_ = true;
-        }
+    static void input_changed_cb(GObject * /*unused*/, GParamSpec * /*unused*/,
+                                 gpointer user_data) {
+        auto *that = static_cast<KkcState *>(user_data);
+        that->updateUI();
+    }
+
+    static void candidates_populated(GObject * /*unused*/, gpointer user_data) 
{
+        auto *that = static_cast<KkcState *>(user_data);
+        that->updateUI();
+    }
+
+    static void candidates_cursor_pos_changed(GObject * /*unused*/,
+                                              GParamSpec * /*unused*/,
+                                              gpointer user_data) {
+        auto *that = static_cast<KkcState *>(user_data);
+        that->updateUI();
+    }
+
+    static void candidates_selected(GObject * /*unused*/,
+                                    KkcCandidate * /*unused*/,
+                                    gpointer user_data) {
+        auto *that = static_cast<KkcState *>(user_data);
+        that->updateUI();
     }
 
+    void updateInputMode() { parent_->updateInputMode(ic_); }
+
     void applyConfig() const {
         KkcCandidateList *kkcCandidates =
             kkc_context_get_candidates(context_.get());
@@ -116,12 +148,30 @@
         }
     }
 
+    auto *context() { return context_.get(); }
+
+private:
+    struct KeyEventScope {
+        KeyEventScope(KkcState &self) : self_(self) {
+            self_.inKeyEventScope_ = true;
+            self_.pendingUpdateUI_ = false;
+        }
+        ~KeyEventScope() {
+            self_.inKeyEventScope_ = false;
+            if (self_.pendingUpdateUI_) {
+                self_.doUpdateUI();
+            }
+        }
+
+    private:
+        KkcState &self_;
+    };
+
+    bool inKeyEventScope_ = false;
+    bool pendingUpdateUI_ = false;
     KkcEngine *parent_;
     InputContext *ic_;
     GObjectUniquePtr<KkcContext> context_;
-    gulong signal_;
-    bool modeChanged_ = false;
-    KkcInputMode lastMode_ = KKC_INPUT_MODE_HIRAGANA;
 };
 
 namespace {
@@ -146,7 +196,7 @@
 
 auto inputModeStatus(KkcEngine *engine, InputContext *ic) {
     auto *state = engine->state(ic);
-    auto mode = kkc_context_get_input_mode(state->context_.get());
+    auto mode = kkc_context_get_input_mode(state->context());
     return (mode >= 0 && mode < FCITX_ARRAY_SIZE(input_mode_status))
                ? &input_mode_status[mode]
                : nullptr;
@@ -193,11 +243,11 @@
     }
     bool isChecked(InputContext *ic) const override {
         auto *state = engine_->state(ic);
-        return mode_ == kkc_context_get_input_mode(state->context_.get());
+        return mode_ == kkc_context_get_input_mode(state->context());
     }
     void activate(InputContext *ic) override {
         auto *state = engine_->state(ic);
-        kkc_context_set_input_mode(state->context_.get(), mode_);
+        kkc_context_set_input_mode(state->context(), mode_);
     }
 
 private:
@@ -214,13 +264,11 @@
 
     void select(InputContext *inputContext) const override {
         auto *state = engine_->state(inputContext);
-        auto *context = state->context_.get();
+        auto *context = state->context();
         KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
-        if (kkc_candidate_list_select_at(
-                kkcCandidates,
-                idx_ % kkc_candidate_list_get_page_size(kkcCandidates))) {
-            engine_->updateUI(inputContext);
-        }
+        kkc_candidate_list_select_at(
+            kkcCandidates,
+            idx_ % kkc_candidate_list_get_page_size(kkcCandidates));
     }
 
 private:
@@ -237,7 +285,7 @@
         setPageable(this);
         setCursorMovable(this);
         auto *kkcstate = engine_->state(ic_);
-        auto *context = kkcstate->context_.get();
+        auto *context = kkcstate->context();
         KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
         gint size = kkc_candidate_list_get_size(kkcCandidates);
         gint cursor_pos = kkc_candidate_list_get_cursor_pos(kkcCandidates);
@@ -315,7 +363,7 @@
 private:
     void paging(bool prev) {
         auto *kkcstate = engine_->state(ic_);
-        auto *context = kkcstate->context_.get();
+        auto *context = kkcstate->context();
         KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
         if (kkc_candidate_list_get_page_visible(kkcCandidates)) {
             if (prev) {
@@ -323,12 +371,11 @@
             } else {
                 kkc_candidate_list_page_down(kkcCandidates);
             }
-            engine_->updateUI(ic_);
         }
     }
     void moveCursor(bool prev) {
         auto *kkcstate = engine_->state(ic_);
-        auto *context = kkcstate->context_.get();
+        auto *context = kkcstate->context();
         KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
         if (kkc_candidate_list_get_page_visible(kkcCandidates)) {
             if (prev) {
@@ -336,7 +383,6 @@
             } else {
                 kkc_candidate_list_cursor_down(kkcCandidates);
             }
-            engine_->updateUI(ic_);
         }
     }
 
@@ -382,6 +428,116 @@
 
 } // namespace
 
+void KkcState::keyEvent(KeyEvent &keyEvent) {
+    KeyEventScope scope(*this);
+    auto state = static_cast<uint32_t>(keyEvent.rawKey().states());
+    state &= static_cast<uint32_t>(KeyState::SimpleMask);
+    if (keyEvent.isRelease()) {
+        state |= KKC_MODIFIER_TYPE_RELEASE_MASK;
+    }
+
+    KKC_DEBUG() << "Kkc received key: " << keyEvent.rawKey()
+                << " isRelease: " << keyEvent.isRelease()
+                << " keycode: " << keyEvent.rawKey().code();
+
+    auto *context = context_.get();
+    KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
+    if (kkc_candidate_list_get_page_visible(kkcCandidates) &&
+        !keyEvent.isRelease()) {
+        if (keyEvent.key().checkKeyList(*parent_->config().cursorUpKey)) {
+            kkc_candidate_list_cursor_up(kkcCandidates);
+            keyEvent.filterAndAccept();
+        } else if (keyEvent.key().checkKeyList(
+                       *parent_->config().cursorDownKey)) {
+            kkc_candidate_list_cursor_down(kkcCandidates);
+            keyEvent.filterAndAccept();
+        } else if (keyEvent.key().checkKeyList(
+                       *parent_->config().prevPageKey)) {
+            kkc_candidate_list_page_up(kkcCandidates);
+            keyEvent.filterAndAccept();
+        } else if (keyEvent.key().checkKeyList(
+                       *parent_->config().nextPageKey)) {
+            kkc_candidate_list_page_down(kkcCandidates);
+            keyEvent.filterAndAccept();
+        } else if (keyEvent.key().isDigit()) {
+            KeySym syms[] = {
+                FcitxKey_1, FcitxKey_2, FcitxKey_3, FcitxKey_4, FcitxKey_5,
+                FcitxKey_6, FcitxKey_7, FcitxKey_8, FcitxKey_9, FcitxKey_0,
+            };
+
+            KeyList selectionKey;
+            KeyStates states;
+            for (auto sym : syms) {
+                selectionKey.emplace_back(sym, states);
+            }
+            auto idx = keyEvent.key().keyListIndex(selectionKey);
+            if (idx >= 0) {
+                kkc_candidate_list_select_at(
+                    kkcCandidates,
+                    idx % kkc_candidate_list_get_page_size(kkcCandidates));
+                keyEvent.filterAndAccept();
+            }
+        }
+    }
+
+    if (keyEvent.filtered()) {
+        return;
+    }
+
+    auto key = makeGObjectUnique(kkc_key_event_new_from_x_event(
+        keyEvent.rawKey().sym(), keyEvent.rawKey().code() - 8,
+        static_cast<KkcModifierType>(state)));
+    if (!key) {
+        KKC_DEBUG() << "Failed to obtain kkc key event";
+        return;
+    }
+    if (kkc_context_process_key_event(context, key.get())) {
+        keyEvent.filterAndAccept();
+    }
+    KKC_DEBUG() << "Key event filtered: " << keyEvent.filtered();
+}
+
+void KkcState::reset() {
+    kkc_context_reset(context_.get());
+    updateUI();
+}
+
+void KkcState::updateUI() {
+    if (inKeyEventScope_) {
+        pendingUpdateUI_ = true;
+    } else {
+        doUpdateUI();
+    }
+}
+
+void KkcState::doUpdateUI() {
+    auto *context = this->context();
+
+    auto &inputPanel = ic_->inputPanel();
+    inputPanel.reset();
+    Text preedit = kkcContextGetPreedit(context);
+    if (ic_->capabilityFlags().test(CapabilityFlag::Preedit)) {
+        inputPanel.setClientPreedit(preedit);
+        ic_->updatePreedit();
+    } else {
+        inputPanel.setPreedit(preedit);
+    }
+
+    KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
+    if (kkc_candidate_list_get_page_visible(kkcCandidates)) {
+        inputPanel.setCandidateList(
+            std::make_unique<KkcFcitxCandidateList>(parent_, ic_));
+    }
+
+    if (kkc_context_has_output(context)) {
+        gchar *str = kkc_context_poll_output(context);
+        ic_->commitString(str);
+        g_free(str);
+    }
+
+    ic_->updateUserInterface(UserInterfaceComponent::InputPanel);
+}
+
 KkcEngine::KkcEngine(Instance *instance)
     : instance_(instance),
       factory_([this](InputContext &ic) { return new KkcState(this, ic); }) {
@@ -433,9 +589,11 @@
     instance_->inputContextManager().registerProperty("kkcState", &factory_);
     instance_->inputContextManager().foreach([this](InputContext *ic) {
         auto *state = this->state(ic);
-        kkc_context_set_input_mode(state->context_.get(), *config_.inputMode);
+        kkc_context_set_input_mode(state->context(), *config_.inputMode);
         return true;
     });
+
+    constructed_ = true;
 }
 
 KkcEngine::~KkcEngine() {}
@@ -450,7 +608,7 @@
                            InputContextEvent &event) {
     if (event.type() == EventType::InputContextSwitchInputMethod) {
         auto *kkcstate = this->state(event.inputContext());
-        auto *context = kkcstate->context_.get();
+        auto *context = kkcstate->context();
         auto text = kkcContextGetPreedit(context);
         auto str = text.toString();
         if (!str.empty()) {
@@ -462,73 +620,10 @@
 
 void KkcEngine::keyEvent(const InputMethodEntry & /*entry*/,
                          KeyEvent &keyEvent) {
-    auto state = static_cast<uint32_t>(keyEvent.rawKey().states());
-    state &= static_cast<uint32_t>(KeyState::SimpleMask);
-    if (keyEvent.isRelease()) {
-        state |= KKC_MODIFIER_TYPE_RELEASE_MASK;
-    }
-
-    KKC_DEBUG() << "Kkc received key: " << keyEvent.rawKey()
-                << " isRelease: " << keyEvent.isRelease()
-                << " keycode: " << keyEvent.rawKey().code();
-
     auto *kkcstate = this->state(keyEvent.inputContext());
-    auto *context = kkcstate->context_.get();
-    KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
-    if (kkc_candidate_list_get_page_visible(kkcCandidates) &&
-        !keyEvent.isRelease()) {
-        if (keyEvent.key().checkKeyList(*config_.cursorUpKey)) {
-            kkc_candidate_list_cursor_up(kkcCandidates);
-            keyEvent.filterAndAccept();
-        } else if (keyEvent.key().checkKeyList(*config_.cursorDownKey)) {
-            kkc_candidate_list_cursor_down(kkcCandidates);
-            keyEvent.filterAndAccept();
-        } else if (keyEvent.key().checkKeyList(*config_.prevPageKey)) {
-            kkc_candidate_list_page_up(kkcCandidates);
-            keyEvent.filterAndAccept();
-        } else if (keyEvent.key().checkKeyList(*config_.nextPageKey)) {
-            kkc_candidate_list_page_down(kkcCandidates);
-            keyEvent.filterAndAccept();
-        } else if (keyEvent.key().isDigit()) {
-            KeySym syms[] = {
-                FcitxKey_1, FcitxKey_2, FcitxKey_3, FcitxKey_4, FcitxKey_5,
-                FcitxKey_6, FcitxKey_7, FcitxKey_8, FcitxKey_9, FcitxKey_0,
-            };
-
-            KeyList selectionKey;
-            KeyStates states;
-            for (auto sym : syms) {
-                selectionKey.emplace_back(sym, states);
-            }
-            auto idx = keyEvent.key().keyListIndex(selectionKey);
-            if (idx >= 0) {
-                kkc_candidate_list_select_at(
-                    kkcCandidates,
-                    idx % kkc_candidate_list_get_page_size(kkcCandidates));
-                keyEvent.filterAndAccept();
-            }
-        }
-    }
-
-    if (keyEvent.filtered()) {
-        updateUI(keyEvent.inputContext());
-        return;
-    }
-
-    auto key = makeGObjectUnique(kkc_key_event_new_from_x_event(
-        keyEvent.rawKey().sym(), keyEvent.rawKey().code() - 8,
-        static_cast<KkcModifierType>(state)));
-    if (!key) {
-        KKC_DEBUG() << "Failed to obtain kkc key event";
-        return;
-    }
-    kkcstate->modeChanged_ = false;
-    if (kkc_context_process_key_event(context, key.get())) {
-        keyEvent.filterAndAccept();
-        updateUI(keyEvent.inputContext());
-    }
-    KKC_DEBUG() << "Key event filtered: " << keyEvent.filtered();
+    kkcstate->keyEvent(keyEvent);
 }
+
 void KkcEngine::reloadConfig() {
     readAsIni(config_, "conf/kkc.conf");
 
@@ -546,48 +641,18 @@
 void KkcEngine::reset(const InputMethodEntry & /*entry*/,
                       InputContextEvent &event) {
     auto *state = this->state(event.inputContext());
-    auto *context = state->context_.get();
-    kkc_context_reset(context);
-    updateUI(event.inputContext());
+    state->reset();
 }
 void KkcEngine::save() { kkc_dictionary_list_save(dictionaries_.get()); }
 
-void KkcEngine::updateUI(InputContext *inputContext) {
-    auto *state = this->state(inputContext);
-    auto *context = state->context_.get();
-
-    auto &inputPanel = inputContext->inputPanel();
-    inputPanel.reset();
-    Text preedit = kkcContextGetPreedit(context);
-    if (inputContext->capabilityFlags().test(CapabilityFlag::Preedit)) {
-        inputPanel.setClientPreedit(preedit);
-        inputContext->updatePreedit();
-    } else {
-        inputPanel.setPreedit(preedit);
-    }
-
-    KkcCandidateList *kkcCandidates = kkc_context_get_candidates(context);
-    if (kkc_candidate_list_get_page_visible(kkcCandidates)) {
-        inputPanel.setCandidateList(
-            std::make_unique<KkcFcitxCandidateList>(this, inputContext));
-    }
-
-    if (kkc_context_has_output(context)) {
-        gchar *str = kkc_context_poll_output(context);
-        inputContext->commitString(str);
-        g_free(str);
-    }
-
-    // Ensure we are not composing any text.
-    if (state->modeChanged_ && preedit.empty() && !inputPanel.candidateList()) 
{
-        instance_->showInputMethodInformation(inputContext);
+void KkcEngine::updateInputMode(InputContext *ic) {
+    if (!constructed_) {
+        return;
     }
-
-    inputContext->updateUserInterface(UserInterfaceComponent::InputPanel);
+    modeAction_->update(ic);
+    instance_->showInputMethodInformation(ic);
 }
 
-void KkcEngine::updateInputMode(InputContext *ic) { modeAction_->update(ic); }
-
 void KkcEngine::loadDictionary() {
     kkc_dictionary_list_clear(dictionaries_.get());
     auto file = StandardPaths::global().open(StandardPathsType::PkgData,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/fcitx5-kkc-5.1.9/src/kkc.h 
new/fcitx5-kkc-5.1.11/src/kkc.h
--- old/fcitx5-kkc-5.1.9/src/kkc.h      2025-12-22 07:18:12.000000000 +0100
+++ new/fcitx5-kkc-5.1.11/src/kkc.h     2026-09-06 04:39:57.000000000 +0200
@@ -57,7 +57,6 @@
         EnumAnnotation::dumpDescription(config);
         int length;
         auto *rules = kkc_rule_list(&length);
-        FCITX_INFO() << length;
         int total = 0;
         for (int i = 0; i < length; i++) {
             int priority;
@@ -172,8 +171,6 @@
     auto model() { return model_.get(); }
     auto rule() { return userRule_.get(); }
 
-    void updateUI(InputContext *inputContext);
-
     std::string subMode(const InputMethodEntry & /*entry*/,
                         InputContext & /*inputContext*/) override;
     std::string subModeLabelImpl(const fcitx::InputMethodEntry & /*unused*/,
@@ -187,6 +184,7 @@
     void loadDictionary();
     void loadRule();
 
+    bool constructed_ = false;
     KkcConfig config_;
     Instance *instance_;
     FactoryFor<KkcState> factory_;

Reply via email to