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: Resolves: #1942970 Clear Emoijer preedit/lookup popup between applications
Date: Sun, 31 May 2026 02:07:43 GMT [thread overview]
Message-ID: <178019326342.1.7792054818990217591.rpms-ibus-7bcd5b554733@fedoraproject.org> (raw)
A new commit has been pushed.
Repo : rpms/ibus
Branch : autotool
Commit : 7bcd5b554733f4de2e667777ae7862249769dd54
Author : Takao Fujiwara <tfujiwar@redhat.com>
Date : 2021-10-29T13:34:00+09:00
Stats : +272/-1 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/ibus/c/7bcd5b554733f4de2e667777ae7862249769dd54?branch=autotool
Log:
Resolves: #1942970 Clear Emoijer preedit/lookup popup between applications
---
diff --git a/ibus-HEAD.patch b/ibus-HEAD.patch
index 4e987de..f249ec4 100644
--- a/ibus-HEAD.patch
+++ b/ibus-HEAD.patch
@@ -423,3 +423,271 @@ index 00000000..fa0c9b40
--
2.28.0
+From acc5570511698c7b5cc037eb81be2c4be52a824f Mon Sep 17 00:00:00 2001
+From: fujiwarat <takao.fujiwara1@gmail.com>
+Date: Fri, 29 Oct 2021 12:56:49 +0900
+Subject: [PATCH] ui/gtk3: Erase Emojier preedit/lookup popup between
+ applications
+
+It would be better to erase Emojier popup window when users change
+the input focus between applications. But it hasn't been implemented
+because the focus-out/in events also happen when the Emojier popup window
+is launching or rebuilding to the category list in GNOME Wayland.
+The focus-out/in events do not happen in Xorg desktops with the rebuilding
+GUI because GTK popup window causes focus-in/out evnets in Wayland.
+
+Now I'm convinced with several issues and added a little complicated logic
+to erase Emojier popup window with the focus changes between input contexts
+to handle focus-in/out events in Wayland.
+
+BUG=rhbz#1942970
+---
+ ui/gtk3/emojier.vala | 69 ++++++++++++++++++++++++++++++++++++---
+ ui/gtk3/emojierapp.vala | 12 +++++--
+ ui/gtk3/panelbinding.vala | 21 ++++++++++--
+ 3 files changed, 94 insertions(+), 8 deletions(-)
+
+diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala
+index 9e6e9263..69fb8abe 100644
+--- a/ui/gtk3/emojier.vala
++++ b/ui/gtk3/emojier.vala
+@@ -2,7 +2,7 @@
+ *
+ * ibus - The Input Bus
+ *
+- * Copyright (c) 2017-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (c) 2017-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+@@ -227,6 +227,8 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ BACKWARD,
+ }
+
++ public bool is_wayland { get; set; }
++
+ public const uint BUTTON_CLOSE_BUTTON = 1000;
+
+ private const uint EMOJI_GRID_PAGE = 10;
+@@ -317,15 +319,18 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ private Gdk.Rectangle m_cursor_location;
+ private bool m_is_up_side_down = false;
+ private uint m_redraw_window_id;
++ private bool m_rebuilding_gui = false;
++ private uint m_rebuilding_gui_timeout_id;
+
+ public signal void candidate_clicked(uint index, uint button, uint state);
+ public signal void commit_text(string text);
+ public signal void cancel();
+
+- public IBusEmojier() {
++ public IBusEmojier(bool is_wayland) {
+ GLib.Object(
+ type : Gtk.WindowType.POPUP
+ );
++ this.is_wayland = is_wayland;
+
+ // GLib.ActionEntry accepts const variables only.
+ var action = new GLib.SimpleAction.stateful(
+@@ -1002,6 +1007,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ button.button_press_event.connect((w, e) => {
+ m_category_active_index = -1;
+ m_show_unicode = false;
++ start_rebuild_gui(false);
+ hide_candidate_panel();
+ show_all();
+ return true;
+@@ -1458,6 +1464,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ show_emoji_for_category(m_backward);
+ show_candidate_panel();
+ } else {
++ start_rebuild_gui(false);
+ hide_candidate_panel();
+ show_all();
+ }
+@@ -1778,6 +1785,34 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ }
+
+
++ private void start_rebuild_gui(bool initial_launching) {
++ if (!this.is_wayland)
++ return;
++ if (!initial_launching && !base.get_visible())
++ return;
++ if (initial_launching && base.get_visible())
++ return;
++ if (m_rebuilding_gui_timeout_id != 0) {
++ GLib.Source.remove(m_rebuilding_gui_timeout_id);
++ m_rebuilding_gui_timeout_id = 0;
++ }
++
++ m_rebuilding_gui = true;
++ m_rebuilding_gui_timeout_id =
++ GLib.Timeout.add_seconds(10, () => {
++ if (!m_rebuilding_gui) {
++ m_rebuilding_gui_timeout_id = 0;
++ return false;
++ }
++ warning("Rebuilding GUI is time out.");
++ m_rebuilding_gui = false;
++ m_rebuilding_gui_timeout_id = 0;
++ return false;
++ },
++ GLib.Priority.DEFAULT_IDLE);
++ }
++
++
+ public bool has_variants(uint index,
+ bool need_commit_signal) {
+ if (index >= m_lookup_table.get_number_of_candidates())
+@@ -1880,12 +1915,17 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ m_show_unicode = false;
+ m_category_active_index = -1;
+ }
++ start_rebuild_gui(false);
+ hide_candidate_panel();
+ return true;
+ } else if (m_backward_index >= 0 && m_backward != null) {
++ // Escape on Emoji variants window does not call focus-out events
++ // because hide() is not called here so start_rebuild_gui()
++ // is not called.
+ show_emoji_for_category(m_backward);
+ return true;
+ } else if (m_candidate_panel_is_visible && m_backward != null) {
++ start_rebuild_gui(false);
+ hide_candidate_panel();
+ return true;
+ }
+@@ -2218,7 +2258,7 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+
+ /* Some window managers, e.g. MATE, GNOME, Plasma desktops,
+ * does not give the keyboard focus when Emojier is lauched
+- * twice with Ctrl-Shift-e via XIEvent, if present_with_time()
++ * twice with Ctrl-period via XIEvent, if present_with_time()
+ * is not applied.
+ * But XFCE4 desktop does not effect this bug.
+ * Seems this is caused by the window manager's focus stealing
+@@ -2265,8 +2305,10 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ #endif
+
+
+- /* override virtual functions */
++ // override virtual functions
+ public override void show_all() {
++ // Ctrl-period, space keys causes focus-out/in events in GNOME Wayland.
++ start_rebuild_gui(true);
+ base.show_all();
+ if (m_candidate_panel_mode)
+ show_candidate_panel();
+@@ -2416,6 +2458,17 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ }
+
+
++ public override bool focus_in_event(Gdk.EventFocus event) {
++ m_rebuilding_gui = false;
++ return base.focus_in_event(event);
++ }
++
++
++ public override bool focus_out_event(Gdk.EventFocus event) {
++ return base.focus_out_event(event);
++ }
++
++
+ public bool is_running() {
+ return m_is_running;
+ }
+@@ -2511,6 +2564,14 @@ public class IBusEmojier : Gtk.ApplicationWindow {
+ }
+
+
++ public bool is_rebuilding_gui() {
++ /* The candidate window and preedit text should not be closed
++ * when the GUI is rebuilding.
++ */
++ return m_rebuilding_gui;
++ }
++
++
+ public static bool has_loaded_emoji_dict() {
+ if (m_emoji_to_data_dict == null)
+ return false;
+diff --git a/ui/gtk3/emojierapp.vala b/ui/gtk3/emojierapp.vala
+index 783c611c..812356f0 100644
+--- a/ui/gtk3/emojierapp.vala
++++ b/ui/gtk3/emojierapp.vala
+@@ -3,7 +3,7 @@
+ * ibus - The Input Bus
+ *
+ * Copyright (c) 2017 Peng Wu <alexepico@gmail.com>
+- * Copyright (c) 2017-2019 Takao Fujiwara <takao.fujiwara1@gmail.com>
++ * Copyright (c) 2017-2021 Takao Fujiwara <takao.fujiwara1@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+@@ -208,7 +208,15 @@ public class EmojiApplication : Gtk.Application {
+ IBusEmojier.load_unicode_dict();
+
+ if (m_emojier == null) {
+- m_emojier = new IBusEmojier();
++ bool is_wayland = false;
++#if USE_GDK_WAYLAND
++ Type instance_type = Gdk.Display.get_default().get_type();
++ Type wayland_type = typeof(GdkWayland.Display);
++ is_wayland = instance_type.is_a(wayland_type);
++#else
++ warning("Checking Wayland is disabled");
++#endif
++ m_emojier = new IBusEmojier(is_wayland);
+ // For title handling in gnome-shell
+ add_window(m_emojier);
+ m_emojier.candidate_clicked.connect((i, b, s) => {
+diff --git a/ui/gtk3/panelbinding.vala b/ui/gtk3/panelbinding.vala
+index 861255b1..e63d93f2 100644
+--- a/ui/gtk3/panelbinding.vala
++++ b/ui/gtk3/panelbinding.vala
+@@ -3,7 +3,7 @@
+ * ibus - The Input Bus
+ *
+ * Copyright(c) 2018 Peng Huang <shawn.p.huang@gmail.com>
+- * Copyright(c) 2018-2020 Takao Fujwiara <takao.fujiwara1@gmail.com>
++ * Copyright(c) 2018-2021 Takao Fujwiara <takao.fujiwara1@gmail.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+@@ -799,6 +799,23 @@ class PanelBinding : IBus.PanelService {
+
+ public override void focus_out(string input_context_path) {
+ m_current_context_path = "";
++ /* Close emoji typing when the focus out happens but it's not a
++ * rebuilding GUI.
++ * Emojier rebuilding GUI happens when Escape key is pressed on
++ * Emojier candidate list and the rebuilding also causes focus-out/in
++ * events in GNOME Wayland but not Xorg desktops.
++ * The rebuilding GUI can be checked with m_emojier.is_rebuilding_gui()
++ * in Wayland.
++ * m_emojier.is_rebuilding_gui() always returns false in Xorg desktops
++ * since focus-out/in events does not happen.
++ */
++ if (m_emojier != null && !m_emojier.is_rebuilding_gui()) {
++ m_preedit.reset();
++ m_emojier.set_annotation("");
++ if (m_wayland_lookup_table_is_visible)
++ hide_wayland_lookup_table();
++ key_press_escape();
++ }
+ }
+
+
+@@ -822,7 +839,7 @@ class PanelBinding : IBus.PanelService {
+ m_loaded_unicode = true;
+ }
+ if (m_emojier == null) {
+- m_emojier = new IBusEmojier();
++ m_emojier = new IBusEmojier(m_is_wayland);
+ // For title handling in gnome-shell
+ m_application.add_window(m_emojier);
+ m_emojier.candidate_clicked.connect((i, b, s) => {
+--
+2.28.0
+
diff --git a/ibus.spec b/ibus.spec
index d11a672..fc208c6 100644
--- a/ibus.spec
+++ b/ibus.spec
@@ -38,7 +38,7 @@
Name: ibus
Version: 1.5.25
-Release: 4%{?dist}
+Release: 5%{?dist}
Summary: Intelligent Input Bus for Linux OS
License: LGPLv2+
URL: https://github.com/ibus/%name/wiki
@@ -512,6 +512,9 @@ dconf update || :
%{_datadir}/installed-tests/ibus
%changelog
+* Fri Oct 29 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.25-5
+- Resolves: #1942970 Clear Emoijer preedit/lookup popup between applications
+
* Mon Sep 06 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.25-4
- Clear preedit with mouse click and GTK4 applications
reply other threads:[~2026-05-31 2:07 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=178019326342.1.7792054818990217591.rpms-ibus-7bcd5b554733@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