public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Takao Fujiwara <tfujiwar@redhat.com>
To: git-commits@fedoraproject.org
Subject: [rpms/ibus] autotool: Fix Bug SEGV Choose an emoji by mouse from the emoji category list
Date: Sun, 31 May 2026 02:06:59 GMT [thread overview]
Message-ID: <178019321939.1.4149873277001924078.rpms-ibus-ed8c51ca3ac7@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/ibus
Branch : autotool
Commit : ed8c51ca3ac789a3e9a67010f0c8ab3db716f6d4
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date : 2018-09-14T16:59:42+09:00
Stats : +322/-1 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/ibus/c/ed8c51ca3ac789a3e9a67010f0c8ab3db716f6d4?branch=autotool
Log:
Fix Bug SEGV Choose an emoji by mouse from the emoji category list
---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index 2bbad4b..392d32a 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -392,3 +392,321 @@ index 0f455800..9811fde5 100644
--
2.17.1
+From 1c6565e205528a45e88a84ba2a328f9035875c8d Mon Sep 17 00:00:00 2001
+From: fujiwarat <takao.fujiwara1@gmail.com>
+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<string>? 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.spec b/ibus.spec
index c46f7d3..26f5b04 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -31,7 +31,7 @@
Name: ibus
Version: 1.5.19
-Release: 3%{?dist}
+Release: 4%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
Group: System Environment/Libraries
@@ -428,6 +428,9 @@ dconf update || :
%{_datadir}/gtk-doc/html/*
%changelog
+* Fri Sep 14 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.19-4
+- Fix Bug SEGV Choose an emoji by mouse from the emoji category list
+
* Thu Aug 30 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.19-3
- Fix Bug 1618682 - SEGV with ASCII on emojier in Wayland
- Support Shift-Space on emojier preedit
reply other threads:[~2026-05-31 2:06 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=178019321939.1.4149873277001924078.rpms-ibus-ed8c51ca3ac7@fedoraproject.org \
--to=tfujiwar@redhat.com \
--cc=git-commits@fedoraproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox