From eedb8442242c969db1363795f9cb7c255242c527 Mon Sep 17 00:00:00 2001 From: rpm-build Date: Sep 23 2020 11:57:49 +0000 Subject: ibus-HEAD.patch patch_name: ibus-HEAD.patch present_in_specfile: true location_in_specfile: 1 --- diff --git a/bus/Makefile.am b/bus/Makefile.am index bdae5c9..4383a87 100644 --- a/bus/Makefile.am +++ b/bus/Makefile.am @@ -124,6 +124,7 @@ TESTS_ENVIRONMENT = \ srcdir=$(srcdir) \ LD_LIBRARY_PATH="$(top_builddir)/src/.libs:$(top_builddir)/src" \ DISABLE_GUI_TESTS="$(DISABLE_GUI_TESTS)" \ + DISABLE_DAEMONIZE_IN_TESTS="$(DISABLE_DAEMONIZE_IN_TESTS)" \ $(NULL) LOG_COMPILER = $(top_srcdir)/src/tests/runtest diff --git a/src/ibuskeymap.c b/src/ibuskeymap.c index 27a5675..5abfb99 100644 --- a/src/ibuskeymap.c +++ b/src/ibuskeymap.c @@ -143,7 +143,7 @@ ibus_keymap_parse_line (gchar *str, /* Do not assign *p1 to g_ascii_isalpha() directly for the syntax check */ if (i == 0 && strncmp (p2, "addupper", sizeof ("addupper") - 1) == 0 && - (ch = *p1) && g_ascii_isalpha (ch)) { + (ch = *p1) && (ch >= 0) && g_ascii_isalpha (ch)) { gchar buf[] = "a"; buf[0] = g_ascii_toupper(ch); keymap[keycode][0] = keymap[keycode][3] = keysym; diff --git a/src/ibuspanelservice.c b/src/ibuspanelservice.c index 9d87e19..984cc89 100644 --- a/src/ibuspanelservice.c +++ b/src/ibuspanelservice.c @@ -1615,7 +1615,11 @@ ibus_panel_service_panel_extension_register_keys (IBusPanelService *panel, va_start (var_args, first_property_name); do { keys = va_arg (var_args, IBusProcessKeyEventData *); - g_return_if_fail (keys != NULL); + if (keys == NULL) { + va_end (var_args); + g_warning ("Failed to va_arg for IBusProcessKeyEventData"); + return; + } g_variant_builder_init (&child, G_VARIANT_TYPE ("av")); for (; keys; keys++) { if (keys->keyval == 0 && keys->keycode == 0 && keys->state == 0) diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index c5fef3c..e337a59 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -73,6 +73,7 @@ TESTS_ENVIRONMENT = \ srcdir=$(srcdir) \ LD_LIBRARY_PATH="$(top_builddir)/src/.libs:$(top_builddir)/src" \ DISABLE_GUI_TESTS="$(DISABLE_GUI_TESTS)" \ + DISABLE_DAEMONIZE_IN_TESTS="$(DISABLE_DAEMONIZE_IN_TESTS)" \ $(NULL) LOG_COMPILER = $(srcdir)/runtest diff --git a/src/tests/ibus-bus.c b/src/tests/ibus-bus.c index 7fa1bc4..0bf9e61 100644 --- a/src/tests/ibus-bus.c +++ b/src/tests/ibus-bus.c @@ -820,6 +820,14 @@ finish_exit_async (GObject *source_object, static void start_exit_async (void) { + /* When `./runtest ibus-bus` runs, ibus-daemon sometimes failed to + * restart because closing a file descriptor was failed in + * bus/server.c:_restart_server() with a following error: + * "inotify read(): Bad file descriptor" + * Now g_usleep() is added here to write down the buffer and not to + * fail to restart ibus-daemon. + */ + g_usleep (G_USEC_PER_SEC); ibus_bus_exit_async (bus, TRUE, /* restart */ -1, /* timeout */ @@ -831,6 +839,9 @@ start_exit_async (void) static gboolean test_async_apis_finish (gpointer user_data) { + /* INFO: g_warning() causes SEGV with runtest script */ + if (ibus_get_address () == NULL) + g_warning ("ibus-daemon does not restart yet from start_exit_async()."); ibus_quit (); return FALSE; } @@ -906,7 +917,9 @@ call_next_async_function (void) }; static guint index = 0; - // Use g_timeout_add to make sure test_async_apis finishes even if async_functions is empty. + /* Use g_timeout_add to make sure test_async_apis finishes even if + * async_functions is empty. + */ if (index >= G_N_ELEMENTS (async_functions)) g_timeout_add (1, test_async_apis_finish, NULL); else diff --git a/src/tests/ibus-keypress.c b/src/tests/ibus-keypress.c index 3486523..1792022 100644 --- a/src/tests/ibus-keypress.c +++ b/src/tests/ibus-keypress.c @@ -173,7 +173,7 @@ set_engine_cb (GObject *object, IBusBus *bus = IBUS_BUS (object); GtkWidget *entry = GTK_WIDGET (data); GdkDisplay *display; - Display *xdisplay; + Display *xdisplay = NULL; GError *error = NULL; int i, j; diff --git a/src/tests/runtest b/src/tests/runtest index d7f96ea..ab39e9f 100755 --- a/src/tests/runtest +++ b/src/tests/runtest @@ -22,6 +22,7 @@ : ${builddir:=.} : ${srcdir:=.} : ${DISABLE_GUI_TESTS:=''} +: ${DISABLE_DAEMONIZE_IN_TESTS:=''} BUS_REQUIRED_TESTS=" ibus-bus @@ -162,16 +163,25 @@ run_test_case() export GSETTINGS_SCHEMA_DIR=$PWD # Start ibus-daemon. - ../$top_builddir/bus/ibus-daemon \ - --daemonize \ - --cache=none \ - --panel=disable \ - --emoji-extension=disable \ - --config=default \ - --verbose; + DAEMON_ARGS=' + --cache=none + --panel=disable + --emoji-extension=disable + --config=default + --verbose + ' + if test x"$DISABLE_DAEMONIZE_IN_TESTS" = x ; then + ../$top_builddir/bus/ibus-daemon \ + $DAEMON_ARGS --daemonize; + else + ../$top_builddir/bus/ibus-daemon \ + $DAEMON_ARGS & + fi # Wait until all necessary components are up. sleep 1 + + export GTK_IM_MODULE=ibus fi "../$tst" ${1+"$@"} diff --git a/ui/gtk3/emojier.vala b/ui/gtk3/emojier.vala index 85dcdce..e23ef88 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( @@ -283,7 +272,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 @@ -331,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( @@ -367,23 +356,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); @@ -398,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(); } @@ -440,13 +406,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); + } } @@ -1655,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(); @@ -1776,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; @@ -1787,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; } @@ -1802,18 +1749,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) @@ -1876,20 +1811,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); } @@ -1921,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; @@ -1937,28 +1858,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, }; @@ -2006,7 +1905,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 == "") { @@ -2241,10 +2148,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, @@ -2285,13 +2189,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()) @@ -2346,43 +2243,14 @@ 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.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(); @@ -2432,10 +2300,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) { @@ -2466,27 +2330,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) { @@ -2499,19 +2342,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; } @@ -2591,7 +2426,6 @@ public class IBusEmojier : Gtk.ApplicationWindow { uint32 timestamp = event.get_time(); present_with_time(timestamp); - m_entry.set_activates_default(true); } diff --git a/ui/gtk3/emojierapp.vala b/ui/gtk3/emojierapp.vala index 787d448..fab99d9 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 95115b1..cfedb2d 100644 --- a/ui/gtk3/panelbinding.vala +++ b/ui/gtk3/panelbinding.vala @@ -442,13 +442,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(); @@ -477,7 +483,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; } @@ -543,16 +549,29 @@ 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 - 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; } @@ -694,15 +713,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(); @@ -729,7 +743,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(); } @@ -770,7 +784,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(); } } @@ -804,8 +819,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(); @@ -894,6 +919,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(); @@ -974,14 +1005,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; } @@ -1023,9 +1048,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(); @@ -1043,17 +1069,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); + } } diff --git a/util/IMdkit/FrameMgr.c b/util/IMdkit/FrameMgr.c index 084b881..0e91b78 100644 --- a/util/IMdkit/FrameMgr.c +++ b/util/IMdkit/FrameMgr.c @@ -1414,6 +1414,7 @@ static int FrameInstGetSize (FrameInst fi) break; } /*endswitch*/ + assert (i >= 0); i = _FrameInstIncrement (fi->template, i); } /*endwhile*/