Fix Bug 1618682 - SEGV with ASCII on emojier in Wayland
- Support Shift-Space on emojier preedit - Do not move Emojier popup with the active candidate in Xorg
This commit is contained in:
parent
7d5c2f40f5
commit
3a447b7916
357
ibus-HEAD.patch
357
ibus-HEAD.patch
@ -35,3 +35,360 @@ index 85dcdceb..637ae049 100644
|
|||||||
--
|
--
|
||||||
2.17.1
|
2.17.1
|
||||||
|
|
||||||
|
From 28d22176aee6be97d88dd6c60fa5395c79563ec0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: fujiwarat <takao.fujiwara1@gmail.com>
|
||||||
|
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 <takao.fujiwara1@gmail.com>
|
||||||
|
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 <takao.fujiwara1@gmail.com>
|
||||||
|
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
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
|
|
||||||
Name: ibus
|
Name: ibus
|
||||||
Version: 1.5.19
|
Version: 1.5.19
|
||||||
Release: 2%{?dist}
|
Release: 3%{?dist}
|
||||||
Summary: Intelligent Input Bus for Linux OS
|
Summary: Intelligent Input Bus for Linux OS
|
||||||
License: LGPLv2+
|
License: LGPLv2+
|
||||||
Group: System Environment/Libraries
|
Group: System Environment/Libraries
|
||||||
@ -78,6 +78,8 @@ BuildRequires: qt5-qtbase-devel
|
|||||||
BuildRequires: cldr-emoji-annotation
|
BuildRequires: cldr-emoji-annotation
|
||||||
BuildRequires: unicode-emoji
|
BuildRequires: unicode-emoji
|
||||||
BuildRequires: unicode-ucd
|
BuildRequires: unicode-ucd
|
||||||
|
# for ibus-keypress
|
||||||
|
BuildRequires: libXtst-devel
|
||||||
|
|
||||||
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
||||||
Requires: %{name}-gtk2%{?_isa} = %{version}-%{release}
|
Requires: %{name}-gtk2%{?_isa} = %{version}-%{release}
|
||||||
@ -426,6 +428,11 @@ dconf update || :
|
|||||||
%{_datadir}/gtk-doc/html/*
|
%{_datadir}/gtk-doc/html/*
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* 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
|
||||||
|
- Do not move Emojier popup with the active candidate in Xorg
|
||||||
|
|
||||||
* Wed Aug 22 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.19-2
|
* Wed Aug 22 2018 Takao Fujiwara <tfujiwar@redhat.com> - 1.5.19-2
|
||||||
- Do not clear Unicode data when emoji annotation lang is changed
|
- Do not clear Unicode data when emoji annotation lang is changed
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user