public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Takao Fujiwara <tfujiwar@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch
Date: Sun, 31 May 2026 02:07:30 GMT	[thread overview]
Message-ID: <178019325006.1.2493224813599113829.rpms-ibus-1ddc1a0b4155@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/ibus
Branch : autotool
Commit : 1ddc1a0b4155a77a54415a88ed4895f96d3264d6
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date   : 2020-09-29T21:08:31+09:00
Stats  : +0/-2658 in 1 file(s)
URL    : https://src.fedoraproject.org/rpms/ibus/c/1ddc1a0b4155a77a54415a88ed4895f96d3264d6?branch=autotool

Log:
Delete upstreamed ibus-HEAD.patch

---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
deleted file mode 100644
index a0f6e3a..0000000
--- a/ibus-HEAD.patch
+++ /dev/null
@@ -1,2658 +0,0 @@
-From 7b0d091839a4f1315ba216175fb2787e86f7fa31 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 3 Mar 2020 17:08:30 +0900
-Subject: [PATCH] src/tests: Delete graves in substitution in
- ibus-desktop-testing-runner
-
-Delete the single quotations to enclose grave chracters because
-DASH saves the single quoted '`id -u`' as the raw string in the command
-substitution not to be extracted.
-
-BUG=https://github.com/ibus/ibus/issues/2189
----
- src/tests/ibus-desktop-testing-runner.in | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index 0d9a847c..f9238e69 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -4,7 +4,7 @@
- #
- # ibus - The Input Bus
- #
--# Copyright (c) 2018-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2018-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
- # Copyright (c) 2018 Red Hat, Inc.
- #
- # This program is free software; you can redistribute it and/or modify
-@@ -31,7 +31,8 @@
- # POSIX sh has no 'echo -e'
- : ${ECHO:='/usr/bin/echo'}
- # POSIX sh has $UID
--: ${UID:='`id -u`'}
-+# DASH saves the graves in '``' as characters not to be extracted
-+: ${UID:=`id -u`}
- 
- 
- PROGNAME=`basename $0`
-@@ -170,7 +171,7 @@ _EOF
- run_dbus_daemon()
- {
-     # Use dbus-launch --exit-with-session later instead of --sh-syntax
--    export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$UID/bus
-+    export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
- }
- 
- run_desktop()
--- 
-2.24.1
-
-From 8ce25208c3f4adfd290a032c6aa739d2b7580eb1 Mon Sep 17 00:00:00 2001
-From: Carlos Garnacho <carlosg@gnome.org>
-Date: Thu, 12 Mar 2020 16:02:16 +0900
-Subject: [PATCH] src: Use WAYLAND_DISPLAY on Wayland sessions to make up
- IBus socket name
-
-In Wayland sessions, GNOME Shell 3.36 is leveraging 2 X11 Display
-connections so one is used to set up all services for a "X11 session"
-before user applications connected to the other display might require it.
-This allows seamlessly starting Xwayland on demand to X11 user applications.
-
-IBus here belongs to the first described connection, it is started
-explicitly on that display by GNOME Shell as it is necessary to set up
-ibus-x11 before any other X11 client might want to use it.
-
-However the use of this "secondary" display results in IBus daemon left
-unable to talk to applications, as the socket name is dependent on the
-DISPLAY envvar and ibus/applications don't agree on its content.
-
-For wayland sessions, make it look for WAYLAND_DISPLAY, as that'll have
-the similar "per session bus" behavior that this seems to look after.
-
-BUG=https://gitlab.gnome.org/GNOME/gnome-shell/issues/2341
----
- src/ibusshare.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibusshare.c b/src/ibusshare.c
-index 0d50d3f5..e0ef2ce0 100644
---- a/src/ibusshare.c
-+++ b/src/ibusshare.c
-@@ -100,6 +100,7 @@ ibus_get_socket_path (void)
-         gchar *display;
-         gchar *displaynumber = "0";
-         /* gchar *screennumber = "0"; */
-+        gboolean is_wayland = FALSE;
-         gchar *p;
- 
-         path = g_strdup (g_getenv ("IBUS_ADDRESS_FILE"));
-@@ -108,13 +109,19 @@ ibus_get_socket_path (void)
-         }
- 
-         if (_display == NULL) {
--            display = g_strdup (g_getenv ("DISPLAY"));
-+            display = g_strdup (g_getenv ("WAYLAND_DISPLAY"));
-+            if (display)
-+                is_wayland = TRUE;
-+            else
-+                display = g_strdup (g_getenv ("DISPLAY"));
-         }
-         else {
-             display = g_strdup (_display);
-         }
- 
--        if (display) {
-+        if (is_wayland) {
-+            displaynumber = display;
-+        } else if (display) {
-             p = display;
-             hostname = display;
-             for (; *p != ':' && *p != '\0'; p++);
--- 
-2.24.1
-
-From 5765bfd69fb2ab1174378fbb0d8cac7f2bd2610f Mon Sep 17 00:00:00 2001
-From: Changwoo Ryu <cwryu@debian.org>
-Date: Wed, 15 Apr 2020 17:43:14 +0900
-Subject: [PATCH] client/gtk2: Remove glib_check_version() in gtk immodule
-
-In the gtk2/gtk3 immodule, glib_check_version() is being used to make sure
-that the installed glib version is not older than the glib version which ibus
-is built with.
-
-But there is no reason why glib version is checked in runtime. Library
-compatibility is already being checked more precisely by packaging systems and
-linkers.
-
-This version check can break the ibus gtk immodule when used with an older but
-compatible version of glib, such as glib 2.62.x which is compatible with
-2.64.x.
-
-BUG=https://github.com/ibus/ibus/issues/2200
----
- client/gtk2/ibusim.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/client/gtk2/ibusim.c b/client/gtk2/ibusim.c
-index bfacd0f0..d70800d3 100644
---- a/client/gtk2/ibusim.c
-+++ b/client/gtk2/ibusim.c
-@@ -41,9 +41,7 @@ static const GtkIMContextInfo *info_list[] = {
- G_MODULE_EXPORT const gchar*
- g_module_check_init (GModule *module)
- {
--    return glib_check_version (GLIB_MAJOR_VERSION,
--                               GLIB_MINOR_VERSION,
--                               0);
-+    return null;
- }
- 
- G_MODULE_EXPORT void
--- 
-2.24.1
-
-From 8da016764cee9616cca4658d1fb311d6b3bfc0df Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 15 Apr 2020 17:55:03 +0900
-Subject: [PATCH] src/tests: Fix to get focus events with su in
- ibus-desktop-testing-runner
-
-GtkWindow haven't received focus events in any test cases since Fedora 31
-whenever Ansible runs ibus-desktop-testing-runner after `su root`.
-Seems su command does not run systemd automatically and now systemd
-requires XDG_RUNTIME_DIR and Ansible requires root access with ssh.
-This fix requires to restart sshd with modified /etc/ssh/sshd_config
-with "PermitRootLogin yes" in order to run with su command.
-
-Ansible with ibus-desktop-testin-runner has worked fine if root console
-login is used without this patch because PAM runs systemd by login.
----
- src/tests/ibus-desktop-testing-runner.in | 36 ++++++++++++++++++++++--
- 1 file changed, 33 insertions(+), 3 deletions(-)
-
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index f9238e69..f760fd5b 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -49,6 +49,7 @@ PID_XORG=0
- PID_GNOME_SESSION=0
- TESTING_RUNNER="default"
- TESTS=""
-+TIMEOUT=300
- GREEN='\033[0;32m'
- RED='\033[0;31m'
- NC='\033[0m'
-@@ -84,6 +85,7 @@ usage()
- "-r, --runner=RUNNER              Run TESTS programs with a test RUNNER.\n"    \
- "                                 RUNNDER = gnome or default.\n"               \
- "                                 default is an embedded runner.\n"            \
-+"-T, --timeout=TIMEOUT            Set timeout (default TIMEOUT is 300 sec).\n" \
- "-o, --output=OUTPUT_FILE         OUtput the log to OUTPUT_FILE\n"             \
- "-O, --result=RESULT_FILE         OUtput the result to RESULT_FILE\n"          \
- ""
-@@ -92,8 +94,8 @@ usage()
- parse_args()
- {
-     # This is GNU getopt. "sudo port getopt" in BSD?
--    ARGS=`getopt -o hvb:s:cd:t:r:o:O: --long \
--          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,output:,result:\
-+    ARGS=`getopt -o hvb:s:cd:t:r:T:o:O: --long \
-+          help,version,builddir:,srcdir:,no-graphics,desktop:,tests:,runner:,timeout:,output:,result:\
-         -- "$@"`;
-     eval set -- "$ARGS"
-     while [ 1 ] ; do
-@@ -106,6 +108,7 @@ parse_args()
-         -d | --desktop )     DESKTOP_COMMAND="$2"; shift 2;;
-         -t | --tests )       TESTS="$2"; shift 2;;
-         -r | --runner )      TESTING_RUNNER="$2"; shift 2;;
-+        -T | --timeout )     TIMEOUT="$2"; shift 2;;
-         -o | --output )      TEST_LOG="$2"; shift 2;;
-         -O | --result )      RESULT_LOG="$2"; shift 2;;
-         -- )                 shift; break;;
-@@ -166,11 +169,37 @@ _EOF
-     fi
-     # `su` command does not run loginctl
-     export XDG_SESSION_TYPE='x11'
-+    export XDG_SESSION_CLASS=user
-+    # `su` command does not get focus in events without this variable.
-+    # Need to restart sshd after set "PermitRootLogin yes" in sshd_config
-+    if [ "x$XDG_RUNTIME_DIR" = x ] ; then
-+        export XDG_RUNTIME_DIR=/run/user/$UID
-+        is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes`
-+        if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then
-+            print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible"
-+            echo "su command does not configure necessary login info "         \
-+                 "with systemd and GtkWindow cannot receive focus-events "     \
-+                 "when ibus-desktop-testing-runner is executed by "            \
-+                 "ansible-playbook." >> $TEST_LOG
-+            echo "Enabling root login via sshd, restarting sshd, set "         \
-+                 "XDG_RUNTIME_DIR can resolve the problem under "              \
-+                 "ansible-playbook." >> $TEST_LOG
-+            exit 255
-+        fi
-+    fi
-+    #  Do we need XDG_SESSION_ID and XDG_SEAT?
-+    #export XDG_CONFIG_DIRS=/etc/xdg
-+    #export XDG_SESSION_ID=10
-+    #export XDG_SESSION_DESKTOP=gnome
-+    #export XDG_SEAT=seat0
- }
- 
- run_dbus_daemon()
- {
-     # Use dbus-launch --exit-with-session later instead of --sh-syntax
-+    # GNOME uses a unix:abstract address and it effects gsettings set values
-+    # in each test case.
-+    # TODO: Should we comment out this line?
-     export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$UID/bus"
- }
- 
-@@ -288,7 +317,8 @@ run_gnome_desktop_testing_runner()
-             fail=1
-             continue
-         fi
--        gnome-desktop-testing-runner $tst 2>>$TEST_LOG 1>>$TEST_LOG
-+        gnome-desktop-testing-runner --timeout=$TIMEOUT $tst \
-+                2>>$TEST_LOG 1>>$TEST_LOG
-         retval=$?
-         read pass fail << EOF
-         `count_case_result $retval $pass $fail`
--- 
-2.24.1
-
-From 0b9d9365988a96a2bc31c48624f9c2b8081601b6 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 22 Apr 2020 20:17:12 +0900
-Subject: [PATCH] client/gtk2: Fix typo
-
----
- client/gtk2/ibusim.c                     | 4 ++--
- src/tests/ibus-desktop-testing-runner.in | 2 +-
- 2 files changed, 3 insertions(+), 3 deletions(-)
-
-diff --git a/client/gtk2/ibusim.c b/client/gtk2/ibusim.c
-index d70800d3..55609ce7 100644
---- a/client/gtk2/ibusim.c
-+++ b/client/gtk2/ibusim.c
-@@ -2,7 +2,7 @@
- /* vim:set et ts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2010 Red Hat, Inc.
-+ * Copyright (C) 2008-2020 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -41,7 +41,7 @@ static const GtkIMContextInfo *info_list[] = {
- G_MODULE_EXPORT const gchar*
- g_module_check_init (GModule *module)
- {
--    return null;
-+    return NULL;
- }
- 
- G_MODULE_EXPORT void
-diff --git a/src/tests/ibus-desktop-testing-runner.in b/src/tests/ibus-desktop-testing-runner.in
-index f760fd5b..4232c549 100755
---- a/src/tests/ibus-desktop-testing-runner.in
-+++ b/src/tests/ibus-desktop-testing-runner.in
-@@ -173,7 +173,7 @@ _EOF
-     # `su` command does not get focus in events without this variable.
-     # Need to restart sshd after set "PermitRootLogin yes" in sshd_config
-     if [ "x$XDG_RUNTIME_DIR" = x ] ; then
--        export XDG_RUNTIME_DIR=/run/user/$UID
-+        export XDG_RUNTIME_DIR="/run/user/$UID"
-         is_root_login=`grep "^PermitRootLogin" /etc/ssh/sshd_config | grep yes`
-         if [ "x$ANSIBLE" != x ] && [ "x$is_root_login" = x ] ; then
-             print_log -e "${RED}FAIL${NC}: No permission to get focus-in events in GtkWindow with ansible"
--- 
-2.24.1
-
-From 8c4125bc78ce3502b5aeb053e7029cc2594f83f2 Mon Sep 17 00:00:00 2001
-From: Changwoo Ryu <cwryu@debian.org>
-Date: Sun, 12 Apr 2020 05:28:15 +0900
-Subject: [PATCH] src: Build the Emoji dictionaries in parallel
-
-Instead of building Emoji dictionaries src/dicts/emoji-*.dict in sequence, a
-pattern rule is specified for them. The make -jN option builds the
-dictionaries in parallel.
-
-The GNU make extensions like pattern rule and patsubst function are used for
-it. But src/Makefile.am has had other GNU make extensions for a while, so
-using more extensions should not make portability worse.
-
-BUG=https://github.com/ibus/ibus/pull/2209
----
- src/Makefile.am | 55 ++++++++++++++++++++++++-------------------------
- 1 file changed, 27 insertions(+), 28 deletions(-)
-
-diff --git a/src/Makefile.am b/src/Makefile.am
-index a8e3d07d..99de1ab7 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -246,42 +246,41 @@ if ENABLE_EMOJI_DICT
- AM_CPPFLAGS += -DENABLE_EMOJI_DICT
- 
- dictdir = $(pkgdatadir)/dicts
--dict_DATA = dicts/emoji-en.dict
- LANG_FILES = $(basename $(notdir $(wildcard $(EMOJI_ANNOTATION_DIR)/*.xml)))
-+EMOJI_DICT_FILES = $(patsubst %,dicts/emoji-%.dict,$(LANG_FILES))
-+dict_DATA = $(EMOJI_DICT_FILES)
- 
- noinst_PROGRAMS += emoji-parser
- 
--dicts/emoji-en.dict: emoji-parser
-+dicts/emoji-%.dict: emoji-parser
- 	$(AM_V_at)if test x"$(LANG_FILES)" = x ; then \
- 	    echo "WARNING: Not found $(EMOJI_ANNOTATION_DIR)/en.xml" 1>&2; \
- 	fi; \
--	for f in $(LANG_FILES) ; do \
--	    if test -f dicts/emoji-$$f.dict; then \
--	        echo "Already exists dicts/emoji-$$f.dict"; \
--	        continue; \
--	    fi; \
--	    if test -f \
--	    "$(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$$f.xml" ; then \
--	        xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$$f.xml"; \
-+	if test -f $@; then \
-+	    echo "Already exists $@"; \
-+	    exit 0; \
-+	fi; \
-+	if test -f \
-+	    "$(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$*.xml" ; then \
-+	        xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$*.xml"; \
- 	        plus_comment="derived"; \
--	    fi; \
--	    if test x"$$f" = xen ; then \
--	        $(builddir)/emoji-parser \
--	            --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
--	            --xml $(EMOJI_ANNOTATION_DIR)/$$f.xml \
--	            $$xml_derived_option \
--	            --xml-ascii $(top_srcdir)/data/annotations/en_ascii.xml \
--	            --out-category ibusemojigen.h \
--	            --out $@; \
--	    else \
--	        $(builddir)/emoji-parser \
--	            --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
--	            --xml $(EMOJI_ANNOTATION_DIR)/$$f.xml \
--	            $$xml_derived_option \
--	            --out dicts/emoji-$$f.dict; \
--	    fi; \
--	    echo "Generated $$plus_comment dicts/emoji-$$f.dict"; \
--	done
-+	fi; \
-+	if test x"$*" = xen ; then \
-+	    $(builddir)/emoji-parser \
-+	        --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
-+	        --xml $(EMOJI_ANNOTATION_DIR)/$*.xml \
-+	        $$xml_derived_option \
-+	        --xml-ascii $(top_srcdir)/data/annotations/en_ascii.xml \
-+	        --out-category ibusemojigen.h \
-+	        --out $@; \
-+	else \
-+	    $(builddir)/emoji-parser \
-+	        --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \
-+	        --xml $(EMOJI_ANNOTATION_DIR)/$*.xml \
-+	        $$xml_derived_option \
-+	        --out $@; \
-+	fi; \
-+	echo "Generated $$plus_comment $@"
- 
- ibusemojigen.h: dicts/emoji-en.dict
- 	$(NULL)
--- 
-2.23.0.rc1
-
-From 02105c4d486283e6b561181d9c934d4d23f2d65e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 14 May 2020 15:48:34 +0900
-Subject: [PATCH] bus: Fix SEGV in bus_panel_proxy_focus_in()
-
-SEGV in BUS_IS_PANEL_PROXY() in bus_panel_proxy_focus_in()
-Check if GDBusConnect is closed before bus_panel_proxy_new() is called.
-
-BUG=rhbz#1349148
-BUG=rhbz#1385349
----
- bus/ibusimpl.c | 25 ++++++++++++++++++++-----
- 1 file changed, 20 insertions(+), 5 deletions(-)
-
-diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c
-index 85761d30..e432e849 100644
---- a/bus/ibusimpl.c
-+++ b/bus/ibusimpl.c
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2011-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2011-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -464,13 +464,16 @@ _dbus_name_owner_changed_cb (BusDBusImpl   *dbus,
-     else if (!g_strcmp0 (name, IBUS_SERVICE_PANEL_EXTENSION_EMOJI))
-         panel_type = PANEL_TYPE_EXTENSION_EMOJI;
- 
--    if (panel_type != PANEL_TYPE_NONE) {
-+    do {
-+        if (panel_type == PANEL_TYPE_NONE)
-+            break;
-         if (g_strcmp0 (new_name, "") != 0) {
-             /* a Panel process is started. */
-             BusConnection *connection;
-             BusInputContext *context = NULL;
-             BusPanelProxy   **panel = (panel_type == PANEL_TYPE_PANEL) ?
-                                       &ibus->panel : &ibus->emoji_extension;
-+            GDBusConnection *dbus_connection = NULL;
- 
-             if (*panel != NULL) {
-                 ibus_proxy_destroy ((IBusProxy *)(*panel));
-@@ -479,9 +482,21 @@ _dbus_name_owner_changed_cb (BusDBusImpl   *dbus,
-                 g_assert (*panel == NULL);
-             }
- 
--            connection = bus_dbus_impl_get_connection_by_name (BUS_DEFAULT_DBUS, new_name);
-+            connection = bus_dbus_impl_get_connection_by_name (BUS_DEFAULT_DBUS,
-+                                                               new_name);
-             g_return_if_fail (connection != NULL);
- 
-+            dbus_connection = bus_connection_get_dbus_connection (connection);
-+            /* rhbz#1349148 rhbz#1385349
-+             * Avoid SEGV of BUS_IS_PANEL_PROXY (ibus->panel)
-+             * This function is called during destroying the connection
-+             * in this case? */
-+            if (dbus_connection == NULL ||
-+                g_dbus_connection_is_closed (dbus_connection)) {
-+                new_name = "";
-+                break;
-+            }
-+
-             *panel = bus_panel_proxy_new (connection, panel_type);
-             if (panel_type == PANEL_TYPE_EXTENSION_EMOJI)
-                 ibus->enable_emoji_extension = FALSE;
-@@ -535,7 +550,7 @@ _dbus_name_owner_changed_cb (BusDBusImpl   *dbus,
-                 }
-             }
-         }
--    }
-+    } while (0);
- 
-     bus_ibus_impl_component_name_owner_changed (ibus, name, old_name, new_name);
- }
--- 
-2.24.1
-
-From f591381e3c892947ecaffe9131b9039ab9014498 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 14 May 2020 16:02:00 +0900
-Subject: [PATCH] bus: Fix SEGV in bus_dbus_impl_name_owner_changed()
-
-rhbz#1406699 SEGV in new_owner!=NULL in bus_dbus_impl_name_owner_changed()
-which is called by bus_name_service_remove_owner()
-If bus_connection_get_unique_name()==NULL, set new_owner="" in
-bus_name_service_remove_owner()
-
-rhbz#1432252 SEGV in old_owner!=NULL in bus_dbus_impl_name_owner_changed()
-which is called by bus_name_service_set_primary_owner()
-If bus_connection_get_unique_name()==NULL, set old_owner="" in
-bus_name_service_set_primary_owner()
-
-BUG=rhbz#1406699
-BUG=rhbz#1432252
----
- bus/dbusimpl.c | 27 +++++++++++++++++++++++----
- 1 file changed, 23 insertions(+), 4 deletions(-)
-
-diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c
-index b54ef817..59787a80 100644
---- a/bus/dbusimpl.c
-+++ b/bus/dbusimpl.c
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input Bus
-  * Copyright (C) 2008-2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2013 Red Hat, Inc.
-+ * Copyright (C) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -344,6 +345,8 @@ bus_name_service_set_primary_owner (BusNameService     *service,
-                                     BusConnectionOwner *owner,
-                                     BusDBusImpl        *dbus)
- {
-+    gboolean has_old_owner = FALSE;
-+
-     g_assert (service != NULL);
-     g_assert (owner != NULL);
-     g_assert (dbus != NULL);
-@@ -351,6 +354,13 @@ bus_name_service_set_primary_owner (BusNameService     *service,
-     BusConnectionOwner *old = service->owners != NULL ?
-             (BusConnectionOwner *)service->owners->data : NULL;
- 
-+    /* rhbz#1432252 If bus_connection_get_unique_name() == NULL,
-+     * "Hello" method is not received yet.
-+     */
-+    if (old != NULL && bus_connection_get_unique_name (old->conn) != NULL) {
-+        has_old_owner = TRUE;
-+    }
-+
-     if (old != NULL) {
-         g_signal_emit (dbus,
-                        dbus_signals[NAME_LOST],
-@@ -370,7 +380,8 @@ bus_name_service_set_primary_owner (BusNameService     *service,
-                    0,
-                    owner->conn,
-                    service->name,
--                   old != NULL ? bus_connection_get_unique_name (old->conn) : "",
-+                   has_old_owner ? bus_connection_get_unique_name (old->conn) :
-+                           "",
-                    bus_connection_get_unique_name (owner->conn));
- 
-     if (old != NULL && old->do_not_queue != 0) {
-@@ -427,6 +438,7 @@ bus_name_service_remove_owner (BusNameService     *service,
-                                BusDBusImpl        *dbus)
- {
-     GSList *owners;
-+    gboolean has_new_owner = FALSE;
- 
-     g_assert (service != NULL);
-     g_assert (owner != NULL);
-@@ -439,6 +451,13 @@ bus_name_service_remove_owner (BusNameService     *service,
-         BusConnectionOwner *_new = NULL;
-         if (owners->next != NULL) {
-             _new = (BusConnectionOwner *)owners->next->data;
-+            /* rhbz#1406699 If bus_connection_get_unique_name() == NULL,
-+             * "Hello" method is not received yet.
-+             */
-+            if (_new != NULL &&
-+                bus_connection_get_unique_name (_new->conn) != NULL) {
-+                has_new_owner = TRUE;
-+            }
-         }
- 
-         if (dbus != NULL) {
-@@ -447,7 +466,7 @@ bus_name_service_remove_owner (BusNameService     *service,
-                            0,
-                            owner->conn,
-                            service->name);
--            if (_new != NULL) {
-+            if (has_new_owner) {
-                 g_signal_emit (dbus,
-                                dbus_signals[NAME_ACQUIRED],
-                                0,
-@@ -460,7 +479,7 @@ bus_name_service_remove_owner (BusNameService     *service,
-                     _new != NULL ? _new->conn : NULL,
-                     service->name,
-                     bus_connection_get_unique_name (owner->conn),
--                    _new != NULL ? bus_connection_get_unique_name (_new->conn) : "");
-+                    has_new_owner ? bus_connection_get_unique_name (_new->conn) : "");
- 
-         }
-     }
--- 
-2.24.1
-
-From 0da3cece88c8b94c0721aa7aca4f2d427aa22069 Mon Sep 17 00:00:00 2001
-From: Neil Shepperd <nshepperd@gmail.com>
-Date: Wed, 22 Jul 2020 15:31:29 +0900
-Subject: [PATCH 1/9] src: Skip parsing of compose sequence with invalid
- keysyms
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Instead of continuing with the keysym defaulted to <Delete>, print a
-warning and skip the broken XCompose rule entirely. Fixes a bug where
-an ~/.XCompose file with a error breaks the delete key.
-
-Tested locally with the example from launchpad bug below:
-
-	   <\> <)> : "☭" # HAMMER AND SICKLE
-
-This is incorrect syntax as neither <\> nor <)> are correct keysym
-names. Before this patch, ibus-daemon -v prints a warning, but
-pressing delete twice produces ☭ instead of its normal function. After
-this patch, ibus-daemon -v prints a slightly better warning, and the
-delete key is unaffected.
-
-BUG=https://github.com/ibus/ibus/issues/2130
-BUG=https://bugs.launchpad.net/ubuntu/+source/ibus/+bug/1849399
----
- src/ibuscomposetable.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index 3f439134..c50be2b3 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -216,8 +216,12 @@ parse_compose_sequence (IBusComposeData *compose_data,
-             compose_data->sequence[n] = codepoint;
-         }
- 
--        if (codepoint == IBUS_KEY_VoidSymbol)
--            g_warning ("Could not get code point of keysym %s", match);
-+        if (codepoint == IBUS_KEY_VoidSymbol) {
-+            g_warning ("Could not get code point of keysym %s: %s",
-+                       match, line);
-+            g_free (match);
-+            goto fail;
-+        }
-         g_free (match);
-         n++;
-     }
--- 
-2.24.1
-
-From 0ad5e9a6b6611b53c63e635e89b42e30e43ac701 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 5 Aug 2020 19:50:02 +0900
-Subject: [PATCH 2/9] setup: Delete autostart setting
-
-BUG=https://github.com/ibus/ibus/pull/2224
----
- setup/main.py  | 38 --------------------------------
- setup/setup.ui | 59 --------------------------------------------------
- 2 files changed, 97 deletions(-)
-
-diff --git a/setup/main.py b/setup/main.py
-index f6adb098..d5e2078c 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -398,13 +398,6 @@ class Setup(object):
-         self.__button_close = self.__builder.get_object("button_close")
-         self.__button_close.connect("clicked", Gtk.main_quit)
- 
--        # auto start ibus
--        self.__checkbutton_auto_start = self.__builder.get_object(
--                "checkbutton_auto_start")
--        self.__checkbutton_auto_start.set_active(self.__is_auto_start())
--        self.__checkbutton_auto_start.connect("toggled",
--                self.__checkbutton_auto_start_toggled_cb)
--
-         self.__init_hotkeys()
-         self.__init_panel()
-         self.__init_general()
-@@ -647,37 +640,6 @@ class Setup(object):
-         # set new value
-         model.set(iter, COLUMN_PRELOAD, data[DATA_PRELOAD])
- 
--    def __is_auto_start(self):
--        link_file = path.join(GLib.get_user_config_dir(),
--                              "autostart/ibus.desktop")
--        ibus_desktop = path.join(os.getenv("IBUS_PREFIX"),
--                                 "share/applications/ibus.desktop")
--
--        if not path.exists(link_file):
--            return False
--        if not path.islink(link_file):
--            return False
--        if path.realpath(link_file) != ibus_desktop:
--            return False
--        return True
--
--    def __checkbutton_auto_start_toggled_cb(self, button):
--        auto_start_dir = path.join(GLib.get_user_config_dir(), "autostart")
--        if not path.isdir(auto_start_dir):
--            os.makedirs(auto_start_dir)
--
--        link_file = path.join(GLib.get_user_config_dir(),
--                              "autostart/ibus.desktop")
--        ibus_desktop = path.join(os.getenv("IBUS_PREFIX"),
--                                 "share/applications/ibus.desktop")
--        # unlink file
--        try:
--            os.unlink(link_file)
--        except:
--            pass
--        if self.__checkbutton_auto_start.get_active():
--            os.symlink(ibus_desktop, link_file)
--
-     def __sigusr1_cb(self, *args):
-         self.__window.present()
- 
-diff --git a/setup/setup.ui b/setup/setup.ui
-index 56453054..250f43a0 100644
---- a/setup/setup.ui
-+++ b/setup/setup.ui
-@@ -1307,65 +1307,6 @@
-                 <property name="orientation">vertical</property>
-                 <property name="can_focus">False</property>
-                 <property name="no_show_all">True</property>
--                <child>
--                  <placeholder/>
--                </child>
--                <child>
--                  <object class="GtkLabel" id="label5">
--                    <property name="visible">True</property>
--                    <property name="can_focus">False</property>
--                    <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;IBus&lt;/b&gt;&lt;/big&gt;
--&lt;small&gt;The intelligent input bus&lt;/small&gt;
--Homepage: https://github.com/ibus/ibus/wiki
--
--
--
--</property>
--                    <property name="use_markup">True</property>
--                    <property name="justify">center</property>
--                  </object>
--                  <packing>
--                    <property name="expand">True</property>
--                    <property name="fill">True</property>
--                    <property name="position">1</property>
--                  </packing>
--                </child>
--                <child>
--                  <object class="GtkFrame" id="frame1">
--                    <property name="can_focus">False</property>
--                    <property name="no_show_all">True</property>
--                    <property name="label_xalign">0</property>
--                    <property name="shadow_type">none</property>
--                    <child>
--                      <object class="GtkCheckButton" id="checkbutton_auto_start">
--                        <property name="label" translatable="yes">Start ibus on login</property>
--                        <property name="use_action_appearance">False</property>
--                        <property name="visible">True</property>
--                        <property name="can_focus">True</property>
--                        <property name="receives_default">False</property>
--                        <property name="use_action_appearance">False</property>
--                        <property name="use_underline">True</property>
--                        <property name="halign">start</property>
--                        <property name="draw_indicator">True</property>
--                        <property name="margin_top">6</property>
--                        <property name="margin_start">12</property>
--                      </object>
--                    </child>
--                    <child type="label">
--                      <object class="GtkLabel" id="label4">
--                        <property name="visible">True</property>
--                        <property name="can_focus">False</property>
--                        <property name="label" translatable="yes">&lt;b&gt;Startup&lt;/b&gt;</property>
--                        <property name="use_markup">True</property>
--                      </object>
--                    </child>
--                  </object>
--                  <packing>
--                    <property name="expand">False</property>
--                    <property name="fill">False</property>
--                    <property name="position">2</property>
--                  </packing>
--                </child>
-               </object>
-               <packing>
-                 <property name="position">4</property>
--- 
-2.24.1
-
-From 3f098dc51a718f3bd427873607dcd47865523dce Mon Sep 17 00:00:00 2001
-From: Aaron Muir Hamilton <aaron@correspondwith.me>
-Date: Tue, 18 Aug 2020 13:45:32 +0900
-Subject: [PATCH 3/9] ui/gtk3: Tell Pango about the engine language in the
- candidate panel
-
-This helps Pango select the correct font variants for the engine
-language, which is especially important between languages based on han
-characters which have wildly different forms of the same character.
-
-BUG=https://github.com/ibus/ibus/issues/2238
----
- ui/gtk3/candidatearea.vala  | 7 +++++++
- ui/gtk3/candidatepanel.vala | 9 +++++++++
- ui/gtk3/panel.vala          | 2 ++
- 3 files changed, 18 insertions(+)
-
-diff --git a/ui/gtk3/candidatearea.vala b/ui/gtk3/candidatearea.vala
-index b22ab5da..0ab41217 100644
---- a/ui/gtk3/candidatearea.vala
-+++ b/ui/gtk3/candidatearea.vala
-@@ -32,6 +32,8 @@ class CandidateArea : Gtk.Box {
-     private bool m_show_cursor;
-     private ThemedRGBA m_rgba;
- 
-+    private Pango.Attribute m_language_attribute;
-+
-     private const string LABELS[] = {
-         "1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.",
-         "9.", "0.", "a.", "b.", "c.", "d.", "e.", "f."
-@@ -102,6 +104,10 @@ class CandidateArea : Gtk.Box {
-             m_labels[i].set_text(LABELS[i]);
-     }
- 
-+    public void set_language(Pango.Attribute language_attribute) {
-+        m_language_attribute = language_attribute.copy();
-+    }
-+
-     public void set_candidates(IBus.Text[] candidates,
-                                uint focus_candidate = 0,
-                                bool show_cursor = true) {
-@@ -115,6 +121,7 @@ class CandidateArea : Gtk.Box {
-             bool visible = false;
-             if (i < candidates.length) {
-                 Pango.AttrList attrs = get_pango_attr_list_from_ibus_text(candidates[i]);
-+                attrs.change(m_language_attribute.copy());
-                 if (i == focus_candidate && show_cursor) {
-                     Pango.Attribute pango_attr = Pango.attr_foreground_new(
-                             (uint16)(m_rgba.selected_fg.red * uint16.MAX),
-diff --git a/ui/gtk3/candidatepanel.vala b/ui/gtk3/candidatepanel.vala
-index 8994cdb9..57544df3 100644
---- a/ui/gtk3/candidatepanel.vala
-+++ b/ui/gtk3/candidatepanel.vala
-@@ -34,6 +34,8 @@ public class CandidatePanel : Gtk.Box{
- 
-     private Gdk.Rectangle m_cursor_location;
- 
-+    private Pango.Attribute m_language_attribute;
-+
-     public signal void cursor_up();
-     public signal void cursor_down();
-     public signal void page_up();
-@@ -112,8 +114,14 @@ public class CandidatePanel : Gtk.Box{
-         m_candidate_area.set_labels(labels);
-     }
- 
-+    public void set_language(Pango.Attribute language_attribute) {
-+        m_candidate_area.set_language(language_attribute);
-+        m_language_attribute = language_attribute.copy();
-+    }
-+
-     private void set_attributes(Gtk.Label label, IBus.Text text) {
-         Pango.AttrList attrs = get_pango_attr_list_from_ibus_text(text);
-+        attrs.change(m_language_attribute.copy());
- 
-         Gtk.StyleContext context = label.get_style_context();
-         Gdk.RGBA color;
-@@ -154,6 +162,7 @@ public class CandidatePanel : Gtk.Box{
-         if (text != null) {
-             m_aux_label.set_text(text.get_text());
-             Pango.AttrList attrs = get_pango_attr_list_from_ibus_text(text);
-+            attrs.change(m_language_attribute.copy());
-             m_aux_label.set_attributes(attrs);
-             m_aux_label.show();
-         } else {
-diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index 680c86ed..8d9f5cc0 100644
---- a/ui/gtk3/panel.vala
-+++ b/ui/gtk3/panel.vala
-@@ -822,6 +822,8 @@ class Panel : IBus.PanelService {
-         if (!m_use_system_keyboard_layout)
-             m_xkblayout.set_layout(engine);
- 
-+        m_candidate_panel.set_language(new Pango.AttrLanguage(Pango.Language.from_string(engine.get_language())));
-+
-         engine_contexts_insert(engine);
-     }
- 
--- 
-2.24.1
-
-From 79a09f1e75357a9f1b38e80717a59c19cca1645e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Tue, 18 Aug 2020 13:45:38 +0900
-Subject: [PATCH 4/9] setup: Add use-glyph-from-engine-lang
-
-The setting can revert the previous setting to choose glpyhs
-with the current locale on lookup window instead of the engine's language.
-
-BUG=https://github.com/ibus/ibus/issues/2238
----
- data/dconf/org.freedesktop.ibus.gschema.xml |  9 ++++
- setup/main.py                               |  7 +++
- setup/setup.ui                              | 49 +++++++++++++++++++++
- ui/gtk3/panel.vala                          | 26 ++++++++++-
- 4 files changed, 89 insertions(+), 2 deletions(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index 7ae8f0f6..11a179a6 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -165,6 +165,15 @@
-       <summary>Custom font</summary>
-       <description>Custom font name for language panel</description>
-     </key>
-+    <key name="use-glyph-from-engine-lang" type="b">
-+      <default>true</default>
-+      <summary>Choose glyphs with input method's language on candidate window</summary>
-+      <description>Some code points have the different glyphs and Pango
-+                   determines the glyphs from the language attribute.
-+                   Pango chooses glyphs from the IBus engine's language
-+                   if the value is true and choose them from the desktop
-+                   locale if the value is false.</description>
-+    </key>
-     <child name="emoji" schema="org.freedesktop.ibus.panel.emoji"/>
-   </schema>
-   <schema id="org.freedesktop.ibus.panel.emoji" path="/desktop/ibus/panel/emoji/">
-diff --git a/setup/main.py b/setup/main.py
-index d5e2078c..8c8d7a47 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -212,6 +212,13 @@ class Setup(object):
-                                    'active',
-                                    Gio.SettingsBindFlags.DEFAULT)
- 
-+        self.__checkbutton_glyph_from_engine_lang = self.__builder.get_object(
-+                "checkbutton_use_glyph_from_engine_lang")
-+        self.__settings_panel.bind('use-glyph-from-engine-lang',
-+                                   self.__checkbutton_glyph_from_engine_lang,
-+                                   'active',
-+                                   Gio.SettingsBindFlags.DEFAULT)
-+
-     def __init_general(self):
-         # embed preedit text
-         self.__checkbutton_embed_preedit_text = self.__builder.get_object(
-diff --git a/setup/setup.ui b/setup/setup.ui
-index 250f43a0..a15b9083 100644
---- a/setup/setup.ui
-+++ b/setup/setup.ui
-@@ -1286,6 +1286,55 @@
-                     <property name="position">1</property>
-                   </packing>
-                 </child>
-+                <child>
-+                  <object class="GtkFrame" id="frame1">
-+                    <property name="visible">True</property>
-+                    <property name="can_focus">False</property>
-+                    <property name="label_xalign">0</property>
-+                    <property name="shadow_type">none</property>
-+                    <child>
-+                      <object class="GtkBox" id="vbox10">
-+                        <property name="orientation">vertical</property>
-+                        <property name="visible">True</property>
-+                        <property name="can_focus">False</property>
-+                        <property name="spacing">6</property>
-+                        <property name="margin_top">6</property>
-+                        <property name="margin_start">24</property>
-+                        <child>
-+                          <object class="GtkCheckButton" id="checkbutton_use_glyph_from_engine_lang">
-+                            <property name="label" translatable="yes">Choose glyphs with input method's language on candidate window</property>
-+                            <property name="use_action_appearance">False</property>
-+                            <property name="visible">True</property>
-+                            <property name="can_focus">True</property>
-+                            <property name="receives_default">False</property>
-+                            <property name="tooltip_text" translatable="yes">Choose glyphs with the input method's language on the candidate window for the duplicated code points</property>
-+                            <property name="use_action_appearance">False</property>
-+                            <property name="halign">start</property>
-+                            <property name="draw_indicator">True</property>
-+                          </object>
-+                          <packing>
-+                            <property name="expand">False</property>
-+                            <property name="fill">False</property>
-+                            <property name="position">0</property>
-+                          </packing>
-+                        </child>
-+                      </object>
-+                    </child>
-+                    <child type="label">
-+                      <object class="GtkLabel" id="label20">
-+                        <property name="visible">True</property>
-+                        <property name="can_focus">False</property>
-+                        <property name="label" translatable="yes">&lt;b&gt;Fonts&lt;/b&gt;</property>
-+                        <property name="use_markup">True</property>
-+                      </object>
-+                    </child>
-+                  </object>
-+                  <packing>
-+                    <property name="expand">False</property>
-+                    <property name="fill">False</property>
-+                    <property name="position">2</property>
-+                  </packing>
-+                </child>
-               </object>
-               <packing>
-                 <property name="position">3</property>
-diff --git a/ui/gtk3/panel.vala b/ui/gtk3/panel.vala
-index 8d9f5cc0..dc98e722 100644
---- a/ui/gtk3/panel.vala
-+++ b/ui/gtk3/panel.vala
-@@ -47,6 +47,7 @@ class Panel : IBus.PanelService {
-     private string m_current_context_path = "";
-     private string m_real_current_context_path = "";
-     private bool m_use_global_engine = true;
-+    private bool m_use_engine_lang = true;
-     private CandidatePanel m_candidate_panel;
-     private Switcher m_switcher;
-     private uint m_switcher_focus_set_engine_id;
-@@ -197,6 +198,15 @@ class Panel : IBus.PanelService {
-                                               ref m_css_provider);
-         });
- 
-+        m_settings_panel.changed["use-glyph-from-engine-lang"].connect((key) =>
-+        {
-+                m_use_engine_lang = m_settings_panel.get_boolean(
-+                        "use-glyph-from-engine-lang");
-+                var engine = m_bus.get_global_engine();
-+                if (engine != null)
-+                    set_language_from_engine(engine);
-+        });
-+
-         m_settings_panel.changed["show-icon-on-systray"].connect((key) => {
-                 set_show_icon_on_systray();
-         });
-@@ -732,6 +742,8 @@ class Panel : IBus.PanelService {
-         set_use_system_keyboard_layout();
-         set_use_global_engine();
-         set_use_xmodmap();
-+        m_use_engine_lang = m_settings_panel.get_boolean(
-+                        "use-glyph-from-engine-lang");
-         update_engines(m_settings_general.get_strv("preload-engines"),
-                        m_settings_general.get_strv("engines-order"));
-         BindingCommon.unbind_switch_shortcut(
-@@ -801,6 +813,17 @@ class Panel : IBus.PanelService {
-         m_engine_contexts.replace(m_current_context_path, engine);
-     }
- 
-+    private void set_language_from_engine(IBus.EngineDesc engine) {
-+        if (m_use_engine_lang) {
-+            m_candidate_panel.set_language(new Pango.AttrLanguage(
-+                    Pango.Language.from_string(engine.get_language())));
-+        } else {
-+            m_candidate_panel.set_language(new Pango.AttrLanguage(
-+                    Pango.Language.from_string(null)));
-+        }
-+
-+    }
-+
-     private void set_engine(IBus.EngineDesc engine) {
-         if (m_property_icon_delay_time_id > 0) {
-             GLib.Source.remove(m_property_icon_delay_time_id);
-@@ -822,8 +845,7 @@ class Panel : IBus.PanelService {
-         if (!m_use_system_keyboard_layout)
-             m_xkblayout.set_layout(engine);
- 
--        m_candidate_panel.set_language(new Pango.AttrLanguage(Pango.Language.from_string(engine.get_language())));
--
-+        set_language_from_engine(engine);
-         engine_contexts_insert(engine);
-     }
- 
--- 
-2.24.1
-
-From 508527daaf90901b6a7fa062372516640f88aa75 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 09:07:39 +0900
-Subject: [PATCH 6/9] engine: Generate simple.xml with denylist
-
-simple.xml was generated by allowlist (whitelist) and it will be
-done by denylist (blacklist).
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- engine/Makefile.am  |  20 ++-
- engine/denylist.txt |  27 ++++
- engine/gensimple.py | 367 ++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 407 insertions(+), 7 deletions(-)
- create mode 100644 engine/denylist.txt
- create mode 100755 engine/gensimple.py
-
-diff --git a/engine/Makefile.am b/engine/Makefile.am
-index 86f0e2b8..ca405496 100644
---- a/engine/Makefile.am
-+++ b/engine/Makefile.am
-@@ -4,6 +4,7 @@
- #
- # Copyright (c) 2010-2016, Google Inc. All rights reserved.
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
-+# Copyright (c) 2013-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Lesser General Public
-@@ -78,20 +79,25 @@ component_DATA = \
- 
- componentdir = $(pkgdatadir)/component
- 
--CLEANFILES = \
-+MAINTAINERCLEANFILES = \
- 	simple.xml \
- 	$(NULL)
- 
- EXTRA_DIST = \
-+	gensimple.py \
- 	iso639converter.py \
--	simple.xml.in \
-+	simple.xml \
- 	$(NULL)
- 
--simple.xml: simple.xml.in
--	$(AM_V_GEN) sed \
--		-e 's|@VERSION[@]|$(VERSION)|g' \
--		-e 's|@libexecdir[@]|$(libexecdir)|g' $< > $@.tmp && \
--		mv $@.tmp $@
-+simple.xml:
-+	$(srcdir)/gensimple.py \
-+	    --input=$(datarootdir)/X11/xkb/rules/evdev.xml \
-+	    --output=$@ \
-+	    --version=$(VERSION).`date '+%Y%m%d'` \
-+	    --exec-path=$(libexecdir)/ibus-engine-simple \
-+	    --iso-path=$(datarootdir)/xml/iso-codes/iso_639.xml \
-+	    --first-language \
-+	$(NULL)
- 
- $(libibus):
- 	$(MAKE) -C $(top_builddir)/src
-diff --git a/engine/denylist.txt b/engine/denylist.txt
-new file mode 100644
-index 00000000..e4cd0473
---- /dev/null
-+++ b/engine/denylist.txt
-@@ -0,0 +1,27 @@
-+# vim:set fileencoding=utf-8 et sts=4 sw=4:
-+#
-+# ibus - Intelligent Input Bus for Linux / Unix OS
-+#
-+# Copyright © 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2.1 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+# Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
-+
-+# This file is a deny list (black list) and used by gensimple.py.
-+# gensimple.py generates the engine list with evdev.xml and if an engine name
-+# is matched with any entries in this file, the engine is excluded from the
-+# engine list.
-+# Asterisk(*) character can be used to match any engines.
-+# E.g. xkb:cn:*:* excludes xkb:cn::zho and xkb:cn:mon_trad:mvf
-+xkb:cn:*:*
-+xkb:nec_vndr/jp:*:*
-diff --git a/engine/gensimple.py b/engine/gensimple.py
-new file mode 100755
-index 00000000..dc4ccf12
---- /dev/null
-+++ b/engine/gensimple.py
-@@ -0,0 +1,367 @@
-+#!/usr/bin/python
-+# vim:set fileencoding=utf-8 et sts=4 sw=4:
-+#
-+# ibus - Intelligent Input Bus for Linux / Unix OS
-+#
-+# Copyright © 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+#
-+# This library is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU Lesser General Public
-+# License as published by the Free Software Foundation; either
-+# version 2.1 of the License, or (at your option) any later version.
-+#
-+# This library is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+# Lesser General Public License for more details.
-+#
-+# You should have received a copy of the GNU Lesser General Public
-+# License along with this library. If not, see <http://www.gnu.org/licenses/>.
-+
-+
-+# This script generates simple.xml with /usr/share/X11/xkb/rules/evdev.xml,
-+# /usr/share/xml/iso-codes/iso_639.xml and denylist.txt
-+
-+
-+from xml.dom import minidom
-+from xml.sax import make_parser as sax_make_parser
-+from xml.sax.handler import feature_namespaces as sax_feature_namespaces
-+from xml.sax.saxutils import XMLFilterBase, XMLGenerator, escape
-+from xml.sax.xmlreader import AttributesImpl
-+from xml.sax._exceptions import SAXParseException
-+
-+import codecs
-+import getopt
-+import io
-+import os
-+import sys
-+
-+VERSION='0.1'
-+EVDEV_XML = '/usr/share/X11/xkb/rules/evdev.xml'
-+EXEC_PATH='/usr/lib/ibus-engine-simple'
-+ISO_PATH='/usr/share/xml/iso-codes/iso_639.xml'
-+PY3K = sys.version_info >= (3, 0)
-+
-+if PY3K:
-+    from io import StringIO
-+else:
-+    # io.StringIO does not work with XMLGenerator
-+    from cStringIO import StringIO
-+    # iso_639.xml includes UTF-8
-+    reload(sys)
-+    sys.setdefaultencoding('utf-8')
-+
-+def usage(prgname):
-+    print('''\
-+%s Version %s
-+Usage:
-+  %s [OPTION...]
-+
-+Options:
-+  -h, --help                         Show this message
-+  -i, --input=EVDEV_XML              Load EVDEV_XML file (default is:
-+                                         %s)
-+  -o, --output=FILE                  Output FILE (default is stdout)
-+  -V, --version=VERSION              Set IBus VERSION (default is %s)
-+  -e, --exec-path=EXEC_PATH          Set EXEC_PATH file (default is:
-+                                         %s)
-+  -I, --iso-path=ISO_PATH            Load ISO_PATH file (default is:
-+                                         %s)
-+  -1, --first-language               Pull first language only in language list
-+''' % (prgname, VERSION, prgname, EVDEV_XML, VERSION, EXEC_PATH, ISO_PATH))
-+
-+
-+class EvdevXML(XMLFilterBase):
-+    def __init__(self, parser=None, downstream=None, iso639=None,
-+                 denylist=None, author=None, first=False):
-+        XMLFilterBase.__init__(self, parser)
-+        self.__downstream = downstream
-+        self.__iso639 = iso639
-+        self.__denylist = denylist
-+        self.__author = author
-+        self.__first = first
-+        self.__is_layout = False
-+        self.__is_description = False
-+        self.__is_config_item = False
-+        self.__is_variant = False
-+        self.__is_iso639 = False
-+        self.__is_name = False
-+        self.__layout = ''
-+        self.__description = ''
-+        self.__variant = ''
-+        self.__list_iso639 = []
-+    def startDocument(self):
-+        if self.__downstream:
-+            self.__downstream.startDocument()
-+            self.__downstream.startElement('engines', AttributesImpl({}))
-+    def endDocument(self):
-+        if self.__downstream:
-+            self.__downstream.endElement('engines')
-+            self.__downstream.endDocument()
-+    def startElement(self, name, attrs):
-+        if name == 'layout':
-+            self.__is_layout = True
-+        elif name == 'description':
-+            self.__is_description = True
-+        elif name == 'configItem':
-+            self.__is_config_item = True
-+        elif name == 'languageList':
-+            self.__list_iso639 = []
-+        elif name == 'iso639Id':
-+            self.__is_iso639 = True
-+        elif name == 'variant':
-+            self.__is_variant = True
-+        elif name == 'name':
-+            self.__is_name = True
-+    def endElement(self, name):
-+        if name == 'layout':
-+            self.__is_layout = False
-+            self.__layout = ''
-+            self.__description = ''
-+            self.__variant = ''
-+            self.__list_iso639 = []
-+        elif name == 'description':
-+            self.__is_description = False
-+        elif name == 'configItem':
-+            self.save()
-+            self.__is_config_item = False
-+        elif name == 'iso639Id':
-+            self.__is_iso639 = False
-+        elif name == 'variant':
-+            self.__is_variant = False
-+        elif name == 'name':
-+            self.__is_name = False
-+    def characters(self, text):
-+        if self.__is_description:
-+            self.__description = text
-+        elif self.__is_name:
-+            if self.__is_variant and self.__is_config_item:
-+                self.__variant = text
-+            elif self.__is_layout and self.__is_config_item:
-+                self.__layout = text
-+        elif self.__is_iso639:
-+                self.__list_iso639.append(text)
-+    def save(self):
-+        if not self.__downstream:
-+            return
-+        for iso in self.__list_iso639:
-+            do_deny = False
-+            for [xkb, layout, variant, lang] in self.__denylist:
-+                if xkb == 'xkb' \
-+                   and ( layout == self.__layout or layout == '*' ) \
-+                   and ( variant == self.__variant or variant == '*' ) \
-+                   and ( lang == iso or variant == '*' ):
-+                    do_deny = True
-+                    break
-+            if do_deny:
-+                continue
-+            self.__downstream.startElement('engine', AttributesImpl({}))
-+            self.__downstream.startElement('name', AttributesImpl({}))
-+            name = 'xkb:%s:%s:%s' % (
-+                self.__layout,
-+                self.__variant,
-+                iso
-+            )
-+            self.__downstream.characters(name)
-+            self.__downstream.endElement('name')
-+            self.__downstream.startElement('language', AttributesImpl({}))
-+            iso639_1 = self.__iso639.code2to1(iso)
-+            if iso639_1 != None:
-+                iso = iso639_1
-+            self.__downstream.characters(iso)
-+            self.__downstream.endElement('language')
-+            self.__downstream.startElement('license', AttributesImpl({}))
-+            self.__downstream.characters('GPL')
-+            self.__downstream.endElement('license')
-+            if self.__author != None:
-+                self.__downstream.startElement('author', AttributesImpl({}))
-+                self.__downstream.characters(self.__author)
-+                self.__downstream.endElement('author')
-+            self.__downstream.startElement('layout', AttributesImpl({}))
-+            self.__downstream.characters(self.__layout)
-+            self.__downstream.endElement('layout')
-+            self.__downstream.startElement('longname', AttributesImpl({}))
-+            self.__downstream.characters(self.__description)
-+            self.__downstream.endElement('longname')
-+            self.__downstream.startElement('description', AttributesImpl({}))
-+            self.__downstream.characters(self.__description)
-+            self.__downstream.endElement('description')
-+            self.__downstream.startElement('icon', AttributesImpl({}))
-+            self.__downstream.characters('ibus-keyboard')
-+            self.__downstream.endElement('icon')
-+            self.__downstream.startElement('rank', AttributesImpl({}))
-+            if self.__variant == '':
-+                self.__downstream.characters('50')
-+            else:
-+                self.__downstream.characters('1')
-+            self.__downstream.endElement('rank')
-+            self.__downstream.endElement('engine')
-+            if self.__first:
-+                break
-+
-+
-+class GenerateEngineXML():
-+    _NAME = 'org.freedesktop.IBus.Simple'
-+    _DESCRIPTION = 'A table based simple engine'
-+    _AUTHOR = 'Peng Huang <shawn.p.huang@gmail.com>'
-+    _HOMEPAGE = 'https://github.com/ibus/ibus/wiki'
-+    _DOMAIN = 'ibus'
-+    def __init__(self, path, iso639=None, denylist='', version='', exec='',
-+                 first=False):
-+        self.__path = path
-+        self.__iso639 = iso639
-+        self.__denylist = denylist
-+        self.__version = version
-+        self.__exec = exec
-+        self.__first = first
-+        self.__result = StringIO()
-+        downstream = XMLGenerator(self.__result, 'utf-8')
-+        self.__load(downstream)
-+
-+    def __load(self, downstream=None):
-+        parser = sax_make_parser()
-+        parser.setFeature(sax_feature_namespaces, 0)
-+        self.__handler = EvdevXML(parser,
-+                                  downstream,
-+                                  self.__iso639,
-+                                  self.__denylist,
-+                                  self._AUTHOR,
-+                                  self.__first)
-+        parser.setContentHandler(self.__handler)
-+        f = codecs.open(self.__path, 'r', encoding='utf-8')
-+        try:
-+            parser.parse(f)
-+        except SAXParseException:
-+            print('Error: Invalid file format: %s' % path)
-+        finally:
-+            f.close()
-+    def write(self, output=None):
-+        if output != None:
-+            od = codecs.open(output, 'w', encoding='utf-8')
-+        else:
-+            if PY3K:
-+                od = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
-+            else:
-+                od = codecs.getwriter('utf-8')(sys.stdout)
-+        contents = self.__result.getvalue()
-+        index = contents.find('<engines>')
-+        if index >= 0:
-+            author = escape(self._AUTHOR)
-+            contents = '%s<component><name>%s</name>\
-+<description>%s</description><exec>%s</exec><version>%s</version>\
-+<author>%s</author><license>%s</license><homepage>%s</homepage>\
-+<textdomain>%s</textdomain>%s</component>' % (
-+        contents[:index],
-+        self._NAME, self._DESCRIPTION,
-+        self.__exec, self.__version, author, 'GPL',
-+        self._HOMEPAGE, self._DOMAIN, contents[index:] )
-+        parsed = minidom.parseString(contents)
-+        # format with indent and encoding attribute in header
-+        xml = parsed.toprettyxml(indent='    ', encoding='utf-8')
-+        # convert byte to str
-+        od.write(str(xml, 'utf-8'))
-+        #od.write(contents)
-+
-+
-+class ISO639XML(XMLFilterBase):
-+    def __init__(self, parser=None):
-+        self.__code2to1 = {}
-+        self.__codetoname = {}
-+        XMLFilterBase.__init__(self, parser)
-+    def startElement(self, name, attrs):
-+        if name != 'iso_639_entry':
-+            return
-+        n = attrs.get('name')
-+        iso639_1 = attrs.get('iso_639_1_code')
-+        iso639_2b = attrs.get('iso_639_2B_code')
-+        iso639_2t = attrs.get('iso_639_2T_code')
-+        if iso639_1 != None:
-+            self.__codetoname[iso639_1] = n
-+            if iso639_2b != None:
-+                self.__code2to1[iso639_2b] = iso639_1
-+                self.__codetoname[iso639_2b] = n
-+            if iso639_2t != None and iso639_2b != iso639_2t:
-+                self.__code2to1[iso639_2t] = iso639_1
-+                self.__codetoname[iso639_2t] = n
-+    def code2to1(self, iso639_2):
-+        try:
-+            return self.__code2to1[iso639_2]
-+        except KeyError:
-+            return None
-+
-+
-+def parse_iso639(path):
-+    f = codecs.open(path, 'r', encoding='utf-8')
-+    parser = sax_make_parser()
-+    parser.setFeature(sax_feature_namespaces, 0)
-+    handler = ISO639XML(parser)
-+    parser.setContentHandler(handler)
-+    try:
-+        parser.parse(f)
-+    except SAXParseException:
-+        print('Error: Invalid file format: %s' % path)
-+    finally:
-+        f.close()
-+    return handler
-+
-+
-+def parse_denylist(denyfile):
-+    denylist = []
-+    f = codecs.open(denyfile, 'r', encoding='utf-8')
-+    for line in f.readlines():
-+        if line == '\n' or line[0] == '#':
-+            continue
-+        line = line.rstrip()
-+        entry = line.split(':')
-+        if len(entry) != 4:
-+            print('WARNING: format error: \'%s\' against \'%s\'' \
-+                  % (line, 'xkb:layout:variant:lang'))
-+            continue
-+        denylist.append(entry)
-+    f.close()
-+    return denylist
-+
-+
-+if __name__ == '__main__':
-+    prgname = os.path.basename(sys.argv[0])
-+    mydir = os.path.dirname(sys.argv[0])
-+    try:
-+        opts, args = getopt.getopt(sys.argv[1:],
-+                                   'hi:o:V:e:I:1',
-+                                   ['help', 'input=', 'output=', 'version=',
-+                                    'exec-path=', 'iso-path=',
-+                                    'first-language'])
-+    except getopt.GetoptError as err:
-+        print(err)
-+        usage(prgname)
-+        sys.exit(2)
-+    if len(args) > 0:
-+        usage(prgname)
-+        sys.exit(2)
-+    input = EVDEV_XML
-+    output = None
-+    version=VERSION
-+    exec_path=EXEC_PATH
-+    iso_path=ISO_PATH
-+    first=False
-+    for opt, arg in opts:
-+        if opt in ('-h', '--help'):
-+            usage(prgname)
-+            sys.exit()
-+        elif opt in ('-i', '--input'):
-+            input = arg
-+        elif opt in ('-o', '--output'):
-+            output = arg
-+        elif opt in ('-V', '--version'):
-+            version = arg
-+        elif opt in ('-e', '--exec-path'):
-+            exec_path = arg
-+        elif opt in ('-I', '--iso-path'):
-+            iso_path = arg
-+        elif opt in ('-1', '--first-langauge'):
-+            first=True
-+
-+    iso639 = parse_iso639(iso_path)
-+    denylist = parse_denylist('%s/%s' % ( mydir, 'denylist.txt'))
-+    xml = GenerateEngineXML(input, iso639, denylist, version, exec_path, first)
-+    xml.write(output)
--- 
-2.24.1
-
-From 6879879002af47d49d8740ca383a048d2ac8e904 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 09:15:14 +0900
-Subject: [PATCH 8/9] src/tests: Fix runtest with simple.xml
-
-Now simple.xml.in is replaced with simple.xml and modify runtest
-to copy simple.xml.
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- src/tests/runtest | 15 ++++++++++++++-
- 1 file changed, 14 insertions(+), 1 deletion(-)
-
-diff --git a/src/tests/runtest b/src/tests/runtest
-index a6e4194b..11bcc6c2 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -91,6 +91,19 @@ func_copy_component () {
-     fi
- }
- 
-+func_copy_simple_xml () {
-+    file=$1
-+    base=`func_basename $file`
-+    libexecdir=`func_dirname $file`
-+    # top_srcdir != top_builddir in make dist
-+    libexecdir=`echo "$libexecdir" | sed -e "s|$top_srcdir|$top_builddir|"`
-+    if test -f $file; then
-+        mkdir -p components
-+        sed "s|\(<exec>\).*\(/ibus-engine-simple</exec>\)|\1$libexecdir\2|" \
-+                < $file > components/$base
-+    fi
-+}
-+
- trap 'func_cleanup $tstdir' 1 2 3 15
- 
- tst=$1; shift
-@@ -127,7 +140,7 @@ run_test_case()
-             exit -1
-         fi
-         # func_copy_component replaces s/$top_srcdir/%top_builddir/
--        func_copy_component "../$top_srcdir/engine/simple.xml"
-+        func_copy_simple_xml "../$top_srcdir/engine/simple.xml"
-         func_copy_component "../$top_srcdir/conf/memconf/memconf.xml"
- 
-         IBUS_COMPONENT_PATH=$PWD/components
--- 
-2.24.1
-
-From 59b902a809ed628bb4d5bbad2b8bcb79a8a23208 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 09:46:46 +0900
-Subject: [PATCH 9/9] src: Add file list in registry file
-
-Under Fedora Silverblue, st_mtime in /usr/share/ibus/component is
-1 Jan 1970 even if ibus engines are installed and ibus-daemon
-cannot detect new engines.
-Now IBusObservedPath saves hashed file list besides st_mtime of
-the compnent directory to detect the installed engines newly.
-
-BUG=https://github.com/ibus/ibus/issues/2132
----
- src/ibuscomponent.c    |   9 +-
- src/ibusobservedpath.c | 277 ++++++++++++++++++++++++++++++++++++-----
- src/ibusregistry.c     |   6 +-
- 3 files changed, 254 insertions(+), 38 deletions(-)
-
-diff --git a/src/ibuscomponent.c b/src/ibuscomponent.c
-index 9837f47c..1404ada0 100644
---- a/src/ibuscomponent.c
-+++ b/src/ibuscomponent.c
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2008-2010 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -499,11 +500,7 @@ ibus_component_output (IBusComponent *component,
- 
-         for (p = component->priv->observed_paths; p != NULL; p = p->next ) {
-             IBusObservedPath *path = (IBusObservedPath *) p->data;
--
--            g_string_append_indent (output, indent + 2);
--            g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
--                                    path->mtime,
--                                    path->path);
-+            ibus_observed_path_output (path, output, indent + 2);
-         }
- 
-         g_string_append_indent (output, indent + 1);
-diff --git a/src/ibusobservedpath.c b/src/ibusobservedpath.c
-index 5b79f1fe..42192431 100644
---- a/src/ibusobservedpath.c
-+++ b/src/ibusobservedpath.c
-@@ -2,7 +2,8 @@
- /* vim:set et sts=4: */
- /* ibus - The Input IBus
-  * Copyright (C) 2008-2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2008-2019 Red Hat, Inc.
-+ * Copyright (C) 2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2008-2020 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -30,9 +31,9 @@ enum {
- };
- 
- 
--/* IBusObservedPathPriv */
-+/* IBusObservedPathPrivate */
- struct _IBusObservedPathPrivate {
--    gpointer pad;
-+    guint   *file_hash_list;
- };
- typedef struct _IBusObservedPathPrivate IBusObservedPathPrivate;
- 
-@@ -52,7 +53,9 @@ static gboolean  ibus_observed_path_copy            (IBusObservedPath       *des
- static gboolean  ibus_observed_path_parse_xml_node  (IBusObservedPath       *path,
-                                                      XMLNode                *node);
- 
--G_DEFINE_TYPE (IBusObservedPath, ibus_observed_path, IBUS_TYPE_SERIALIZABLE)
-+G_DEFINE_TYPE_WITH_PRIVATE (IBusObservedPath,
-+                            ibus_observed_path,
-+                            IBUS_TYPE_SERIALIZABLE)
- 
- static void
- ibus_observed_path_class_init (IBusObservedPathClass *class)
-@@ -84,7 +87,9 @@ static gboolean
- ibus_observed_path_serialize (IBusObservedPath *path,
-                               GVariantBuilder  *builder)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-     gboolean retval;
-+    guint i;
- 
-     retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
-             serialize ((IBusSerializable *)path, builder);
-@@ -93,6 +98,15 @@ ibus_observed_path_serialize (IBusObservedPath *path,
-     g_variant_builder_add (builder, "s", path->path);
-     g_variant_builder_add (builder, "x", path->mtime);
- 
-+    if (!priv->file_hash_list) {
-+        g_variant_builder_add (builder, "u", 0);
-+        return TRUE;
-+    }
-+    for (i = 0; priv->file_hash_list[i]; i++);
-+    g_variant_builder_add (builder, "u", i);
-+    for (i = 0; priv->file_hash_list[i]; i++)
-+        g_variant_builder_add (builder, "u", priv->file_hash_list[i]);
-+
-     return TRUE;
- }
- 
-@@ -100,7 +114,9 @@ static gint
- ibus_observed_path_deserialize (IBusObservedPath *path,
-                                 GVariant         *variant)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-     gint retval;
-+    guint i, length = 0;
- 
-     retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
-             deserialize ((IBusSerializable *)path, variant);
-@@ -109,6 +125,15 @@ ibus_observed_path_deserialize (IBusObservedPath *path,
-     ibus_g_variant_get_child_string (variant, retval++, &path->path);
-     g_variant_get_child (variant, retval++, "x", &path->mtime);
- 
-+    if (g_variant_n_children (variant) < retval + 2)
-+        return retval;
-+    g_variant_get_child (variant, retval++, "u", &length);
-+    if (!length)
-+        return retval;
-+    priv->file_hash_list = g_new0 (guint, length + 1);
-+    for (i = 0; i < length; i++)
-+        g_variant_get_child (variant, retval++, "u", &priv->file_hash_list[i]);
-+
-     return retval;
- }
- 
-@@ -116,14 +141,27 @@ static gboolean
- ibus_observed_path_copy (IBusObservedPath       *dest,
-                          const IBusObservedPath *src)
- {
-+    IBusObservedPathPrivate *dest_priv = IBUS_OBSERVED_PATH_GET_PRIVATE (dest);
-+    IBusObservedPathPrivate *src_priv =
-+            IBUS_OBSERVED_PATH_GET_PRIVATE ((IBusObservedPath *)src);
-     gboolean retval;
-+    guint i;
- 
--    retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->copy ((IBusSerializable *)dest, (IBusSerializable *)src);
-+    retval = IBUS_SERIALIZABLE_CLASS (ibus_observed_path_parent_class)->
-+            copy ((IBusSerializable *)dest, (IBusSerializable *)src);
-     g_return_val_if_fail (retval, FALSE);
- 
-     dest->path = g_strdup (src->path);
-     dest->mtime = src->mtime;
- 
-+    g_clear_pointer (&dest_priv->file_hash_list, g_free);
-+    if (!src_priv->file_hash_list)
-+        return TRUE;
-+    for (i = 0; src_priv->file_hash_list[i]; i++);
-+    dest_priv->file_hash_list = g_new0 (guint, i + 1);
-+    for (i = 0; src_priv->file_hash_list[i]; i++)
-+        dest_priv->file_hash_list[i] = src_priv->file_hash_list[i];
-+
-     return TRUE;
- }
- 
-@@ -137,23 +175,48 @@ ibus_observed_path_copy (IBusObservedPath       *dest,
- 
- void
- ibus_observed_path_output (IBusObservedPath *path,
--                          GString         *output,
--                          gint             indent)
-+                           GString          *output,
-+                           gint              indent)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-+    guint i;
-+
-     g_assert (IBUS_IS_OBSERVED_PATH (path));
-     g_assert (output);
- 
--    g_string_append_indent (output, indent);
--    g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
--                                    path->mtime,
--                                    path->path);
-+    if (!priv->file_hash_list) {
-+        g_string_append_indent (output, indent);
-+        g_string_append_printf (output, "<path mtime=\"%ld\" >%s</path>\n",
-+                                path->mtime,
-+                                path->path);
-+    } else {
-+        g_string_append_indent (output, indent);
-+        g_string_append_printf (
-+                output,
-+                "<path mtime=\"%ld\" type=\"dir\" path=\"%s\">\n",
-+                path->mtime,
-+                path->path);
-+        for (i = 0; priv->file_hash_list[i]; i++) {
-+            g_string_append_indent (output, indent + 1);
-+            g_string_append_printf (output, "<file hash=\"%u\" />\n",
-+                                    priv->file_hash_list[i]);
-+        }
-+        g_string_append_indent (output, indent);
-+        g_string_append_printf (output, "</path>\n");
-+    }
- }
- 
- gboolean
- ibus_observed_path_check_modification (IBusObservedPath *path)
- {
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-     gchar *real_path = NULL;
-     struct stat buf;
-+    gboolean retval = FALSE;
-+    GDir *dir = NULL;
-+    const gchar *name;
-+    guint i = 0;
-+    guint file_num = 0;
- 
-     g_assert (IBUS_IS_OBSERVED_PATH (path));
- 
-@@ -169,11 +232,71 @@ ibus_observed_path_check_modification (IBusObservedPath *path)
-         buf.st_mtime = 0;
-     }
- 
--    g_free (real_path);
- 
--    if (path->mtime == buf.st_mtime)
--        return FALSE;
--    return TRUE;
-+    if (path->mtime != buf.st_mtime) {
-+        retval = TRUE;
-+        goto end_check_modification;
-+    }
-+
-+    /* If an ibus engine is installed, normal file system updates
-+     * the directory mtime of "/usr/share/ibus/component" and
-+     * path->mtime of the cache file and buf.st_mtime of the current directory
-+     * could have the different values.
-+     *
-+     * But under a special file system, the buf.st_mtime is not updated
-+     * even if an ibus engine is installed, likes Fedora Silverblue
-+     * and ibus_observed_path_check_modification() could not detect
-+     * the installed ibus engines.
-+     * Now path->priv->file_hash_list reserves the hash list of the files
-+     * in the observed directory and if a new ibus engine is installed,
-+     * the hash of the compose file does not exists in the cache's
-+     * file_hash_list and ibus-daemon regenerate the cache successfully.
-+     */
-+    if (!priv->file_hash_list) {
-+        /* If the cache version is old, ibus_registry_load_cache() returns
-+         * FALSE and ibus_registry_check_modification() and this are not
-+         * called.
-+         * If the cache version is the latest, the cache file includes the
-+         * filled file_hash_list for directories with ibus_observed_path_new()
-+         * when the cache was generated.
-+         * Then if file_hash_list is null, it's a simple file in ibus
-+         * components and return here simply.
-+         */
-+        goto end_check_modification;
-+    }
-+    dir = g_dir_open (real_path, 0, NULL);
-+    g_return_val_if_fail (dir, FALSE);
-+
-+    while ((name = g_dir_read_name (dir)) != NULL) {
-+        guint current_hash;
-+        gboolean has_file = FALSE;
-+
-+        if (!g_str_has_suffix (name, ".xml"))
-+            continue;
-+        current_hash = g_str_hash (name);
-+        for (i = 0; priv->file_hash_list[i]; i++) {
-+            if (current_hash == priv->file_hash_list[i]) {
-+                has_file = TRUE;
-+                break;
-+            }
-+        }
-+        if (!has_file) {
-+            retval = TRUE;
-+            goto end_check_modification;
-+        }
-+        file_num++;
-+    }
-+    if (!retval) {
-+        for (i = 0; priv->file_hash_list[i]; i++);
-+        if (file_num != i)
-+            retval = TRUE;
-+    }
-+
-+end_check_modification:
-+    if (dir)
-+        g_dir_close (dir);
-+    g_free (real_path);
-+    return retval;
- }
- 
- static void
-@@ -224,7 +347,7 @@ ibus_observed_path_traverse (IBusObservedPath *path,
-             paths = g_list_append (paths, sub);
-             paths = g_list_concat (paths,
-                                    ibus_observed_path_traverse (sub, dir_only));
--        } else if (!dir_only) {
-+        } else if (sub->is_exist && !dir_only) {
-             paths = g_list_append (paths, sub);
-         }
-     }
-@@ -233,36 +356,102 @@ ibus_observed_path_traverse (IBusObservedPath *path,
-     return paths;
- }
- 
-+
-+static gboolean
-+ibus_observed_path_parse_file (IBusObservedPath *path,
-+                               XMLNode          *node,
-+                               int              *nth)
-+{
-+    IBusObservedPathPrivate *priv = IBUS_OBSERVED_PATH_GET_PRIVATE (path);
-+    gchar **attr;
-+
-+    for (attr = node->attributes; attr[0]; attr += 2) {
-+        guint hash = 0;
-+
-+        if (g_strcmp0 (*attr, "hash") == 0)
-+            hash = atol (attr[1]);
-+        else if (g_strcmp0 (*attr, "name") == 0)
-+            hash = g_str_hash (attr[1]);
-+        if (hash) {
-+            if (!priv->file_hash_list) {
-+                *nth = 0;
-+                priv->file_hash_list = g_new0 (guint, *nth + 2);
-+            } else {
-+                priv->file_hash_list = g_renew (guint, priv->file_hash_list,
-+                                                *nth + 2);
-+            }
-+            priv->file_hash_list[*nth] = hash;
-+            priv->file_hash_list[*nth + 1] = 0;
-+            *nth += 1;
-+            continue;
-+        }
-+        g_warning ("Unkonwn attribute %s", attr[0]);
-+    }
-+
-+    return TRUE;
-+}
-+
-+
- static gboolean
- ibus_observed_path_parse_xml_node (IBusObservedPath *path,
-                                    XMLNode          *node)
- {
-+    gchar **attr;
-+    const gchar *full_path = node->text;
-+    GList *p;
-+    int i = 0;
-+
-     g_assert (IBUS_IS_OBSERVED_PATH (path));
-     g_assert (node);
- 
--    if (G_UNLIKELY (g_strcmp0 (node->name, "path") != 0)) {
-+    if (G_UNLIKELY (g_strcmp0 (node->name, "path") != 0))
-         return FALSE;
-+
-+    for (attr = node->attributes; attr[0]; attr += 2) {
-+        if (g_strcmp0 (*attr, "mtime") == 0) {
-+            path->mtime = atol (attr[1]);
-+            continue;
-+        }
-+        if (g_strcmp0 (*attr, "path") == 0) {
-+            full_path = attr[1];
-+            continue;
-+        }
-+        if (g_strcmp0 (*attr, "type") == 0) {
-+            if (!g_strcmp0 (attr[1], "dir"))
-+                path->is_dir = TRUE;
-+            else if (!g_strcmp0 (attr[1], "file"))
-+                path->is_dir = FALSE;
-+            else
-+                g_warning ("The type attribute can be \"dir\" or \"file\".");
-+            continue;
-+        }
-+        g_warning ("Unkonwn attribute %s", attr[0]);
-     }
- 
--    if (node->text[0] == '~' && node->text[1] != G_DIR_SEPARATOR) {
--        g_warning ("Invalid path \"%s\"", node->text);
-+    if (full_path[0] == '~' && full_path[1] != G_DIR_SEPARATOR) {
-+        g_warning ("Invalid path \"%s\"", full_path);
-         return FALSE;
-     }
- 
--    path->path = g_strdup (node->text);
-+    path->path = g_strdup (full_path);
- 
--    gchar **attr;
--    for (attr = node->attributes; attr[0]; attr += 2) {
--        if (g_strcmp0 (*attr, "mtime") == 0) {
--            path->mtime = atol (attr[1]);
-+    if (!path->is_dir)
-+        return TRUE;
-+
-+    for (i = 0, p = node->sub_nodes; p != NULL; p = p->next) {
-+        XMLNode *sub_node = (XMLNode *)p->data;
-+
-+        if (G_UNLIKELY (g_strcmp0 (sub_node->name, "file") != 0)) {
-+            g_warning ("Unkonwn tag %s", sub_node->name);
-             continue;
-         }
--        g_warning ("Unkonwn attribute %s", attr[0]);
-+        ibus_observed_path_parse_file (path, sub_node, &i);
-     }
- 
-     return TRUE;
- }
- 
-+
- IBusObservedPath *
- ibus_observed_path_new_from_xml_node (XMLNode *node,
-                                      gboolean fill_stat)
-@@ -288,16 +477,46 @@ IBusObservedPath *
- ibus_observed_path_new (const gchar *path,
-                         gboolean     fill_stat)
- {
--    g_assert (path);
--
-     IBusObservedPath *op;
-+    IBusObservedPathPrivate *priv;
-+    GList *file_list, *l;
-+    guint i = 0;
- 
-+    g_assert (path);
-     op = (IBusObservedPath *) g_object_new (IBUS_TYPE_OBSERVED_PATH, NULL);
-     op->path = g_strdup (path);
- 
--    if (fill_stat) {
--        ibus_observed_path_fill_stat (op);
-+    priv = IBUS_OBSERVED_PATH_GET_PRIVATE (op);
-+    l = file_list = ibus_observed_path_traverse (op, FALSE);
-+    for (; l; l = l->next) {
-+        IBusObservedPath *sub = l->data;
-+        const gchar *file = NULL;
-+
-+        g_return_val_if_fail (sub && sub->path, op);
-+
-+        file = sub->path;
-+        if (!g_str_has_suffix (file, ".xml"))
-+            continue;
-+        if (g_str_has_prefix (file, path)) {
-+            file += strlen (path);
-+            if (*file == '/')
-+                file++;
-+            /* Ignore sub directories */
-+            if (strchr (file, '/'))
-+                continue;
-+        }
-+        if (!i)
-+            priv->file_hash_list = g_new0 (guint, i + 2);
-+        else
-+            priv->file_hash_list = g_renew (guint, priv->file_hash_list, i + 2);
-+        priv->file_hash_list[i] = g_str_hash (file);
-+        priv->file_hash_list[i + 1] = 0;
-+        ++i;
-     }
-+    g_list_free_full (file_list, (GDestroyNotify)ibus_observed_path_destroy);
-+
-+    if (fill_stat)
-+        ibus_observed_path_fill_stat (op);
- 
-     return op;
- }
-diff --git a/src/ibusregistry.c b/src/ibusregistry.c
-index 43990d5f..3386a5d1 100644
---- a/src/ibusregistry.c
-+++ b/src/ibusregistry.c
-@@ -2,8 +2,8 @@
- /* vim:set et sts=4: */
- /* bus - The Input Bus
-  * Copyright (C) 2015 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright (C) 2015-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
-- * Copyright (C) 2015-2019 Red Hat, Inc.
-+ * Copyright (C) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright (C) 2015-2020 Red Hat, Inc.
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -29,7 +29,7 @@
- #include "ibusregistry.h"
- 
- #define IBUS_CACHE_MAGIC 0x49425553 /* "IBUS" */
--#define IBUS_CACHE_VERSION 0x00010512
-+#define IBUS_CACHE_VERSION 0x00010522
- 
- enum {
-     CHANGED,
--- 
-2.24.1
-
-From 568d58dfadefa801b96058c1155daecff3d51605 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Fri, 21 Aug 2020 22:07:31 +0900
-Subject: [PATCH] engine: Add layout_variant in gensimple.py
-
-Missed to handle layout_variant and also add latam layouts to denylist
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- engine/denylist.txt | 1 +
- engine/gensimple.py | 5 +++++
- 2 files changed, 6 insertions(+)
-
-diff --git a/engine/denylist.txt b/engine/denylist.txt
-index e4cd0473..9cbc7fc3 100644
---- a/engine/denylist.txt
-+++ b/engine/denylist.txt
-@@ -24,4 +24,5 @@
- # Asterisk(*) character can be used to match any engines.
- # E.g. xkb:cn:*:* excludes xkb:cn::zho and xkb:cn:mon_trad:mvf
- xkb:cn:*:*
-+xkb:latam:*:*
- xkb:nec_vndr/jp:*:*
-diff --git a/engine/gensimple.py b/engine/gensimple.py
-index dc4ccf12..18f7dc8c 100755
---- a/engine/gensimple.py
-+++ b/engine/gensimple.py
-@@ -180,6 +180,11 @@ class EvdevXML(XMLFilterBase):
-             self.__downstream.startElement('layout', AttributesImpl({}))
-             self.__downstream.characters(self.__layout)
-             self.__downstream.endElement('layout')
-+            if self.__variant != '':
-+                self.__downstream.startElement('layout_variant',
-+                                               AttributesImpl({}))
-+                self.__downstream.characters(self.__variant)
-+                self.__downstream.endElement('layout_variant')
-             self.__downstream.startElement('longname', AttributesImpl({}))
-             self.__downstream.characters(self.__description)
-             self.__downstream.endElement('longname')
--- 
-2.24.1
-
-From 5959d6f1d40c06f57bd895cd84d2b84deb6b6d8d Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 10:30:43 +0900
-Subject: [PATCH] data/dconf: Fix rm $TMPDIR in make-dconf-override-db.sh
-
-dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
-via systemd since gvfs 1.45.90 in Fedora 33
----
- data/dconf/make-dconf-override-db.sh | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/data/dconf/make-dconf-override-db.sh b/data/dconf/make-dconf-override-db.sh
-index 9c650e97..48dd8fac 100755
---- a/data/dconf/make-dconf-override-db.sh
-+++ b/data/dconf/make-dconf-override-db.sh
-@@ -45,6 +45,10 @@ for schema in $schemas; do
-   done
- done
- 
-+# dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
-+# via systemd since gvfs 1.45.90 in Fedora 33
-+# and rm $TMPDIR could be failed until umount would be called.
-+umount $TMPDIR/cache/gvfs
- rm -rf $TMPDIR
- 
- kill $DBUS_SESSION_BUS_PID
--- 
-2.24.1
-
-From e10fc89c5afa1941801429b3a653b3f83b5d3802 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 10:31:10 +0900
-Subject: [PATCH] src: Update ibusunicodegen.h with unicode-ucd 13.0.0
-
----
- src/ibusunicodegen.h |  32 ++++
- 2 files changed, 262 insertions(+), 170 deletions(-)
-
-diff --git a/src/ibusunicodegen.h b/src/ibusunicodegen.h
-index 6a60a5a9..c891d0e3 100644
---- a/src/ibusunicodegen.h
-+++ b/src/ibusunicodegen.h
-@@ -847,6 +847,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Rumi Numeral Symbols"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Yezidi"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -855,6 +859,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Sogdian"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Chorasmian"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -939,6 +947,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Warang Citi"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Dives Akuru"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -975,6 +987,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Makasar"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Lisu Supplement"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1039,6 +1055,14 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Tangut Components"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Khitan Small Script"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Tangut Supplement"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1187,6 +1211,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("Symbols and Pictographs Extended-A"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("Symbols for Legacy Computing"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-@@ -1211,6 +1239,10 @@ const static char *unicode_blocks[] = {
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
-     N_("CJK Compatibility Ideographs Supplement"),
-+    /* TRANSLATORS: You might refer the translations from gucharmap with
-+                    the following command:
-+       msgmerge -C gucharmap.po ibus.po ibus.pot */
-+    N_("CJK Unified Ideographs Extension G"),
-     /* TRANSLATORS: You might refer the translations from gucharmap with
-                     the following command:
-        msgmerge -C gucharmap.po ibus.po ibus.pot */
--- 
-2.24.1
-
-From 394d9a83962225bff4c39ed3e9ddd5c3019a3936 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 11:52:16 +0900
-Subject: [PATCH] data/dconf: Fix regression in make-dconf-override-db.sh
-
----
- data/dconf/make-dconf-override-db.sh | 4 +++-
- 1 file changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/data/dconf/make-dconf-override-db.sh b/data/dconf/make-dconf-override-db.sh
-index 48dd8fac..601c1c3f 100755
---- a/data/dconf/make-dconf-override-db.sh
-+++ b/data/dconf/make-dconf-override-db.sh
-@@ -48,7 +48,9 @@ done
- # dbus-launch and gsettings run /usr/lib*/gvfsd-fuse $TMPDIR/cache/gvfs -f
- # via systemd since gvfs 1.45.90 in Fedora 33
- # and rm $TMPDIR could be failed until umount would be called.
--umount $TMPDIR/cache/gvfs
-+if [ -d $TMPDIR/cache/gvfs ] ; then
-+    umount $TMPDIR/cache/gvfs
-+fi
- rm -rf $TMPDIR
- 
- kill $DBUS_SESSION_BUS_PID
--- 
-2.24.1
-
-From e938846b1624a9455128edb64f144b0a1181736c Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 27 Aug 2020 22:40:23 +0900
-Subject: [PATCH] engine: Genarate simple.xml at build time
-
-The engine path of ibus-engine-simple should be decided in
-build time and simple.xml is renamed to simple.xml.in
-Also Revert 6879879002af47d49d8740ca383a048d2ac8e904
-
-BUG=https://github.com/ibus/ibus/issues/2153
----
- engine/Makefile.am | 15 ++++++++++++---
- src/tests/runtest  | 15 +--------------
- 2 files changed, 13 insertions(+), 17 deletions(-)
-
-diff --git a/engine/Makefile.am b/engine/Makefile.am
-index ca405496..d810704b 100644
---- a/engine/Makefile.am
-+++ b/engine/Makefile.am
-@@ -80,21 +80,30 @@ component_DATA = \
- componentdir = $(pkgdatadir)/component
- 
- MAINTAINERCLEANFILES = \
-+	simple.xml.in \
-+	$(NULL)
-+
-+CLEANFILES = \
- 	simple.xml \
- 	$(NULL)
- 
- EXTRA_DIST = \
- 	gensimple.py \
- 	iso639converter.py \
--	simple.xml \
-+	simple.xml.in \
- 	$(NULL)
- 
--simple.xml:
-+simple.xml: simple.xml.in
-+	$(AM_V_GEN) sed \
-+	    -e 's|@libexecdir[@]|$(libexecdir)|g' $< > $@.tmp && \
-+	    mv $@.tmp $@
-+
-+simple.xml.in:
- 	$(srcdir)/gensimple.py \
- 	    --input=$(datarootdir)/X11/xkb/rules/evdev.xml \
- 	    --output=$@ \
- 	    --version=$(VERSION).`date '+%Y%m%d'` \
--	    --exec-path=$(libexecdir)/ibus-engine-simple \
-+	    --exec-path=@libexecdir\@/ibus-engine-simple \
- 	    --iso-path=$(datarootdir)/xml/iso-codes/iso_639.xml \
- 	    --first-language \
- 	$(NULL)
-diff --git a/src/tests/runtest b/src/tests/runtest
-index 11bcc6c2..a6e4194b 100755
---- a/src/tests/runtest
-+++ b/src/tests/runtest
-@@ -91,19 +91,6 @@ func_copy_component () {
-     fi
- }
- 
--func_copy_simple_xml () {
--    file=$1
--    base=`func_basename $file`
--    libexecdir=`func_dirname $file`
--    # top_srcdir != top_builddir in make dist
--    libexecdir=`echo "$libexecdir" | sed -e "s|$top_srcdir|$top_builddir|"`
--    if test -f $file; then
--        mkdir -p components
--        sed "s|\(<exec>\).*\(/ibus-engine-simple</exec>\)|\1$libexecdir\2|" \
--                < $file > components/$base
--    fi
--}
--
- trap 'func_cleanup $tstdir' 1 2 3 15
- 
- tst=$1; shift
-@@ -140,7 +127,7 @@ run_test_case()
-             exit -1
-         fi
-         # func_copy_component replaces s/$top_srcdir/%top_builddir/
--        func_copy_simple_xml "../$top_srcdir/engine/simple.xml"
-+        func_copy_component "../$top_srcdir/engine/simple.xml"
-         func_copy_component "../$top_srcdir/conf/memconf/memconf.xml"
- 
-         IBUS_COMPONENT_PATH=$PWD/components
--- 
-2.24.1
-
-From 00adea6d16939e2da35ede7f2ecf3fe0a2156fa6 Mon Sep 17 00:00:00 2001
-From: "ntfs.hard" <ntfs.hard@gmail.com>
-Date: Thu, 3 Sep 2020 14:59:35 +0900
-Subject: [PATCH] Fix for several error spotted by static analyzer
-
-- ibuscomposetable.c, ibusxml.c:
-Check size before memory access
-
-- inputcontext.c:
-Use logical operator for bool type variables
-
-- config.c:
-Extra break removed
-
-BUG=https://github.com/ibus/ibus/pull/2242
----
- bus/inputcontext.c     | 6 +++---
- src/ibuscomposetable.c | 2 +-
- src/ibusxml.c          | 2 +-
- 4 files changed, 5 insertions(+), 6 deletions(-)
-
-diff --git a/bus/inputcontext.c b/bus/inputcontext.c
-index ceea4b60..8d84fd05 100644
---- a/bus/inputcontext.c
-+++ b/bus/inputcontext.c
-@@ -2842,11 +2842,11 @@ bus_input_context_update_preedit_text (BusInputContext *context,
-     context->preedit_text = (IBusText *) g_object_ref_sink (text ? text :
-                                                             text_empty);
-     context->preedit_cursor_pos = cursor_pos;
--    if (use_extension)
-+    if (use_extension) {
-         context->preedit_visible = visible;
--    if (use_extension)
-         context->preedit_mode = mode;
--    extension_visible = context->preedit_visible |
-+    }
-+    extension_visible = context->preedit_visible ||
-                         (context->emoji_extension != NULL);
- 
-     if (use_extension && context->emoji_extension) {
-diff --git a/src/ibuscomposetable.c b/src/ibuscomposetable.c
-index c50be2b3..ef20469c 100644
---- a/src/ibuscomposetable.c
-+++ b/src/ibuscomposetable.c
-@@ -382,7 +382,7 @@ ibus_compose_list_check_duplicated (GList *compose_list,
-             
-             if (n_outputs == unichar_length (output_chars)) {
-                 int j = 0;
--                while (compose_data->values[j] && j < n_outputs) {
-+                while (j < n_outputs && compose_data->values[j]) {
-                     if (compose_data->values[j] != output_chars[j])
-                         break;
-                     ++j;
-diff --git a/src/ibusxml.c b/src/ibusxml.c
-index 266a8207..b6d0feb8 100644
---- a/src/ibusxml.c
-+++ b/src/ibusxml.c
-@@ -148,7 +148,7 @@ _is_space (const gchar *text,
- {
-     gsize i = 0;
- 
--    for (i = 0; text[i] != '\0' && i < text_len; i++) {
-+    for (i = 0; i < text_len && text[i] != '\0'; i++) {
-         switch (text[i]) {
-         case '\t':
-         case ' ':
--- 
-2.24.1
-
-From 7caead10d3698ef1ecaa97e6e122e27a720d612e Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Thu, 3 Sep 2020 21:21:31 +0900
-Subject: [PATCH] Fix string formats in translatable strings
-
----
- data/dconf/org.freedesktop.ibus.gschema.xml |  2 +-
- setup/enginetreeview.py                     |  6 +++---
- setup/main.py                               |  6 +++---
- tools/main.vala                             |  4 ++--
- 6 files changed, 16 insertions(+), 16 deletions(-)
-
-diff --git a/data/dconf/org.freedesktop.ibus.gschema.xml b/data/dconf/org.freedesktop.ibus.gschema.xml
-index 11a179a6..a79e9296 100644
---- a/data/dconf/org.freedesktop.ibus.gschema.xml
-+++ b/data/dconf/org.freedesktop.ibus.gschema.xml
-@@ -195,7 +195,7 @@
-     <key name="lang" type="s">
-       <default>'en'</default>
-       <summary>Default language for emoji dictionary</summary>
--      <description>Choose a default language of emoji dictionaries on the emoji dialog. The value $lang is applied to /usr/share/ibus/dicts/emoji-$lang.dict</description>
-+      <description>Choose a default language of emoji dictionaries on the emoji dialog. The value $lang is applied to /usr/share/ibus/dicts/emoji-$lang.dict .</description>
-     </key>
-     <key name="favorites" type="as">
-       <default>[]</default>
-diff --git a/setup/enginetreeview.py b/setup/enginetreeview.py
-index aea84593..8534de5e 100644
---- a/setup/enginetreeview.py
-+++ b/setup/enginetreeview.py
-@@ -3,8 +3,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2015 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2014-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2018 Red Hat, Inc.
-+# Copyright (c) 2014-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2020 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Lesser General Public
-@@ -93,7 +93,7 @@ class EngineTreeView(Gtk.TreeView):
-         renderer.set_property("has-entry", False)
-         renderer.set_property("editable", True)
- 
--        column = Gtk.TreeViewColumn(_("Kbd"))
-+        column = Gtk.TreeViewColumn("Kbd")
-         column.set_expand(False)
-         column.set_fixed_width(32)
-         column.set_sizing(Gtk.TreeViewColumnSizing.FIXED)
-diff --git a/setup/main.py b/setup/main.py
-index 8c8d7a47..673c8cde 100644
---- a/setup/main.py
-+++ b/setup/main.py
-@@ -4,8 +4,8 @@
- # ibus - The Input Bus
- #
- # Copyright (c) 2007-2016 Peng Huang <shawn.p.huang@gmail.com>
--# Copyright (c) 2010-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
--# Copyright (c) 2007-2016 Red Hat, Inc.
-+# Copyright (c) 2010-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+# Copyright (c) 2007-2020 Red Hat, Inc.
- #
- # This library is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Lesser General Public
-@@ -547,7 +547,7 @@ class Setup(object):
-             self.__flush_gtk_events()
-         else:
-             # Translators: %d == 5 currently
--            message = _("IBus daemon could not be started in %d seconds")
-+            message = _("IBus daemon could not be started in %d seconds.")
-             dlg = Gtk.MessageDialog(message_type = Gtk.MessageType.INFO,
-                                     buttons = Gtk.ButtonsType.OK,
-                                     text = message % timeout)
-diff --git a/tools/main.vala b/tools/main.vala
-index bf9c0fc9..26e7fd88 100644
---- a/tools/main.vala
-+++ b/tools/main.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright(c) 2013 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright(c) 2015-2018 Takao Fujiwara <takao.fujiwara1@gmail.com>
-+ * Copyright(c) 2015-2020 Takao Fujiwara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -453,7 +453,7 @@ const CommandEntry commands[]  = {
-     { "read-config", N_("Show the configuration values"), read_config },
-     { "reset-config", N_("Reset the configuration values"), reset_config },
- #if EMOJI_DICT
--    { "emoji", N_("Save emoji on dialog to clipboard "), emoji_dialog },
-+    { "emoji", N_("Save emoji on dialog to clipboard"), emoji_dialog },
- #endif
-     { "help", N_("Show this information"), print_help }
- };
--- 
-2.24.1
-
-From a440942a62c46578377a8679c48146f597e338a4 Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 9 Sep 2020 18:36:18 +0900
-Subject: [PATCH] ui/gtk3: Accept xdigits only for Unicode typing
-
-Ctrl-Shift-u behavior now follows GTK's one.
-
-BUG=https://github.com/ibus/ibus/issues/2249
----
- ui/gtk3/panelbinding.vala | 8 +++++---
- 1 file changed, 5 insertions(+), 3 deletions(-)
-
-diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala
-index 01c43b0d..861255b1 100644
---- a/ui/gtk3/panelbinding.vala
-+++ b/ui/gtk3/panelbinding.vala
-@@ -3,7 +3,7 @@
-  * ibus - The Input Bus
-  *
-  * Copyright(c) 2018 Peng Huang <shawn.p.huang@gmail.com>
-- * Copyright(c) 2018 Takao Fujwiara <takao.fujiwara1@gmail.com>
-+ * Copyright(c) 2018-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
-  *
-  * This library is free software; you can redistribute it and/or
-  * modify it under the terms of the GNU Lesser General Public
-@@ -190,7 +190,7 @@ class Preedit : Gtk.Window {
- 
-     public IBus.Text get_commit_text() {
-         string extension_text = m_extension_preedit_emoji.get_text();
--        if (extension_text.length == 0)
-+        if (extension_text.length == 0 && m_prefix != "u")
-             extension_text = m_extension_preedit_text.get_text();
-         return new IBus.Text.from_string(extension_text);
-     }
-@@ -556,8 +556,10 @@ class PanelBinding : IBus.PanelService {
- 
-     private bool key_press_keyval(uint keyval) {
-         unichar ch = IBus.keyval_to_unicode(keyval);
-+        if (m_extension_name == "unicode" && !ch.isxdigit())
-+            return false;
-         if (ch.iscntrl())
--                return false;
-+            return false;
-         string str = ch.to_string();
-         m_preedit.append_text(str);
-         string annotation = m_preedit.get_text();
--- 
-2.24.1
-
-From 3aa670e9f8319fe064ce7c45ce56304ca5af94dc Mon Sep 17 00:00:00 2001
-From: fujiwarat <takao.fujiwara1@gmail.com>
-Date: Wed, 9 Sep 2020 18:42:10 +0900
-Subject: [PATCH] engine: Fix to pull the correct language with no iso639
- variants
-
-Some variants have iso639 but others do not in evdev.xml and
-gensimple.py have to fallback to the layout iso639.
-
-BUG=rhbz#1876877
----
- engine/gensimple.py | 19 +++++++++++++++++--
- 1 file changed, 17 insertions(+), 2 deletions(-)
-
-diff --git a/engine/gensimple.py b/engine/gensimple.py
-index 18f7dc8c..de6d7ff5 100755
---- a/engine/gensimple.py
-+++ b/engine/gensimple.py
-@@ -90,6 +90,7 @@ class EvdevXML(XMLFilterBase):
-         self.__description = ''
-         self.__variant = ''
-         self.__list_iso639 = []
-+        self.__list_iso639_for_variant = []
-     def startDocument(self):
-         if self.__downstream:
-             self.__downstream.startDocument()
-@@ -106,7 +107,10 @@ class EvdevXML(XMLFilterBase):
-         elif name == 'configItem':
-             self.__is_config_item = True
-         elif name == 'languageList':
--            self.__list_iso639 = []
-+            if self.__is_variant and self.__is_config_item:
-+                self.__list_iso639_for_variant = []
-+            elif self.__is_layout and self.__is_config_item:
-+                self.__list_iso639 = []
-         elif name == 'iso639Id':
-             self.__is_iso639 = True
-         elif name == 'variant':
-@@ -129,6 +133,7 @@ class EvdevXML(XMLFilterBase):
-             self.__is_iso639 = False
-         elif name == 'variant':
-             self.__is_variant = False
-+            self.__list_iso639_for_variant = []
-         elif name == 'name':
-             self.__is_name = False
-     def characters(self, text):
-@@ -140,11 +145,21 @@ class EvdevXML(XMLFilterBase):
-             elif self.__is_layout and self.__is_config_item:
-                 self.__layout = text
-         elif self.__is_iso639:
-+            if self.__is_variant and self.__is_config_item:
-+                self.__list_iso639_for_variant.append(text)
-+            elif self.__is_layout and self.__is_config_item:
-                 self.__list_iso639.append(text)
-     def save(self):
-         if not self.__downstream:
-             return
--        for iso in self.__list_iso639:
-+        list_iso639 = []
-+        if self.__is_variant and self.__is_config_item:
-+            list_iso639 = self.__list_iso639_for_variant
-+            if len(list_iso639) == 0:
-+                list_iso639 = self.__list_iso639
-+        elif self.__is_layout and self.__is_config_item:
-+            list_iso639 = self.__list_iso639
-+        for iso in list_iso639:
-             do_deny = False
-             for [xkb, layout, variant, lang] in self.__denylist:
-                 if xkb == 'xkb' \
--- 
-2.24.1
-

             reply	other threads:[~2026-05-31  2:07 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-31  2:07 Takao Fujiwara [this message]
  -- strict thread matches above, loose matches on Subject: below --
2026-05-31  2:09 [rpms/ibus] autotool: Delete upstreamed ibus-HEAD.patch Takao Fujiwara
2026-05-31  2:09 Takao Fujiwara
2026-05-31  2:08 Takao Fujiwara
2026-05-31  2:08 Takao Fujiwara
2026-05-31  2:08 Takao Fujiwara
2026-05-31  2:07 Takao Fujiwara
2026-05-31  2:07 Takao Fujiwara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=178019325006.1.2493224813599113829.rpms-ibus-1ddc1a0b4155@fedoraproject.org \
    --to=tfujiwar@redhat.com \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox