Resolves: #1942970 Clear Emoijer preedit/lookup popup between applications
This commit is contained in:
parent
bcef7391cc
commit
7bcd5b5547
268
ibus-HEAD.patch
268
ibus-HEAD.patch
@ -423,3 +423,271 @@ index 00000000..fa0c9b40
|
|||||||
--
|
--
|
||||||
2.28.0
|
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
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
Name: ibus
|
Name: ibus
|
||||||
Version: 1.5.25
|
Version: 1.5.25
|
||||||
Release: 4%{?dist}
|
Release: 5%{?dist}
|
||||||
Summary: Intelligent Input Bus for Linux OS
|
Summary: Intelligent Input Bus for Linux OS
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
URL: https://github.com/ibus/%name/wiki
|
URL: https://github.com/ibus/%name/wiki
|
||||||
@ -512,6 +512,9 @@ dconf update || :
|
|||||||
%{_datadir}/installed-tests/ibus
|
%{_datadir}/installed-tests/ibus
|
||||||
|
|
||||||
%changelog
|
%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
|
* Mon Sep 06 2021 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.25-4
|
||||||
- Clear preedit with mouse click and GTK4 applications
|
- Clear preedit with mouse click and GTK4 applications
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user