diff --git a/30a3641e19c541924959a5770dd784b4424288d4.patch b/30a3641e19c541924959a5770dd784b4424288d4.patch new file mode 100644 index 0000000..676dba7 --- /dev/null +++ b/30a3641e19c541924959a5770dd784b4424288d4.patch @@ -0,0 +1,76 @@ +diff --git a/.travis.yml b/.travis.yml +new file mode 100644 +index 000000000..e90dc230c +--- /dev/null ++++ b/.travis.yml +@@ -0,0 +1,70 @@ ++language: c ++compiler: gcc ++os: linux ++ ++# Require gettext-0.19.8 ++dist: focal ++ ++branches: ++ only: ++ - master ++ ++# FIXME: Run script in every arch ++arch: ++ - amd64 ++ #- ppc64le ++ #- s390x ++ #- arm64 ++ ++addons: ++ apt: ++ packages: ++ # For autogen.sh ++ - gnome-common ++ - gtk-doc-tools ++ # For make from ++ # https://packages.ubuntu.com/search?searchon=sourcenames&keywords=ibus ++ - desktop-file-utils ++ - gobject-introspection ++ - iso-codes ++ - libdconf-dev ++ - libgirepository1.0-dev ++ - libglib2.0-dev ++ - libgtk-3-bin ++ - libgtk-3-dev ++ - libgtk2.0-dev ++ - libtool ++ - libwayland-dev ++ - python-gi-dev ++ - python3-all ++ - unicode-cldr-core ++ - unicode-data ++ - valac ++ ++jobs: ++ include: ++ - name: Build in Ubuntu ++ before_script: ++ - sudo apt-get -qq update ++ script: ++ - set -e ++ - git pull --depth=200 ++ # configure options from ++ # https://salsa.debian.org/debian/ibus/-/blob/master/debian/rules ++ - > ++ ./autogen.sh ++ --with-ucd-dir='/usr/share/unicode' ++ # Set the cutom DESTDIR because the default DESTDIR ++ # /home/travis/bulid/fujiwarat/$PKG/ibus/ibus-$VERSION/_inst seems to be ++ # too long and failed to set DESTDIR to install bindings/pygobject/IBus.py ++ - > ++ make distcheck ++ DISTCHECK_CONFIGURE_FLAGS=" ++ --enable-gtk-doc ++ --disable-schemas-install ++ --enable-memconf ++ --with-ucd-dir='/usr/share/unicode' ++ " ++ DISABLE_GUI_TESTS="ibus-compose ibus-keypress test-stress" ++ VERBOSE=1 ++ DESTDIR="$HOME/build/$USER/dest" diff --git a/ibus-1.5.19.tar.gz b/ibus-1.5.19.tar.gz deleted file mode 100644 index cf7e8b0..0000000 Binary files a/ibus-1.5.19.tar.gz and /dev/null differ diff --git a/ibus-1.5.23.tar.gz b/ibus-1.5.23.tar.gz new file mode 100644 index 0000000..1425490 Binary files /dev/null and b/ibus-1.5.23.tar.gz differ diff --git a/ibus-1385349-segv-bus-proxy.patch b/ibus-1385349-segv-bus-proxy.patch index f206eda..91ca4a7 100644 --- a/ibus-1385349-segv-bus-proxy.patch +++ b/ibus-1385349-segv-bus-proxy.patch @@ -1,108 +1,119 @@ -From 865b204f1c06b782cf7b4a479b358e76f4b3dfee Mon Sep 17 00:00:00 2001 +From 41c325dfb32269c9aadfeedb4df44656aac4d883 Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Tue, 17 Jul 2018 13:39:30 +0900 -Subject: [PATCH] bus: Fix SEGV in bus_panel_proxy_focus_in() +Date: Fri, 20 Nov 2020 09:53:54 +0900 +Subject: [PATCH] Fix SEGV in bus_panel_proxy_focus_in() + +rhbz#1350291 SEGV in BUS_IS_CONNECTION(skip_connection) in +bus_dbus_impl_dispatch_message_by_rule() +check if dbus_connection is closed in bus_dbus_impl_connection_filter_cb(). + +rhbz#1767976 SEGV in assert(connection != NULL) in +bus_dbus_impl_connection_filter_cb() +call bus_connection_set_filter() in bus_dbus_impl_destroy(). + +rhbz#1601577 rhbz#1797726 SEGV in ibus_engine_desc_get_layout() in +bus_engine_proxy_new_internal() +WIP: Added a GError to get the error message to check why the SEGV happened. + +rhbz#1663528 SEGV in g_mutex_clear() in bus_dbus_impl_destroy() +If the mutex is not unlocked, g_mutex_clear() causes assert. + +rhbz#1767691 SEGV in client/x11/main.c:_sighandler(). +Do not call atexit functions in _sighandler(). + +rhbz#1795499 SEGV in ibus_bus_get_bus_address() because of no _bus->priv. +_changed_cb() should not be called after ibus_bus_destroy() is called. + +rhbz#1771238 SEGV in assert(m_loop == null) in switcher.vala. +Grabbing keyboard could be failed and switcher received the keyboard +events and m_loop was not released. + +rhbz#1797120 SEGV in assert(bus.is_connected()) in panel_binding_construct() +Check m_ibus in extension.vala:bus_name_acquired_cb() -BUG=rhbz#1349148 -BUG=rhbz#1385349 BUG=rhbz#1350291 -BUG=rhbz#1406699 -BUG=rhbz#1432252 BUG=rhbz#1601577 +BUG=rhbz#1663528 +BUG=rhbz#1767691 +BUG=rhbz#1795499 +BUG=rhbz#1771238 +BUG=rhbz#1767976 +BUG=rhbz#1797120 --- - bus/dbusimpl.c | 38 ++++++++++++++++++++++++++++++++------ - bus/engineproxy.c | 5 ++++- - bus/ibusimpl.c | 21 ++++++++++++++++++--- - 3 files changed, 54 insertions(+), 10 deletions(-) + bus/dbusimpl.c | 47 ++++++++++++++++++++++++--- + bus/engineproxy.c | 51 ++++++++++++++++++++++------- + client/x11/main.c | 8 ++++- + src/ibusbus.c | 5 +++ + ui/gtk3/extension.vala | 4 +++ + ui/gtk3/switcher.vala | 73 +++++++++++++++++++++++++----------------- + 6 files changed, 141 insertions(+), 47 deletions(-) diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c -index b54ef817..e4dd8683 100644 +index 59787a80..af2fbde2 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 -- * Copyright (C) 2008-2013 Red Hat, Inc. -+ * Copyright (C) 2015-2017 Takao Fujiwara -+ * Copyright (C) 2008-2017 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) +@@ -610,6 +610,7 @@ static void + bus_dbus_impl_destroy (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; + GList *p; ++ int i; -+ /* 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; + for (p = dbus->objects; p != NULL; p = p->next) { + IBusService *object = (IBusService *) p->data; +@@ -633,6 +634,10 @@ bus_dbus_impl_destroy (BusDBusImpl *dbus) + + for (p = dbus->connections; p != NULL; p = p->next) { + BusConnection *connection = BUS_CONNECTION (p->data); ++ /* rhbz#1767976 Fix connection == NULL in ++ * bus_dbus_impl_connection_filter_cb() ++ */ ++ bus_connection_set_filter (connection, NULL, NULL, NULL); + g_signal_handlers_disconnect_by_func (connection, + bus_dbus_impl_connection_destroy_cb, dbus); + ibus_object_destroy (IBUS_OBJECT (connection)); +@@ -647,12 +652,39 @@ bus_dbus_impl_destroy (BusDBusImpl *dbus) + dbus->unique_names = NULL; + dbus->names = NULL; + ++ for (i = 0; g_idle_remove_by_data (dbus); i++) { ++ if (i > 1000) { ++ g_warning ("Too many idle threads were generated by " \ ++ "bus_dbus_impl_forward_message_idle_cb and " \ ++ "bus_dbus_impl_dispatch_message_by_rule_idle_cb"); ++ break; ++ } + } + g_list_free_full (dbus->start_service_calls, + (GDestroyNotify) bus_method_call_free); + dbus->start_service_calls = NULL; + +- g_mutex_clear (&dbus->dispatch_lock); +- g_mutex_clear (&dbus->forward_lock); ++ /* rhbz#1663528 Call g_mutex_trylock() before g_mutex_clear() ++ * because if the mutex is not unlocked, g_mutex_clear() causes assert. ++ */ ++#define BUS_DBUS_MUTEX_SAFE_CLEAR(mtex) { \ ++ int count = 0; \ ++ while (!g_mutex_trylock ((mtex))) { \ ++ g_usleep (1); \ ++ if (count > 60) { \ ++ g_warning (#mtex " is dead lock"); \ ++ break; \ ++ } \ ++ ++count; \ ++ } \ ++ g_mutex_unlock ((mtex)); \ ++ g_mutex_clear ((mtex)); \ ++} + - 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)); ++ BUS_DBUS_MUTEX_SAFE_CLEAR (&dbus->dispatch_lock); ++ BUS_DBUS_MUTEX_SAFE_CLEAR (&dbus->forward_lock); ++ ++#undef BUS_DBUS_MUTEX_SAFE_CLEAR - 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) : ""); - - } - } -@@ -1464,13 +1483,20 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection, + /* FIXME destruct _lock and _queue members. */ + IBUS_OBJECT_CLASS(bus_dbus_impl_parent_class)->destroy ((IBusObject *) dbus); +@@ -1483,13 +1515,20 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection, gboolean incoming, gpointer user_data) { @@ -126,89 +137,267 @@ index b54ef817..e4dd8683 100644 if (incoming) { /* is incoming message */ diff --git a/bus/engineproxy.c b/bus/engineproxy.c -index 2d98995c..d661673a 100644 +index 2d98995c..bbbe5532 100644 --- a/bus/engineproxy.c +++ b/bus/engineproxy.c -@@ -665,6 +665,7 @@ bus_engine_proxy_new_internal (const gchar *path, +@@ -660,20 +660,33 @@ bus_engine_proxy_g_signal (GDBusProxy *proxy, + g_return_if_reached (); + } + ++#pragma GCC optimize ("O0") + static BusEngineProxy * + bus_engine_proxy_new_internal (const gchar *path, IBusEngineDesc *desc, - GDBusConnection *connection) +- GDBusConnection *connection) ++ GDBusConnection *connection, ++ GError **error) { -+ GError *error = NULL; ++ GDBusProxyFlags flags; ++ BusEngineProxy *engine; ++ g_assert (path); g_assert (IBUS_IS_ENGINE_DESC (desc)); g_assert (G_IS_DBUS_CONNECTION (connection)); -@@ -673,7 +674,7 @@ bus_engine_proxy_new_internal (const gchar *path, - BusEngineProxy *engine = ++ g_assert (error && *error == NULL); + +- GDBusProxyFlags flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; +- BusEngineProxy *engine = ++ /* rhbz#1601577 engine == NULL if connection is closed. */ ++ if (g_dbus_connection_is_closed (connection)) { ++ *error = g_error_new (G_DBUS_ERROR, ++ G_DBUS_ERROR_FAILED, ++ "Connection is closed."); ++ return NULL; ++ } ++ flags = G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START; ++ engine = (BusEngineProxy *) g_initable_new (BUS_TYPE_ENGINE_PROXY, NULL, - NULL, -+ &error, ++ error, "desc", desc, "g-connection", connection, "g-interface-name", IBUS_INTERFACE_ENGINE, -@@ -681,6 +682,8 @@ bus_engine_proxy_new_internal (const gchar *path, +@@ -681,12 +694,19 @@ bus_engine_proxy_new_internal (const gchar *path, "g-default-timeout", g_gdbus_timeout, "g-flags", flags, NULL); + /* FIXME: rhbz#1601577 */ -+ g_assert_no_error (error); ++ if (!engine) { ++ /* show abrt local variable */ ++ gchar *message = g_strdup ((*error)->message); ++ g_error ("%s", message); ++ } const gchar *layout = ibus_engine_desc_get_layout (desc); if (layout != NULL && layout[0] != '\0') { engine->keymap = ibus_keymap_get (layout); -diff --git a/bus/ibusimpl.c b/bus/ibusimpl.c -index ec1caea8..9ae3751b 100644 ---- a/bus/ibusimpl.c -+++ b/bus/ibusimpl.c -@@ -484,13 +484,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)); -@@ -499,9 +502,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; -@@ -555,7 +570,7 @@ _dbus_name_owner_changed_cb (BusDBusImpl *dbus, - } - } - } -- } -+ } while (0); - - bus_ibus_impl_component_name_owner_changed (ibus, name, old_name, new_name); + } + return engine; } ++#pragma GCC reset_options + + typedef struct { + GTask *task; +@@ -748,23 +768,30 @@ create_engine_ready_cb (BusFactoryProxy *factory, + GAsyncResult *res, + EngineProxyNewData *data) + { ++ GError *error = NULL; ++ gchar *path; ++ BusEngineProxy *engine; ++ + g_return_if_fail (data->task != NULL); + +- GError *error = NULL; +- gchar *path = bus_factory_proxy_create_engine_finish (factory, +- res, +- &error); ++ path = bus_factory_proxy_create_engine_finish (factory, res, &error); + if (path == NULL) { + g_task_return_error (data->task, error); + engine_proxy_new_data_free (data); + return; + } + +- BusEngineProxy *engine = +- bus_engine_proxy_new_internal (path, +- data->desc, +- g_dbus_proxy_get_connection ((GDBusProxy *)data->factory)); ++ engine = bus_engine_proxy_new_internal ( ++ path, ++ data->desc, ++ g_dbus_proxy_get_connection ((GDBusProxy *)data->factory), ++ &error); + g_free (path); ++ if (!engine) { ++ g_task_return_error (data->task, error); ++ engine_proxy_new_data_free (data); ++ return; ++ } + + /* FIXME: set destroy callback ? */ + g_task_return_pointer (data->task, engine, NULL); +diff --git a/client/x11/main.c b/client/x11/main.c +index c9ee174d..768b91f0 100644 +--- a/client/x11/main.c ++++ b/client/x11/main.c +@@ -40,6 +40,7 @@ + #include + #include + #include ++#include + + #include + +@@ -1104,7 +1105,12 @@ _atexit_cb () + static void + _sighandler (int sig) + { +- exit(EXIT_FAILURE); ++ /* rhbz#1767691 _sighandler() is called with SIGTERM ++ * and exit() causes SEGV during calling atexit functions. ++ * _atexit_cb() might be broken. _exit() does not call ++ * atexit functions. ++ */ ++ _exit(EXIT_FAILURE); + } + + static void +diff --git a/src/ibusbus.c b/src/ibusbus.c +index b7ffbb47..668c8a26 100644 +--- a/src/ibusbus.c ++++ b/src/ibusbus.c +@@ -689,6 +689,11 @@ ibus_bus_destroy (IBusObject *object) + _bus = NULL; + + if (bus->priv->monitor) { ++ /* rhbz#1795499 _changed_cb() causes SEGV because of no bus->priv ++ * after ibus_bus_destroy() is called. ++ */ ++ g_signal_handlers_disconnect_by_func (bus->priv->monitor, ++ (GCallback) _changed_cb, bus); + g_object_unref (bus->priv->monitor); + bus->priv->monitor = NULL; + } +diff --git a/ui/gtk3/extension.vala b/ui/gtk3/extension.vala +index a6f2e8e6..b7a04081 100644 +--- a/ui/gtk3/extension.vala ++++ b/ui/gtk3/extension.vala +@@ -73,6 +73,10 @@ class ExtensionGtk : Gtk.Application { + string signal_name, + Variant parameters) { + debug("signal_name = %s", signal_name); ++ /* rhbz#1797120 Fix assert(bus.is_connected()) in ++ * panel_binding_construct() ++ */ ++ return_if_fail(m_bus.is_connected()); + m_panel = new PanelBinding(m_bus, this); + m_panel.load_settings(); + } +diff --git a/ui/gtk3/switcher.vala b/ui/gtk3/switcher.vala +index a4529c88..29a70dd5 100644 +--- a/ui/gtk3/switcher.vala ++++ b/ui/gtk3/switcher.vala +@@ -140,8 +140,8 @@ class Switcher : Gtk.Window { + IBus.EngineDesc[] engines, + int index, + string input_context_path) { +- assert (m_loop == null); +- assert (index < engines.length); ++ assert(m_loop == null); ++ assert(index < engines.length); + + m_is_running = true; + m_keyval = keyval; +@@ -198,16 +198,18 @@ class Switcher : Gtk.Window { + null, + event, + null); +- if (status != Gdk.GrabStatus.SUCCESS) ++ if (status != Gdk.GrabStatus.SUCCESS) { + warning("Grab keyboard failed! status = %d", status); +- status = seat.grab(get_window(), +- Gdk.SeatCapabilities.POINTER, +- true, +- null, +- event, +- null); +- if (status != Gdk.GrabStatus.SUCCESS) +- warning("Grab pointer failed! status = %d", status); ++ } else { ++ status = seat.grab(get_window(), ++ Gdk.SeatCapabilities.POINTER, ++ true, ++ null, ++ event, ++ null); ++ if (status != Gdk.GrabStatus.SUCCESS) ++ warning("Grab pointer failed! status = %d", status); ++ } + #else + Gdk.Device device = event.get_device(); + if (device == null) { +@@ -243,30 +245,41 @@ class Switcher : Gtk.Window { + Gdk.EventMask.KEY_RELEASE_MASK, + null, + Gdk.CURRENT_TIME); +- if (status != Gdk.GrabStatus.SUCCESS) ++ if (status != Gdk.GrabStatus.SUCCESS) { + warning("Grab keyboard failed! status = %d", status); +- // Grab all pointer events +- status = pointer.grab(get_window(), +- Gdk.GrabOwnership.NONE, +- true, +- Gdk.EventMask.BUTTON_PRESS_MASK | +- Gdk.EventMask.BUTTON_RELEASE_MASK, +- null, +- Gdk.CURRENT_TIME); +- if (status != Gdk.GrabStatus.SUCCESS) +- warning("Grab pointer failed! status = %d", status); ++ } else { ++ // Grab all pointer events ++ status = pointer.grab(get_window(), ++ Gdk.GrabOwnership.NONE, ++ true, ++ Gdk.EventMask.BUTTON_PRESS_MASK | ++ Gdk.EventMask.BUTTON_RELEASE_MASK, ++ null, ++ Gdk.CURRENT_TIME); ++ if (status != Gdk.GrabStatus.SUCCESS) ++ warning("Grab pointer failed! status = %d", status); ++ } + #endif + +- // Probably we can delete m_popup_delay_time in 1.6 +- pointer.get_position_double(null, +- out m_mouse_init_x, +- out m_mouse_init_y); +- m_mouse_moved = false; ++ /* Fix RHBZ #1771238 assert(m_loop == null) ++ * Grabbing keyboard can be failed when the second Super-e is typed ++ * before Switcher dialog is focused. And m_loop could not be released ++ * if the failed Super-e would call m_loop.run() below and could not ++ * call key_release_event(). And m_loop == null would be false in the ++ * third Super-e. ++ */ ++ if (status == Gdk.GrabStatus.SUCCESS) { ++ // Probably we can delete m_popup_delay_time in 1.6 ++ pointer.get_position_double(null, ++ out m_mouse_init_x, ++ out m_mouse_init_y); ++ m_mouse_moved = false; + + +- m_loop = new GLib.MainLoop(); +- m_loop.run(); +- m_loop = null; ++ m_loop = new GLib.MainLoop(); ++ m_loop.run(); ++ m_loop = null; ++ } + + #if VALA_0_34 + seat.ungrab(); -- -2.17.1 +2.24.1 diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch index 392d32a..0b66c2d 100644 --- a/ibus-HEAD.patch +++ b/ibus-HEAD.patch @@ -1,712 +1,423 @@ -From 7edaefdc1d80aefdbbc2dc52526c20715759da83 Mon Sep 17 00:00:00 2001 +From dd4cc5b028c35f9bb8fa9d3bdc8f26bcdfc43d40 Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Wed, 22 Aug 2018 17:20:53 +0900 -Subject: [PATCH] ui/gtk3: Do not clear unicode data when emoji annotation lang - is changed +Date: Wed, 30 Sep 2020 20:35:23 +0900 +Subject: [PATCH] ui/gtk3: Fix arguments in GLib.DBusSignalCallback for Vala + 0.50 +BUG=https://github.com/ibus/ibus/issues/2265 --- - ui/gtk3/emojier.vala | 8 ++++++-- - 1 file changed, 6 insertions(+), 2 deletions(-) + ui/gtk3/application.vala | 22 +++++++++++----------- + ui/gtk3/extension.vala | 22 +++++++++++----------- + 2 files changed, 22 insertions(+), 22 deletions(-) -diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala -index 85dcdceb..637ae049 100644 ---- a/ui/gtk3/emojier.vala -+++ b/ui/gtk3/emojier.vala -@@ -440,13 +440,17 @@ public class IBusEmojier : Gtk.ApplicationWindow { - m_emoji_to_emoji_variants_dict = - new GLib.HashTable>(GLib.str_hash, - GLib.str_equal); -- m_unicode_to_data_dict = -+ if (m_unicode_to_data_dict == null) { -+ m_unicode_to_data_dict = - new GLib.HashTable( - GLib.direct_hash, - GLib.direct_equal); -- m_name_to_unicodes_dict = -+ } -+ if (m_name_to_unicodes_dict == null) { -+ m_name_to_unicodes_dict = - new GLib.HashTable>(GLib.str_hash, - GLib.str_equal); -+ } +diff --git a/ui/gtk3/application.vala b/ui/gtk3/application.vala +index cc9ee54c..da65301b 100644 +--- a/ui/gtk3/application.vala ++++ b/ui/gtk3/application.vala +@@ -3,7 +3,7 @@ + * ibus - The Input Bus + * + * Copyright(c) 2011 Peng Huang +- * Copyright(c) 2017 Takao Fujiwara ++ * Copyright(c) 2017-2020 Takao Fujiwara + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -69,22 +69,22 @@ class Application { } + private void bus_name_acquired_cb(DBusConnection connection, +- string sender_name, +- string object_path, +- string interface_name, +- string signal_name, +- Variant parameters) { ++ string? sender_name, ++ string object_path, ++ string interface_name, ++ string signal_name, ++ Variant parameters) { + debug("signal_name = %s", signal_name); + m_panel = new Panel(m_bus); + m_panel.load_settings(); + } + private void bus_name_lost_cb(DBusConnection connection, +- string sender_name, +- string object_path, +- string interface_name, +- string signal_name, +- Variant parameters) { ++ string? sender_name, ++ string object_path, ++ string interface_name, ++ string signal_name, ++ Variant parameters) { + // "Destroy" dbus method was called before this callback is called. + // "Destroy" dbus method -> ibus_service_destroy() + // -> g_dbus_connection_unregister_object() +diff --git a/ui/gtk3/extension.vala b/ui/gtk3/extension.vala +index ea3cd464..a6f2e8e6 100644 +--- a/ui/gtk3/extension.vala ++++ b/ui/gtk3/extension.vala +@@ -3,7 +3,7 @@ + * ibus - The Input Bus + * + * Copyright(c) 2018 Peng Huang +- * Copyright(c) 2018 Takao Fujiwara ++ * Copyright(c) 2018-2020 Takao Fujiwara + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public +@@ -67,22 +67,22 @@ class ExtensionGtk : Gtk.Application { + + + private void bus_name_acquired_cb(DBusConnection connection, +- string sender_name, +- string object_path, +- string interface_name, +- string signal_name, +- Variant parameters) { ++ string? sender_name, ++ string object_path, ++ string interface_name, ++ string signal_name, ++ Variant parameters) { + debug("signal_name = %s", signal_name); + m_panel = new PanelBinding(m_bus, this); + m_panel.load_settings(); + } + + private void bus_name_lost_cb(DBusConnection connection, +- string sender_name, +- string object_path, +- string interface_name, +- string signal_name, +- Variant parameters) { ++ string? sender_name, ++ string object_path, ++ string interface_name, ++ string signal_name, ++ Variant parameters) { + // "Destroy" dbus method was called before this callback is called. + // "Destroy" dbus method -> ibus_service_destroy() + // -> g_dbus_connection_unregister_object() -- -2.17.1 +2.24.1 -From 28d22176aee6be97d88dd6c60fa5395c79563ec0 Mon Sep 17 00:00:00 2001 +From 02338ce751a1ed5b9b892fba530ec2fe211d314e Mon Sep 17 00:00:00 2001 From: fujiwarat -Date: Thu, 30 Aug 2018 12:57:33 +0900 -Subject: [PATCH] ui/gtk3: Fix SEGV when type ASCII on emojier +Date: Fri, 20 Nov 2020 08:58:52 +0900 +Subject: [PATCH] docs: Fix make dist -Emojier still included Gtk.Entry, accepted key events in Wayland, -reset the lookup table and it caused SEGV because IBus.Text -is NULL in the lookup table in Emojier.get_current_candidate(). -Now Gtk.Entry is deleted completely. - -BUG=rhbz#1618682 --- - ui/gtk3/emojier.vala | 139 +------------------------------------------ - 1 file changed, 1 insertion(+), 138 deletions(-) + docs/reference/ibus/Makefile.am | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) -diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala -index 637ae049..0f455800 100644 ---- a/ui/gtk3/emojier.vala -+++ b/ui/gtk3/emojier.vala -@@ -283,7 +283,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { +diff --git a/docs/reference/ibus/Makefile.am b/docs/reference/ibus/Makefile.am +index 1ece234c..0f307bbd 100644 +--- a/docs/reference/ibus/Makefile.am ++++ b/docs/reference/ibus/Makefile.am +@@ -3,8 +3,8 @@ + # ibus - The Input Bus + # + # Copyright (c) 2007-2015 Peng Huang +-# Copyright (c) 2007-2015 Red Hat, Inc. +-# Copyright (c) 2015 Takao Fujiwara ++# Copyright (c) 2007-2020 Red Hat, Inc. ++# Copyright (c) 2015-2020 Takao Fujiwara + # + # This library is free software; you can redistribute it and/or + # modify it under the terms of the GNU Lesser General Public +@@ -147,6 +147,6 @@ tmpl-build.stamp: trim-build.stamp $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DO + # clean-local: + # rm -rf tmpl ${DOC_MODULE) - private ThemedRGBA m_rgba; - private Gtk.Box m_vbox; -- private EEntry m_entry; - /* If emojier is emoji category list or Unicode category list, - * m_annotation is "" and preedit is also "". - * If emojier is candidate mode, m_annotation is an annotation and -@@ -367,23 +366,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - m_vbox = new Gtk.Box(Gtk.Orientation.VERTICAL, 0); - add(m_vbox); +-CLEANFILES+= *.stamp ++CLEANFILES+= *actions *.stamp -- m_entry = new EEntry(); -- m_entry.set_placeholder_text(_("Type annotation or choose emoji")); -- //m_vbox.add(m_entry); -- m_entry.changed.connect(() => { -- update_candidate_window(); -- }); -- m_entry.icon_release.connect((icon_pos, event) => { -- hide_candidate_panel(); -- }); -- -- /* Set the accessible role of the label to a status bar so it -- * will emit name changed events that can be used by screen -- * readers. -- */ -- Atk.Object obj = m_entry.get_accessible(); -- obj.set_role (Atk.Role.STATUSBAR); -- - // The constructor of IBus.LookupTable does not support more than - // 16 pages. - m_lookup_table = new IBus.LookupTable(1, 0, true, true); -@@ -1806,18 +1788,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - m_lookup_table.cursor_up(); - else if (keyval == Gdk.Key.Right) - m_lookup_table.cursor_down(); -- } else if (m_entry.get_text().length > 0) { -- int step = 0; -- if (keyval == Gdk.Key.Left) -- step = -1; -- else if (keyval == Gdk.Key.Right) -- step = 1; -- GLib.Signal.emit_by_name( -- m_entry, "move-cursor", -- Gtk.MovementStep.VISUAL_POSITIONS, -- step, -- (modifiers & Gdk.ModifierType.SHIFT_MASK) != 0 -- ? true : false); - } else { - // For Gdk.Key.f and Gdk.Key.b - if (keyval == Gdk.Key.Left) -@@ -1880,20 +1850,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - } - return true; - } -- if (m_entry.get_text().length > 0) { -- int step = 0; -- if (keyval == Gdk.Key.Home) -- step = -1; -- else if (keyval == Gdk.Key.End) -- step = 1; -- GLib.Signal.emit_by_name( -- m_entry, "move-cursor", -- Gtk.MovementStep.DISPLAY_LINE_ENDS, -- step, -- (modifiers & Gdk.ModifierType.SHIFT_MASK) != 0 -- ? true : false); -- return true; -- } - return category_list_cursor_move(keyval); - } + -include $(top_srcdir)/git.mk +-- +2.24.1 + +From aa558de80c224921753990806cf553428fbe7057 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Fri, 20 Nov 2020 09:03:32 +0900 +Subject: [PATCH] src: Fix to build emoji-*.dict in CLDR 38 + +root.xml and sr_Cyrl.xml have included no contents since +cldr-emoji-annotation-38 and make install failed because of no +emoji-root.dict and emoji-sr.Cyrl.dict. +Now the build creates the no content files but remove those files +in the install hook. + +BUG=rhbz#1898065 +--- + src/Makefile.am | 61 ++++++++++++++++++++++------------------------ + src/emoji-parser.c | 4 ++- + 2 files changed, 32 insertions(+), 33 deletions(-) + +diff --git a/src/Makefile.am b/src/Makefile.am +index 99de1ab7..742ee7d7 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -3,7 +3,7 @@ + # ibus - The Input Bus + # + # Copyright (c) 2007-2015 Peng Huang +-# Copyright (c) 2015-2019 Takao Fujiwara ++# Copyright (c) 2015-2020 Takao Fujiwara + # Copyright (c) 2007-2017 Red Hat, Inc. + # + # This library is free software; you can redistribute it and/or +@@ -248,6 +248,7 @@ AM_CPPFLAGS += -DENABLE_EMOJI_DICT + dictdir = $(pkgdatadir)/dicts + LANG_FILES = $(basename $(notdir $(wildcard $(EMOJI_ANNOTATION_DIR)/*.xml))) + EMOJI_DICT_FILES = $(patsubst %,dicts/emoji-%.dict,$(LANG_FILES)) ++# emoji-root.dict, emoji-sr_Cyrl.dict have no contents. + dict_DATA = $(EMOJI_DICT_FILES) -@@ -1941,28 +1897,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - } + noinst_PROGRAMS += emoji-parser +@@ -265,6 +266,7 @@ dicts/emoji-%.dict: emoji-parser + xml_derived_option="--xml-derived $(EMOJI_ANNOTATION_DIR)/../annotationsDerived/$*.xml"; \ + plus_comment="derived"; \ + fi; \ ++ is_skip=0; \ + if test x"$*" = xen ; then \ + $(builddir)/emoji-parser \ + --unicode-emoji-dir $(UNICODE_EMOJI_DIR) \ +@@ -279,48 +281,43 @@ dicts/emoji-%.dict: emoji-parser + --xml $(EMOJI_ANNOTATION_DIR)/$*.xml \ + $$xml_derived_option \ + --out $@; \ ++ retval=$$?; \ ++ if test $$retval -eq 99 ; then \ ++ is_skip=1; \ ++ touch $@; \ ++ elif test $$retval -ne 0 ; then \ ++ echo "Fail to generate $@"; \ ++ abrt; \ ++ fi; \ + fi; \ +- echo "Generated $$plus_comment $@" ++ if test $$is_skip -eq 0 ; then \ ++ echo "Generated $$plus_comment $@"; \ ++ else \ ++ echo "Skip $$plus_comment $@"; \ ++ fi; + ibusemojigen.h: dicts/emoji-en.dict + $(NULL) -- private void entry_enter_keyval(uint keyval) { -- unichar ch = IBus.keyval_to_unicode(keyval); -- if (ch.iscntrl()) -- return; -- string str = ch.to_string(); -- -- // what gtk_entry_commit_cb() do -- if (m_entry.get_selection_bounds(null, null)) { -- m_entry.delete_selection(); -- } else { -- if (m_entry.get_overwrite_mode()) { -- uint text_length = m_entry.get_buffer().get_length(); -- if (m_entry.cursor_position < text_length) -- m_entry.delete_from_cursor(Gtk.DeleteType.CHARS, 1); -- } -- } -- int pos = m_entry.get_position(); -- m_entry.insert_text(str, -1, ref pos); -- m_entry.set_position(pos); +-install-data-hook: $(dict_DATA) +- @$(NORMAL_INSTALL) ++# We put dicts/emoji-%.dict as the make target for the parallel build ++# and the make target has to be genarated even if the file size is zero. ++# But we don't want to install the zero size files and delete them ++# in install-data-hook. ++install-data-hook: + $(AM_V_at)list='$(wildcard dicts/*.dict)'; \ + test -n "$(dictdir)" || list=; \ +- if test -n "$$list"; then \ +- echo " $(MKDIR_P) '$(DESTDIR)$(dictdir)'"; \ +- $(MKDIR_P) "$(DESTDIR)$(dictdir)" || exit 1; \ +- fi; \ + for p in $$list; do \ +- if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ +- echo "$$d$$p"; \ ++ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ ++ if test -s "$$d$$p"; then continue; fi; \ ++ basename "$$p"; \ + done | \ +- while read files; do \ +- if [ x$(AM_DEFAULT_VERBOSITY) = x1 ] ; then \ +- echo "$(INSTALL_DATA) $$files '$(DESTDIR)$(dictdir)'"; \ +- else \ +- echo "Installing $$files"; \ +- fi; \ +- $(INSTALL_DATA) $$files "$(DESTDIR)$(dictdir)" || exit $$?; \ ++ while read file; do \ ++ if test -f "$(DESTDIR)$(dictdir)/$$file"; then \ ++ echo "Delete $(DESTDIR)$(dictdir)/$$file"; \ ++ rm "$(DESTDIR)$(dictdir)/$$file" || exit $$?; \ ++ fi; \ + done + +-dict__uninstall_files_from_dir = { \ +- test -z "$$files" \ +- || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ +- || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ +- cd "$$dir" && rm -f $$files; }; \ - } - +-# for make dist +-uninstall-hook: +- @$(NORMAL_UNINSTALL) +- $(AM_V_at)list='$(wildcard dicts/*.dict)'; \ +- test -n "$(dictdir)" || list=; \ +- files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ +- dir='$(DESTDIR)$(dictdir)'; $(dict__uninstall_files_from_dir) - - private Gdk.Rectangle get_monitor_geometry() { - Gdk.Rectangle monitor_area = { 0, }; + emoji_parser_SOURCES = \ + emoji-parser.c \ + $(NULL) +diff --git a/src/emoji-parser.c b/src/emoji-parser.c +index 96a779c6..b117b1b4 100644 +--- a/src/emoji-parser.c ++++ b/src/emoji-parser.c +@@ -1,7 +1,7 @@ + /* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil; -*- */ + /* vim:set et sts=4: */ + /* ibus - The Input Bus +- * Copyright (C) 2016-2018 Takao Fujiwara ++ * Copyright (C) 2016-2020 Takao Fujiwara + * Copyright (C) 2016 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or +@@ -1294,6 +1294,8 @@ main (int argc, char *argv[]) + category_file_save (output_category, list); + if (list) + g_slist_free (list); ++ else ++ return 99; -@@ -2245,10 +2179,7 @@ public class IBusEmojier : Gtk.ApplicationWindow { - /* Let gtk recalculate the window size. */ - resize(1, 1); - -- m_entry.set_text(""); -- - show_category_list(); -- m_entry.set_activates_default(true); - show_all(); - - /* Some window managers, e.g. MATE, GNOME, Plasma desktops, -@@ -2289,13 +2220,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - m_loop.run(); - m_loop = null; - -- // Need focus-out on Gtk.Entry to send the emoji to applications. -- Gdk.Event fevent = new Gdk.Event(Gdk.EventType.FOCUS_CHANGE); -- fevent.focus_change.in = 0; -- fevent.focus_change.window = get_window(); -- m_entry.send_focus_change(fevent); -- fevent.focus_change.window = null; -- - hide(); - // Make sure the switcher is hidden before returning from this function. - while (Gtk.events_pending()) -@@ -2357,36 +2281,9 @@ public class IBusEmojier : Gtk.ApplicationWindow { - hide(); - } - return true; -- case Gdk.Key.BackSpace: -- if (m_entry.get_text().length > 0) { -- if ((modifiers & Gdk.ModifierType.CONTROL_MASK) != 0) { -- GLib.Signal.emit_by_name(m_entry, "delete-from-cursor", -- Gtk.DeleteType.WORD_ENDS, -1); -- } else { -- GLib.Signal.emit_by_name(m_entry, "backspace"); -- } -- return true; -- } -- break; -- case Gdk.Key.Delete: -- case Gdk.Key.KP_Delete: -- if (m_entry.get_text().length > 0) { -- if ((modifiers & Gdk.ModifierType.CONTROL_MASK) != 0) { -- GLib.Signal.emit_by_name(m_entry, "delete-from-cursor", -- Gtk.DeleteType.WORD_ENDS, 1); -- } else { -- GLib.Signal.emit_by_name(m_entry, "delete-from-cursor", -- Gtk.DeleteType.CHARS, 1); -- } -- return true; -- } -- break; - case Gdk.Key.space: - case Gdk.Key.KP_Space: -- if ((modifiers & Gdk.ModifierType.SHIFT_MASK) != 0) { -- if (m_entry.get_text().length > 0) -- entry_enter_keyval(keyval); -- } else if (m_candidate_panel_is_visible) { -+ if (m_candidate_panel_is_visible) { - enter_notify_disable_with_timer(); - m_lookup_table.cursor_down(); - show_candidate_panel(); -@@ -2436,10 +2333,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - key_press_cursor_home_end(Gdk.Key.End, modifiers); - show_all(); - return true; -- case Gdk.Key.Insert: -- case Gdk.Key.KP_Insert: -- GLib.Signal.emit_by_name(m_entry, "toggle-overwrite"); -- return true; - } - - if ((modifiers & Gdk.ModifierType.CONTROL_MASK) != 0) { -@@ -2470,27 +2363,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - key_press_cursor_home_end(Gdk.Key.End, modifiers); - show_all(); - return true; -- case Gdk.Key.u: -- if (m_entry.get_text().length > 0) { -- GLib.Signal.emit_by_name(m_entry, -- "delete-from-cursor", -- Gtk.DeleteType.PARAGRAPH_ENDS, -- -1); -- return true; -- } -- break; -- case Gdk.Key.a: -- if (m_entry.get_text().length > 0) { -- m_entry.select_region(0, -1); -- return true; -- } -- break; -- case Gdk.Key.x: -- if (m_entry.get_text().length > 0) { -- GLib.Signal.emit_by_name(m_entry, "cut-clipboard"); -- return true; -- } -- break; - case Gdk.Key.C: - case Gdk.Key.c: - if ((modifiers & Gdk.ModifierType.SHIFT_MASK) != 0) { -@@ -2503,19 +2375,11 @@ public class IBusEmojier : Gtk.ApplicationWindow { - clipboard.store(); - return true; - } -- } else if (m_entry.get_text().length > 0) { -- GLib.Signal.emit_by_name(m_entry, "copy-clipboard"); -- return true; - } - break; -- case Gdk.Key.v: -- GLib.Signal.emit_by_name(m_entry, "paste-clipboard"); -- return true; - } - return false; - } -- -- entry_enter_keyval(keyval); - return true; - } - -@@ -2595,7 +2459,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - - uint32 timestamp = event.get_time(); - present_with_time(timestamp); -- m_entry.set_activates_default(true); - } - - --- -2.17.1 - -From e6badb494e0a31b7aca3a5078a5dc5b27b83390d Mon Sep 17 00:00:00 2001 -From: fujiwarat -Date: Thu, 30 Aug 2018 12:57:46 +0900 -Subject: [PATCH] ui/gtk3: Support Shift-Space to insert a Space on Emojier - preedit - -Implemented Shift-Space on preedit since Shift-Space had worked on -Emojier's GtkEntry in the previous release. ---- - ui/gtk3/panelbinding.vala | 27 ++++++++++++++++++++------- - 1 file changed, 20 insertions(+), 7 deletions(-) - -diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala -index 981b5509..4ebff8da 100644 ---- a/ui/gtk3/panelbinding.vala -+++ b/ui/gtk3/panelbinding.vala -@@ -548,6 +548,19 @@ class PanelBinding : IBus.PanelService { - } - - -+ private bool key_press_keyval(uint keyval) { -+ unichar ch = IBus.keyval_to_unicode(keyval); -+ if (ch.iscntrl()) -+ return false; -+ string str = ch.to_string(); -+ m_preedit.append_text(str); -+ string annotation = m_preedit.get_text(); -+ m_emojier.set_annotation(annotation); -+ m_preedit.set_emoji(""); -+ return true; -+ } -+ -+ - private bool key_press_enter() { - if (m_extension_name != "unicode" && is_emoji_lookup_table()) { - // Check if variats exist -@@ -899,6 +912,12 @@ class PanelBinding : IBus.PanelService { - break; - case Gdk.Key.space: - case Gdk.Key.KP_Space: -+ if ((modifiers & Gdk.ModifierType.SHIFT_MASK) != 0) { -+ if (!key_press_keyval(keyval)) -+ return true; -+ show_candidate = is_emoji_lookup_table(); -+ break; -+ } - show_candidate = key_press_space(); - if (m_extension_name == "unicode") { - key_press_enter(); -@@ -979,14 +998,8 @@ class PanelBinding : IBus.PanelService { - show_candidate = key_press_control_keyval(keyval, modifiers); - break; - } -- unichar ch = IBus.keyval_to_unicode(keyval); -- if (ch.iscntrl()) -+ if (!key_press_keyval(keyval)) - return true; -- string str = ch.to_string(); -- m_preedit.append_text(str); -- string annotation = m_preedit.get_text(); -- m_emojier.set_annotation(annotation); -- m_preedit.set_emoji(""); - show_candidate = is_emoji_lookup_table(); - break; - } --- -2.17.1 - -From 809d880337e75b7cee429292a238bf53899bef6a Mon Sep 17 00:00:00 2001 -From: fujiwarat -Date: Thu, 30 Aug 2018 12:58:57 +0900 -Subject: [PATCH] ui/gtk3: Do not move Emojier popup with the active - candidate in Xorg - -Probably I think it's not useful to change the popup position frequently. -The popup size is always slightly changed with the emoji annotation length. ---- - ui/gtk3/emojier.vala | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala -index 0f455800..9811fde5 100644 ---- a/ui/gtk3/emojier.vala -+++ b/ui/gtk3/emojier.vala -@@ -1944,7 +1944,15 @@ public class IBusEmojier : Gtk.ApplicationWindow { - x = 0; - - bool changed = false; -- if (window_right_bottom.y > monitor_bottom) { -+ // Do not up side down frequently. -+ // The first pos does not show the lookup table yet but the -+ // preedit only and the second pos shows the lookup table. -+ if (m_lookup_table.get_cursor_pos() != 1) { -+ if (m_is_up_side_down) -+ y = m_cursor_location.y - allocation.height; -+ else -+ y = cursor_right_bottom.y; -+ } else if (window_right_bottom.y > monitor_bottom) { - y = m_cursor_location.y - allocation.height; - // Do not up side down in Wayland - if (m_input_context_path == "") { --- -2.17.1 - -From 1c6565e205528a45e88a84ba2a328f9035875c8d Mon Sep 17 00:00:00 2001 -From: fujiwarat -Date: Fri, 14 Sep 2018 16:15:41 +0900 -Subject: [PATCH] ui/gtk3: Fix SEGV when commit an emoji on Emojier in Wayland - -Just pressing Space key without emoji annotations can launch Emojier -popup and the popup takes a focus in Wayland and the chosen emoji is -output when the original text application gets the focus after Emojier -popup release the focus. Emojier disabled Ctrl-Shift-e after got the focus. -But currently GNOME Wayland has a bug not to send focus-in until a -key press or mouse click happens [1] and Emojier causes a SEGV. -Now Emojier disables Ctrl-Shift-e immediately when an emoji is chosen -whether focus-in comes or not and fixes the SEGV. - -[1] https://gitlab.gnome.org/GNOME/gnome-shell/issues/573 - -BUG=rhbz#1625187 ---- - ui/gtk3/emojier.vala | 63 +++++++------------------------------- - ui/gtk3/emojierapp.vala | 2 +- - ui/gtk3/panelbinding.vala | 64 ++++++++++++++++++++++++++------------- - 3 files changed, 55 insertions(+), 74 deletions(-) - -diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala -index 9811fde5..e23ef889 100644 ---- a/ui/gtk3/emojier.vala -+++ b/ui/gtk3/emojier.vala -@@ -21,17 +21,6 @@ - */ - - public class IBusEmojier : Gtk.ApplicationWindow { -- private class EEntry : Gtk.SearchEntry { -- public EEntry() { -- GLib.Object( -- name : "IBusEmojierEntry", -- margin_start : 6, -- margin_end : 6, -- margin_top : 6, -- margin_bottom : 6 -- ); -- } -- } - private class EListBox : Gtk.ListBox { - public EListBox() { - GLib.Object( -@@ -330,6 +319,7 @@ public class IBusEmojier : Gtk.ApplicationWindow { - private uint m_redraw_window_id; - - public signal void candidate_clicked(uint index, uint button, uint state); -+ public signal void commit_text(string text); - - public IBusEmojier() { - GLib.Object( -@@ -380,12 +370,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - adjust_window_position(); - }); - -- candidate_clicked.connect((i, b, s) => { -- if (m_input_context_path != "") -- candidate_panel_select_index(i, b); -- }); -- -- - if (m_annotation_to_emojis_dict == null) { - reload_emoji_dict(); - } -@@ -1641,34 +1625,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { - } - - -- private void candidate_panel_select_index(uint index, -- uint button) { -- if (button == BUTTON_CLOSE_BUTTON) { -- hide(); -- if (m_candidate_panel_mode && -- m_lookup_table.get_number_of_candidates() > 0) { -- // Call remove_all_children() instead of show_category_list() -- // so that show_category_list do not remove children with -- // PageUp/PageDown. -- remove_all_children(); -- } -- m_result = ""; -- return; -- } -- string text = m_lookup_table.get_candidate(index).text; -- unowned GLib.SList? emojis = -- m_emoji_to_emoji_variants_dict.lookup(text); -- if (m_show_emoji_variant && emojis != null && -- m_backward_index < 0) { -- show_emoji_variants(emojis); -- show_all(); -- } else { -- m_result = text; -- hide(); -- } -- } -- -- - private void candidate_panel_cursor_down() { - enter_notify_disable_with_timer(); - uint ncandidates = m_lookup_table.get_number_of_candidates(); -@@ -1762,7 +1718,8 @@ public class IBusEmojier : Gtk.ApplicationWindow { - } - - -- public bool has_variants(uint index) { -+ public bool has_variants(uint index, -+ bool need_commit_signal) { - if (index >= m_lookup_table.get_number_of_candidates()) - return false; - string text = m_lookup_table.get_candidate(index).text; -@@ -1773,6 +1730,10 @@ public class IBusEmojier : Gtk.ApplicationWindow { - show_emoji_variants(emojis); - return true; - } -+ if (m_input_context_path != "") -+ m_result = text; -+ if (need_commit_signal) -+ commit_text(text); - return false; - } - -@@ -1881,10 +1842,10 @@ public class IBusEmojier : Gtk.ApplicationWindow { - } - - -- public bool key_press_enter() { -+ public bool key_press_enter(bool need_commit_signal) { - if (m_candidate_panel_is_visible) { - uint index = m_lookup_table.get_cursor_pos(); -- return has_variants(index); -+ return has_variants(index, need_commit_signal); - } else if (m_category_active_index >= 0) { - Gtk.ListBoxRow gtkrow = m_list_box.get_selected_row(); - EBoxRow row = gtkrow as EBoxRow; -@@ -2282,12 +2243,10 @@ public class IBusEmojier : Gtk.ApplicationWindow { - return true; - case Gdk.Key.Return: - case Gdk.Key.KP_Enter: -- if (key_press_enter()) { -+ if (key_press_enter(true)) - show_all(); -- } else { -- m_result = get_current_candidate(); -+ else - hide(); -- } - return true; - case Gdk.Key.space: - case Gdk.Key.KP_Space: -diff --git a/ui/gtk3/emojierapp.vala b/ui/gtk3/emojierapp.vala -index 787d448f..fab99d9e 100644 ---- a/ui/gtk3/emojierapp.vala -+++ b/ui/gtk3/emojierapp.vala -@@ -65,7 +65,7 @@ public class EmojiApplication : Gtk.Application { - uint ncandidates = m_emojier.get_number_of_candidates(); - if (ncandidates > 0 && ncandidates >= index) { - m_emojier.set_cursor_pos(index); -- show_candidate = m_emojier.has_variants(index); -+ show_candidate = m_emojier.has_variants(index, false); - } else { - return; - } -diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala -index 4ebff8da..01c43b0d 100644 ---- a/ui/gtk3/panelbinding.vala -+++ b/ui/gtk3/panelbinding.vala -@@ -447,13 +447,19 @@ class PanelBinding : IBus.PanelService { - } - - -- private void commit_text_update_favorites(IBus.Text text) { -+ private void commit_text_update_favorites(IBus.Text text, -+ bool disable_extension) { - commit_text(text); -- IBus.ExtensionEvent event = new IBus.ExtensionEvent( -+ -+ // If disable_extension is false, the extension event is already -+ // sent before the focus-in is received. -+ if (disable_extension) { -+ IBus.ExtensionEvent event = new IBus.ExtensionEvent( - "name", m_extension_name, - "is-enabled", false, - "is-extension", true); -- panel_extension(event); -+ panel_extension(event); -+ } - string committed_string = text.text; - string preedit_string = m_preedit.get_text(); - m_preedit.hide(); -@@ -482,7 +488,7 @@ class PanelBinding : IBus.PanelService { - prev_context_path != "" && - prev_context_path == m_current_context_path) { - IBus.Text text = new IBus.Text.from_string(selected_string); -- commit_text_update_favorites(text); -+ commit_text_update_favorites(text, false); - m_emojier.reset(); - return true; - } -@@ -564,13 +570,13 @@ class PanelBinding : IBus.PanelService { - private bool key_press_enter() { - if (m_extension_name != "unicode" && is_emoji_lookup_table()) { - // Check if variats exist -- if (m_emojier.key_press_enter()) { -+ if (m_emojier.key_press_enter(false)) { - convert_preedit_text(); - return true; - } - } - IBus.Text text = m_preedit.get_commit_text(); -- commit_text_update_favorites(text); -+ commit_text_update_favorites(text, true); - return false; - } - -@@ -712,15 +718,10 @@ class PanelBinding : IBus.PanelService { - } - - -- private bool is_visible_wayland_lookup_table() { -- return m_wayland_lookup_table_is_visible; -- } -- -- - private void hide_emoji_lookup_table() { - if (m_emojier == null) - return; -- if (m_is_wayland) -+ if (m_wayland_lookup_table_is_visible) - hide_wayland_lookup_table(); - else - m_emojier.hide(); -@@ -747,7 +748,7 @@ class PanelBinding : IBus.PanelService { - - private bool is_emoji_lookup_table() { - if (m_is_wayland) -- return is_visible_wayland_lookup_table(); -+ return m_wayland_lookup_table_is_visible; - else - return m_emojier.get_visible(); - } -@@ -788,7 +789,8 @@ class PanelBinding : IBus.PanelService { - */ - if (!input_context_path.has_suffix("InputContext_1")) { - m_real_current_context_path = m_current_context_path; -- this.emojier_focus_commit(); -+ if (m_is_wayland) -+ this.emojier_focus_commit(); - } - } - -@@ -822,8 +824,18 @@ class PanelBinding : IBus.PanelService { - // For title handling in gnome-shell - m_application.add_window(m_emojier); - m_emojier.candidate_clicked.connect((i, b, s) => { -+ candidate_clicked_lookup_table_real(i, b, s, true); -+ }); -+ m_emojier.commit_text.connect((s) => { - if (!m_is_wayland) -- candidate_clicked_lookup_table(i, b, s); -+ return; -+ // Currently emojier has a focus but the text input focus -+ // does not and commit the text later. -+ IBus.ExtensionEvent close_event = new IBus.ExtensionEvent( -+ "name", m_extension_name, -+ "is-enabled", false, -+ "is-extension", true); -+ panel_extension(close_event); - }); - } - m_emojier.reset(); -@@ -1041,9 +1053,10 @@ class PanelBinding : IBus.PanelService { - show_preedit_and_candidate(show_candidate); - } - -- public override void candidate_clicked_lookup_table(uint index, -- uint button, -- uint state) { -+ private void candidate_clicked_lookup_table_real(uint index, -+ uint button, -+ uint state, -+ bool is_emojier) { - if (button == IBusEmojier.BUTTON_CLOSE_BUTTON) { - m_enable_extension = false; - hide_emoji_lookup_table(); -@@ -1061,17 +1074,26 @@ class PanelBinding : IBus.PanelService { - uint ncandidates = m_emojier.get_number_of_candidates(); - if (ncandidates > 0 && ncandidates >= index) { - m_emojier.set_cursor_pos(index); -- show_candidate = m_emojier.has_variants(index); -- m_preedit.set_emoji(m_emojier.get_current_candidate()); -+ bool need_commit_signal = m_is_wayland && is_emojier; -+ show_candidate = m_emojier.has_variants(index, need_commit_signal); -+ if (!m_is_wayland) -+ m_preedit.set_emoji(m_emojier.get_current_candidate()); - } else { - return; - } - if (!show_candidate) { - IBus.Text text = m_preedit.get_commit_text(); -- commit_text_update_favorites(text); - hide_emoji_lookup_table(); -+ if (!is_emojier || !m_is_wayland) -+ commit_text_update_favorites(text, true); - return; - } - show_preedit_and_candidate(show_candidate); - } -+ -+ public override void candidate_clicked_lookup_table(uint index, -+ uint button, -+ uint state) { -+ candidate_clicked_lookup_table_real(index, button, state, false); -+ } + return 0; } -- -2.17.1 +2.24.1 + +From b72efea42d5f72e08e2774ae03027c246d41cab7 Mon Sep 17 00:00:00 2001 +From: fujiwarat +Date: Fri, 20 Nov 2020 10:56:11 +0900 +Subject: [PATCH] src: Update IBusInputPurpose and IBusInputHints in + ibustypes.h + +Copy IBUS_INPUT_PURPOSE_TERMINAL, IBUS_INPUT_PURPOSE_PIN, +IBUS_INPUT_PURPOSE_TERMINAL from GTK 3.24.14 +--- + src/ibustypes.h | 77 ++++++++++++++++++++++++++++++++++--------------- + 1 file changed, 53 insertions(+), 24 deletions(-) + +diff --git a/src/ibustypes.h b/src/ibustypes.h +index 06370a27..798ad04d 100644 +--- a/src/ibustypes.h ++++ b/src/ibustypes.h +@@ -2,7 +2,7 @@ + /* vim:set et sts=4: */ + /* ibus - The Input Bus + * Copyright (C) 2008-2013 Peng Huang +- * Copyright (C) 2008-2015 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 +@@ -241,29 +241,46 @@ typedef void (* IBusFreeFunc) (gpointer object); + * @IBUS_INPUT_PURPOSE_EMAIL: Edited field expects email address + * @IBUS_INPUT_PURPOSE_NAME: Edited field expects the name of a person + * @IBUS_INPUT_PURPOSE_PASSWORD: Like @IBUS_INPUT_PURPOSE_FREE_FORM, +- * but characters are hidden ++ * but characters are hidden + * @IBUS_INPUT_PURPOSE_PIN: Like @IBUS_INPUT_PURPOSE_DIGITS, but +- * characters are hidden ++ * characters are hidden ++ * @IBUS_INPUT_PURPOSE_TERMINAL: Allow any character, in addition to control ++ * codes. Since 1.5.24 + * + * Describes primary purpose of the input context. This information + * is particularly useful to implement intelligent behavior in + * engines, such as automatic input-mode switch and text prediction. + * ++ * Note that the purpose is not meant to impose a totally strict rule ++ * about allowed characters, and does not replace input validation. ++ * It is fine for an on-screen keyboard to let the user override the ++ * character set restriction that is expressed by the purpose. The ++ * application is expected to validate the entry contents, even if ++ * it specified a purpose. ++ * ++ * The difference between @IBUS_INPUT_PURPOSE_DIGITS and ++ * @IBUS_INPUT_PURPOSE_NUMBER is that the former accepts only digits ++ * while the latter also some punctuation (like commas or points, plus, ++ * minus) and ā€œeā€ or ā€œEā€ as in 3.14E+000. ++ * + * This enumeration may be extended in the future; engines should + * interpret unknown values as 'free form'. ++ * ++ * Since: 1.5.4 + */ + typedef enum + { +- IBUS_INPUT_PURPOSE_FREE_FORM, +- IBUS_INPUT_PURPOSE_ALPHA, +- IBUS_INPUT_PURPOSE_DIGITS, +- IBUS_INPUT_PURPOSE_NUMBER, +- IBUS_INPUT_PURPOSE_PHONE, +- IBUS_INPUT_PURPOSE_URL, +- IBUS_INPUT_PURPOSE_EMAIL, +- IBUS_INPUT_PURPOSE_NAME, +- IBUS_INPUT_PURPOSE_PASSWORD, +- IBUS_INPUT_PURPOSE_PIN ++ IBUS_INPUT_PURPOSE_FREE_FORM, ++ IBUS_INPUT_PURPOSE_ALPHA, ++ IBUS_INPUT_PURPOSE_DIGITS, ++ IBUS_INPUT_PURPOSE_NUMBER, ++ IBUS_INPUT_PURPOSE_PHONE, ++ IBUS_INPUT_PURPOSE_URL, ++ IBUS_INPUT_PURPOSE_EMAIL, ++ IBUS_INPUT_PURPOSE_NAME, ++ IBUS_INPUT_PURPOSE_PASSWORD, ++ IBUS_INPUT_PURPOSE_PIN, ++ IBUS_INPUT_PURPOSE_TERMINAL + } IBusInputPurpose; + + /** +@@ -280,24 +297,36 @@ typedef enum + * first word of each sentence + * @IBUS_INPUT_HINT_INHIBIT_OSK: Suggest to not show an onscreen keyboard + * (e.g for a calculator that already has all the keys). +- * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical. ++ * @IBUS_INPUT_HINT_VERTICAL_WRITING: The text is vertical. Since 1.5.11 ++ * @IBUS_INPUT_HINT_EMOJI: Suggest offering Emoji support. Since 1.5.24 ++ * @IBUS_INPUT_HINT_NO_EMOJI: Suggest not offering Emoji support. Since 1.5.24 + * + * Describes hints that might be taken into account by engines. Note + * that engines may already tailor their behaviour according to the + * #IBusInputPurpose of the entry. ++ * ++ * Some common sense is expected when using these flags - mixing ++ * @IBUS_INPUT_HINT_LOWERCASE with any of the uppercase hints makes no sense. ++ * ++ * This enumeration may be extended in the future; engines should ++ * ignore unknown values. ++ * ++ * Since: 1.5.4 + */ + typedef enum + { +- IBUS_INPUT_HINT_NONE = 0, +- IBUS_INPUT_HINT_SPELLCHECK = 1 << 0, +- IBUS_INPUT_HINT_NO_SPELLCHECK = 1 << 1, +- IBUS_INPUT_HINT_WORD_COMPLETION = 1 << 2, +- IBUS_INPUT_HINT_LOWERCASE = 1 << 3, +- IBUS_INPUT_HINT_UPPERCASE_CHARS = 1 << 4, +- IBUS_INPUT_HINT_UPPERCASE_WORDS = 1 << 5, +- IBUS_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 6, +- IBUS_INPUT_HINT_INHIBIT_OSK = 1 << 7, +- IBUS_INPUT_HINT_VERTICAL_WRITING = 1 << 8 ++ IBUS_INPUT_HINT_NONE = 0, ++ IBUS_INPUT_HINT_SPELLCHECK = 1 << 0, ++ IBUS_INPUT_HINT_NO_SPELLCHECK = 1 << 1, ++ IBUS_INPUT_HINT_WORD_COMPLETION = 1 << 2, ++ IBUS_INPUT_HINT_LOWERCASE = 1 << 3, ++ IBUS_INPUT_HINT_UPPERCASE_CHARS = 1 << 4, ++ IBUS_INPUT_HINT_UPPERCASE_WORDS = 1 << 5, ++ IBUS_INPUT_HINT_UPPERCASE_SENTENCES = 1 << 6, ++ IBUS_INPUT_HINT_INHIBIT_OSK = 1 << 7, ++ IBUS_INPUT_HINT_VERTICAL_WRITING = 1 << 8, ++ IBUS_INPUT_HINT_EMOJI = 1 << 9, ++ IBUS_INPUT_HINT_NO_EMOJI = 1 << 10 + } IBusInputHints; + + #endif +-- +2.24.1 diff --git a/ibus-po-1.5.19-20180822.tar.gz b/ibus-po-1.5.19-20180822.tar.gz deleted file mode 100644 index 0de8463..0000000 Binary files a/ibus-po-1.5.19-20180822.tar.gz and /dev/null differ diff --git a/ibus.spec b/ibus.spec index 3aa7ea9..f99411b 100644 --- a/ibus.spec +++ b/ibus.spec @@ -5,23 +5,25 @@ %global dbus_python_version 0.83.0 Name: ibus -Version: 1.5.19 -Release: 7 +Version: 1.5.23 +Release: 1 Summary: Intelligent Input Bus for Linux OS License: LGPLv2+ URL: https://github.com/ibus/%name/wiki -Source0: https://github.com/ibus/%name/releases/download/%{version}/%{name}-%{version}.tar.gz +Source0: https://github.com/ibus/ibus/releases/download/%{version}/%{name}-%{version}.tar.gz #Source1,2 come form fedora Source1: %{name}-xinput Source2: %{name}.conf.5 -Source3: https://fujiwara.fedorapeople.org/ibus/po/%{name}-po-1.5.19-20180822.tar.gz Patch0: %{name}-HEAD.patch Patch1: %{name}-1385349-segv-bus-proxy.patch +Patch2: 30a3641e19c541924959a5770dd784b4424288d4.patch BuildRequires: gettext-devel libtool glib2-doc gtk2-devel gtk3-devel dbus-glib-devel gtk-doc dconf-devel dbus-x11 python3-devel -BuildRequires: dbus-python-devel >= %{dbus_python_version} desktop-file-utils python3-gobject python2-devel vala vala-devel vala-tools -BuildRequires: GConf2-devel intltool iso-codes-devel libnotify-devel libwayland-client-devel qt5-qtbase-devel cldr-emoji-annotation +BuildRequires: dbus-python-devel >= %{dbus_python_version} desktop-file-utils python3-gobject vala vala-devel vala-tools +BuildRequires: iso-codes-devel libnotify-devel libwayland-client-devel qt5-qtbase-devel cldr-emoji-annotation BuildRequires: unicode-emoji unicode-ucd libXtst-devel libxslt gobject-introspection-devel pygobject3-devel +#tmp buildrequire for update +BuildRequires: ibus-libs Requires: iso-codes dbus-x11 dconf python3-gobject python3 Requires: xorg-x11-xinit xorg-x11-xkb-utils @@ -38,8 +40,8 @@ Requires(postun): %{_sbindir}/alternatives Provides: ibus-gtk = %{version}-%{release} Obsoletes: ibus-gtk < %{version}-%{release} -Provides: ibus-gtk2 ibus-gtk3 ibus-setup ibus-wayland -Obsoletes: ibus-gtk2 ibus-gtk3 ibus-setup ibus-wayland +Provides: ibus-gtk2 = %{version}-%{release} ibus-gtk3 = %{version}-%{release} ibus-setup = %{version}-%{release} ibus-wayland = %{version}-%{release} +Obsoletes: ibus-gtk2 < %{version}-%{release} ibus-gtk3 < %{version}-%{release} ibus-setup < %{version}-%{release} ibus-wayland < %{version}-%{release} %global _xinputconf %{_sysconfdir}/X11/xinit/xinput.d/ibus.conf @@ -58,8 +60,8 @@ This package contains the libraries for IBus Summary: Development tools for ibus Requires: %{name} = %{version}-%{release} Requires: dbus-devel glib2-devel gobject-introspection-devel vala -Provides: ibus-devel-docs -Obsoletes: ibus-devel-docs +Provides: ibus-devel-docs = %{version}-%{release} +Obsoletes: ibus-devel-docs < %{version}-%{release} %package_help @@ -70,7 +72,6 @@ docs for ibus. %prep %autosetup -p1 -zcat %SOURCE3 | tar xfv - diff client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c if test $? -ne 0 ; then @@ -100,7 +101,7 @@ done install -pm 644 -D %{SOURCE1} $RPM_BUILD_ROOT%{_xinputconf} -echo "NoDisplay=true" >> $RPM_BUILD_ROOT%{_datadir}/applications/ibus-setup.desktop +echo "NoDisplay=true" >> $RPM_BUILD_ROOT%{_datadir}/applications/org.freedesktop.IBus.Setup.desktop desktop-file-install --delete-original \ --dir $RPM_BUILD_ROOT%{_datadir}/applications \ @@ -108,6 +109,9 @@ desktop-file-install --delete-original \ %find_lang %{name}10 +#tmp add for update +cp -a %{_libdir}/libibus-*%{ibus_api_version}.so.* %{buildroot}/%{_libdir} + %check make check DISABLE_GUI_TESTS="ibus-compose ibus-keypress test-stress" VERBOSE=1 %{nil} @@ -165,6 +169,7 @@ dconf update || : %{_libdir}/lib*.so %{_libdir}/pkgconfig/* %{_includedir}/* +%{_datadir}/gettext/its/ibus.* %{_datadir}/gir-1.0/IBus*-1.0.gir %{_datadir}/vala/vapi/ibus-*1.0.vapi %{_datadir}/vala/vapi/ibus-*1.0.deps @@ -176,6 +181,9 @@ dconf update || : %{_datadir}/gtk-doc/html/* %changelog +* Wed Jul 21 2021 hanhui - 1.5.23-1 +- update to 1.5.23 + * Wed Feb 26 2020 hexiujun - 1.5.19-7 - Type:enhancement - ID:NA @@ -190,4 +198,3 @@ dconf update || : * Thu Sep 19 2019 openEuler Buildteam - 1.5.19-5 - Package init -