commit e65eaecaa490ffcb347e5910de45c48cccd83537 Author: overweight <5324761+overweight@user.noreply.gitee.com> Date: Mon Sep 30 10:53:03 2019 -0400 Package init diff --git a/ibus-1.5.19.tar.gz b/ibus-1.5.19.tar.gz new file mode 100644 index 0000000..cf7e8b0 Binary files /dev/null and b/ibus-1.5.19.tar.gz differ diff --git a/ibus-1385349-segv-bus-proxy.patch b/ibus-1385349-segv-bus-proxy.patch new file mode 100644 index 0000000..f206eda --- /dev/null +++ b/ibus-1385349-segv-bus-proxy.patch @@ -0,0 +1,214 @@ +From 865b204f1c06b782cf7b4a479b358e76f4b3dfee 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() + +BUG=rhbz#1349148 +BUG=rhbz#1385349 +BUG=rhbz#1350291 +BUG=rhbz#1406699 +BUG=rhbz#1432252 +BUG=rhbz#1601577 +--- + bus/dbusimpl.c | 38 ++++++++++++++++++++++++++++++++------ + bus/engineproxy.c | 5 ++++- + bus/ibusimpl.c | 21 ++++++++++++++++++--- + 3 files changed, 54 insertions(+), 10 deletions(-) + +diff --git a/bus/dbusimpl.c b/bus/dbusimpl.c +index b54ef817..e4dd8683 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) + { ++ 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) : ""); + + } + } +@@ -1464,13 +1483,20 @@ bus_dbus_impl_connection_filter_cb (GDBusConnection *dbus_connection, + gboolean incoming, + gpointer user_data) + { ++ BusDBusImpl *dbus; ++ BusConnection *connection; ++ + g_assert (G_IS_DBUS_CONNECTION (dbus_connection)); + g_assert (G_IS_DBUS_MESSAGE (message)); + g_assert (BUS_IS_DBUS_IMPL (user_data)); + +- BusDBusImpl *dbus = (BusDBusImpl *) user_data; +- BusConnection *connection = bus_connection_lookup (dbus_connection); ++ if (g_dbus_connection_is_closed (dbus_connection)) ++ return NULL; ++ ++ dbus = (BusDBusImpl *) user_data; ++ connection = bus_connection_lookup (dbus_connection); + g_assert (connection != NULL); ++ g_assert (BUS_IS_CONNECTION (connection)); + + if (incoming) { + /* is incoming message */ +diff --git a/bus/engineproxy.c b/bus/engineproxy.c +index 2d98995c..d661673a 100644 +--- a/bus/engineproxy.c ++++ b/bus/engineproxy.c +@@ -665,6 +665,7 @@ bus_engine_proxy_new_internal (const gchar *path, + IBusEngineDesc *desc, + GDBusConnection *connection) + { ++ GError *error = NULL; + 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 = + (BusEngineProxy *) g_initable_new (BUS_TYPE_ENGINE_PROXY, + NULL, +- NULL, ++ &error, + "desc", desc, + "g-connection", connection, + "g-interface-name", IBUS_INTERFACE_ENGINE, +@@ -681,6 +682,8 @@ 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); + 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); + } +-- +2.17.1 + diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch new file mode 100644 index 0000000..392d32a --- /dev/null +++ b/ibus-HEAD.patch @@ -0,0 +1,712 @@ +From 7edaefdc1d80aefdbbc2dc52526c20715759da83 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 + +--- + ui/gtk3/emojier.vala | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 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); ++ } + } + + +-- +2.17.1 + +From 28d22176aee6be97d88dd6c60fa5395c79563ec0 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 + +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(-) + +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 { + + 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); + +- 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); + } + +@@ -1941,28 +1897,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { + } + + +- 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); +- } +- +- + private Gdk.Rectangle get_monitor_geometry() { + Gdk.Rectangle monitor_area = { 0, }; + +@@ -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); ++ } + } +-- +2.17.1 + diff --git a/ibus-po-1.5.19-20180822.tar.gz b/ibus-po-1.5.19-20180822.tar.gz new file mode 100644 index 0000000..0de8463 Binary files /dev/null and b/ibus-po-1.5.19-20180822.tar.gz differ diff --git a/ibus-xinput b/ibus-xinput new file mode 100644 index 0000000..4d7f457 --- /dev/null +++ b/ibus-xinput @@ -0,0 +1,18 @@ +XIM=ibus +XIM_PROGRAM="/usr/bin/ibus-daemon" +ICON="ibus" +XIM_ARGS="-r --xim" +PREFERENCE_PROGRAM=/usr/bin/ibus-setup +SHORT_DESC="IBus" +GTK_IM_MODULE=ibus +NOT_RUN=gnome3 + +if test -f /usr/lib64/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so || \ + test -f /usr/lib/qt5/plugins/platforminputcontexts/libibusplatforminputcontextplugin.so || \ + test -f /usr/lib64/qt4/plugins/inputmethods/libqtim-ibus.so || \ + test -f /usr/lib/qt4/plugins/inputmethods/libqtim-ibus.so; +then + QT_IM_MODULE=ibus +else + QT_IM_MODULE=xim +fi diff --git a/ibus.conf.5 b/ibus.conf.5 new file mode 100644 index 0000000..c5795b3 --- /dev/null +++ b/ibus.conf.5 @@ -0,0 +1,73 @@ +.\" This file is distributed under the same license as the ibus +.\" package. +.\" Copyright (C) Takao Fujiwara , 2013. +.\" +.TH IBUS.CONF "5" "August 2013" "1.5.3" "User Commands" +.SH NAME +.B ibus.conf +\- X input preload/configuration file for ibus + +.SH SYNOPSIS +.B /etc/X11/xinit/xinput.d/ibus.conf + +.SH DESCRIPTION + +.PP +IBus is an Intelligent Input Bus. It is a new input framework for Linux +OS. It provides full featured and user friendly input method user +interface. It also may help developers to develop input method easily. + +.PP +.B ibus.conf +is a configuration file containing X input setting values to be read in +and set by /etc/X11/xinit/xinitrc\-common. +.I imsettings-switch(1) +is called from XDG auto\-start and invokes +xinitrc\-common. +.LP +If this file is the alias of +.I /etc/X11/xinit/xinputrc +for the system setting +or +.I [$XDG_CONFIG_HOME|$HOME/.config]/imsettings/xinputrc +for the user setting, the setting can be default. +.I im\-chooser(1) +can choose the user setting. +.LP +The configuration options are: +.TP +\fBXIM\fP +XIM name for XMODIFIERS +.TP +\fBXIM_PROGRAM\fP +XIM executable program name +.TP +\fBXIM_ARGS\fP +XIM arguments for XIM_PROGRAM +.TP +\fBSHORT_DESC\fP +XIM human readable name for +.I im\-chooser(1) +.TP +\fBICON\fP +icon file for +.I im\-chooser(1) +.TP +\fBPREFERENCE_PROGRAM\fP +XIM setup program for +.I im\-chooser(1) +.TP +\fBGTK_IM_MODULE\fP +IM environment valuable for GTK+ applications. +.TP +\fBQT_IM_MODULE\fP +IM environment valuable for QT applications. + +.SH BUGS +If you find a bug, please report it at http://code.google.com/p/ibus/issues/list + +.SH "SEE ALSO" +.BR ibus\-daemon (1) +.BR imsettings\-switch (1) +.BR im\-chooser (1) +.BR X (7) diff --git a/ibus.spec b/ibus.spec new file mode 100644 index 0000000..72b5655 --- /dev/null +++ b/ibus.spec @@ -0,0 +1,184 @@ +%global with_pkg_config %(pkg-config --version >/dev/null 2>&1 && echo -n "1" || echo -n "0") +%global with_kde5 1 +%global ibus_api_version 1.0 +%global __python %{__python3} +%global dbus_python_version 0.83.0 + +Name: ibus +Version: 1.5.19 +Release: 5 +Summary: Intelligent Input Bus for Linux OS +License: LGPLv2+ +Group: System Environment/Libraries +URL: https://github.com/ibus/%name/wiki +Source0: https://github.com/ibus/%name/releases/download/%{version}/%{name}-%{version}.tar.gz +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 + +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: unicode-emoji unicode-ucd libXtst-devel libxslt gobject-introspection-devel pygobject3-devel + +Requires: iso-codes dbus-x11 dconf python3-gobject python3 xorg-x11-xinit python2 +Requires: dbus-python pygobject3-base xorg-x11-xkb-utils + +Requires: desktop-file-utils glib2 +Requires(post): desktop-file-utils glib2 +Requires(postun): desktop-file-utils +Requires: dconf +Requires(postun): dconf +Requires(posttrans): dconf +Requires: %{_sbindir}/alternatives +Requires(post): %{_sbindir}/alternatives +Requires(postun): %{_sbindir}/alternatives + +Provides: ibus-gtk = %{version}-%{release} +Obsoletes: ibus-gtk < %{version}-%{release} +Provides: ibus-gtk2 ibus-gtk3 ibus-setup ibus-pygtk2 ibus-py2override ibus-wayland +Obsoletes: ibus-gtk2 ibus-gtk3 ibus-setup ibus-pygtk2 ibus-py2override ibus-wayland + +%global _xinputconf %{_sysconfdir}/X11/xinit/xinput.d/ibus.conf + +%description +IBus means Intelligent Input Bus. It is an input framework for Linux OS. + +%package libs +Summary: IBus libraries +Requires: dbus >= 1.2.4 +Requires: glib2 gobject-introspection + +%description libs +This package contains the libraries for IBus + +%package devel +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 + +%package_help + +%description devel +The ibus-devel package contains the header files and developer +docs for ibus. + +%prep +%autosetup -p1 + +zcat %SOURCE3 | tar xfv - + +diff client/gtk2/ibusimcontext.c client/gtk3/ibusimcontext.c +if test $? -ne 0 ; then + echo "Have to copy ibusimcontext.c into client/gtk3" + abort +fi + +%build +autoreconf -ivf +%configure --disable-static --enable-gtk2 --enable-gtk3 --enable-xim --enable-gtk-doc --enable-surrounding-text \ + --with-python=python3 --enable-python-library --enable-wayland --enable-introspection %{nil} + +make -C ui/gtk3 maintainer-clean-generic +make + +%install +%make_install INSTALL='install -p' +%delete_la + +for S in %{SOURCE2} +do + cp $S . + MP=`basename $S` + gzip $MP + install -pm 644 -D ${MP}.gz $RPM_BUILD_ROOT%{_datadir}/man/man5/${MP}.gz +done + +install -pm 644 -D %{SOURCE1} $RPM_BUILD_ROOT%{_xinputconf} + +echo "NoDisplay=true" >> $RPM_BUILD_ROOT%{_datadir}/applications/ibus-setup.desktop + +desktop-file-install --delete-original \ + --dir $RPM_BUILD_ROOT%{_datadir}/applications \ + $RPM_BUILD_ROOT%{_datadir}/applications/* + +%find_lang %{name}10 + +%check +make check DISABLE_GUI_TESTS="ibus-compose ibus-keypress test-stress" VERBOSE=1 %{nil} + +%post +%{_sbindir}/alternatives --install %{_sysconfdir}/X11/xinit/xinputrc xinputrc %{_xinputconf} 83 || : + +%postun +if [ "$1" -eq 0 ]; then + %{_sbindir}/alternatives --remove xinputrc %{_xinputconf} || : + [ -L %{_sysconfdir}/alternatives/xinputrc -a "`readlink %{_sysconfdir}/alternatives/xinputrc`" = "%{_xinputconf}" ] && %{_sbindir}/alternatives --auto xinputrc || : + + dconf update || : + [ -f %{_sysconfdir}/dconf/db/ibus ] && \ + rm %{_sysconfdir}/dconf/db/ibus || : + [ -f /var/cache/ibus/bus/registry ] && \ + rm /var/cache/ibus/bus/registry || : +fi + +%posttrans +dconf update || : +[ -x %{_bindir}/ibus ] && \ + %{_bindir}/ibus write-cache --system &>/dev/null || : + +%ldconfig_scriptlets libs + +%files -f %{name}10.lang +%defattr(-,root,root) +%doc COPYING AUTHORS +%{_bindir}/ibus +%{_bindir}/ibus-daemon +%{_bindir}/ibus-setup +%{_datadir}/applications/*.desktop +%{_datadir}/bash-completion/completions/ibus.bash +%{_datadir}/dbus-1/services/*.service +%{_datadir}/GConf/gsettings/* +%{_datadir}/glib-2.0/schemas/*.xml +%{_datadir}/ibus/* +%{_datadir}/icons/hicolor/*/apps/* +%{_libexecdir}/* +%{_sysconfdir}/dconf/db/ibus.d +%{_sysconfdir}/dconf/profile/ibus +%python3_sitearch/gi/overrides/__pycache__/*.py* +%python3_sitearch/gi/overrides/IBus.py +%dir %{_sysconfdir}/X11/xinit/xinput.d +%config %{_xinputconf} +%{_libdir}/gtk-2.0/* +%{_libdir}/gtk-3.0/* +%dir %{python2_sitelib}/ibus +%{python2_sitelib}/ibus/* +%python2_sitearch/gi/overrides/IBus.py* + +%files libs +%{_libdir}/libibus-*%{ibus_api_version}.so.* +%{_libdir}/girepository-1.0/IBus*-1.0.typelib + +%files devel +%defattr(-,root,root) +%{_libdir}/lib*.so +%{_libdir}/pkgconfig/* +%{_includedir}/* +%{_datadir}/gir-1.0/IBus*-1.0.gir +%{_datadir}/vala/vapi/ibus-*1.0.vapi +%{_datadir}/vala/vapi/ibus-*1.0.deps + +%files help +%defattr(-,root,root) +%doc README +%{_datadir}/man/*/* +%{_datadir}/gtk-doc/html/* + +%changelog +* Thu Sep 19 2019 openEuler Buildteam - 1.5.19-5 +- Package init +