From 7b6f652630aff73b61b59ab1849b19df44695883 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 4 May 2019 16:19:43 +0000 Subject: [PATCH 1/3] emoji chooser: Fix handling of no recent Emoji If the recent section is empty, we want to hide it, make its button insensitive, and select the next section, initially. This was not working properly, since nothing was ever setting the section box to invisible. --- gtk/gtkemojichooser.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index e2630abb92..0f8763c4f0 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -153,11 +153,9 @@ populate_recent_section (GtkEmojiChooser *chooser) empty = FALSE; } - if (!empty) - { - gtk_widget_show (chooser->recent.box); - gtk_widget_set_sensitive (chooser->recent.button, TRUE); - } + gtk_widget_set_visible (chooser->recent.box, !empty); + gtk_widget_set_sensitive (chooser->recent.button, !empty); + g_variant_unref (variant); } @@ -458,15 +456,12 @@ populate_emoji_chooser (gpointer data) return G_SOURCE_CONTINUE; } - /* We scroll to the top on show, so check the right button for the 1st time */ - gtk_widget_set_state_flags (chooser->recent.button, GTK_STATE_FLAG_CHECKED, FALSE); - g_variant_iter_free (chooser->iter); chooser->iter = NULL; chooser->box = NULL; chooser->populate_idle = 0; - return G_SOURCE_REMOVE; + return G_SOURCE_REMOVE; } static void @@ -496,6 +491,9 @@ adj_value_changed (GtkAdjustment *adj, EmojiSection const *section = sections[i]; GtkAllocation alloc; + if (!gtk_widget_get_visible (section->box)) + continue; + if (section->heading) gtk_widget_get_allocation (section->heading, &alloc); else @@ -693,6 +691,7 @@ gtk_emoji_chooser_show (GtkWidget *widget) adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (chooser->scrolled_window)); gtk_adjustment_set_value (adj, 0); + adj_value_changed (adj, chooser); gtk_editable_set_text (GTK_EDITABLE (chooser->search_entry), ""); } From 6fe203d0e207acfcaf5845098386ba9d690dac74 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 4 May 2019 16:55:52 +0000 Subject: [PATCH 2/3] emoji chooser: Make Escape work again Escape is expected to close the Emoji chooser. --- gtk/gtkemojichooser.c | 8 ++++++++ gtk/ui/gtkemojichooser.ui | 1 + 2 files changed, 9 insertions(+) diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index 0f8763c4f0..bd3760d8bf 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -609,6 +609,13 @@ search_changed (GtkEntry *entry, update_headings (chooser); } +static void +stop_search (GtkEntry *entry, + gpointer data) +{ + gtk_popover_popdown (GTK_POPOVER (data)); +} + static void setup_section (GtkEmojiChooser *chooser, EmojiSection *section, @@ -760,6 +767,7 @@ gtk_emoji_chooser_class_init (GtkEmojiChooserClass *klass) gtk_widget_class_bind_template_callback (widget_class, emoji_activated); gtk_widget_class_bind_template_callback (widget_class, search_changed); + gtk_widget_class_bind_template_callback (widget_class, stop_search); gtk_widget_class_bind_template_callback (widget_class, pressed_cb); gtk_widget_class_bind_template_callback (widget_class, long_pressed_cb); } diff --git a/gtk/ui/gtkemojichooser.ui b/gtk/ui/gtkemojichooser.ui index 1f7a2e9485..e32d977526 100644 --- a/gtk/ui/gtkemojichooser.ui +++ b/gtk/ui/gtkemojichooser.ui @@ -10,6 +10,7 @@ + From 44b0a893fcfe9da97849ff0544742751a903d963 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 4 May 2019 18:51:27 +0000 Subject: [PATCH 3/3] entry: Drop our own Emoji chooser We were using one Emoji chooser when triggered via the context menu, and another one when triggered via the icon. Change things to always use the same Emoji chooser instance. --- gtk/gtkentry.c | 35 ++++++----------------------------- 1 file changed, 6 insertions(+), 29 deletions(-) diff --git a/gtk/gtkentry.c b/gtk/gtkentry.c index 9015c1fb66..1193d3e8df 100644 --- a/gtk/gtkentry.c +++ b/gtk/gtkentry.c @@ -3447,42 +3447,19 @@ gtk_entry_enter_text (GtkEntry *entry, gtk_text_enter_text (GTK_TEXT (priv->text), text); } -static void -gtk_entry_insert_emoji (GtkEntry *entry) -{ - GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); - GtkWidget *chooser; - GdkRectangle rect; - - if (gtk_widget_get_ancestor (GTK_WIDGET (entry), GTK_TYPE_EMOJI_CHOOSER) != NULL) - return; - - chooser = GTK_WIDGET (g_object_get_data (G_OBJECT (entry), "gtk-emoji-chooser")); - if (!chooser) - { - chooser = gtk_emoji_chooser_new (); - g_object_set_data (G_OBJECT (entry), "gtk-emoji-chooser", chooser); - - gtk_popover_set_relative_to (GTK_POPOVER (chooser), GTK_WIDGET (entry)); - if (priv->show_emoji_icon) - { - gtk_entry_get_icon_area (entry, GTK_ENTRY_ICON_SECONDARY, &rect); - gtk_popover_set_pointing_to (GTK_POPOVER (chooser), &rect); - } - g_signal_connect_swapped (chooser, "emoji-picked", G_CALLBACK (gtk_entry_enter_text), entry); - } - - gtk_popover_popup (GTK_POPOVER (chooser)); -} - static void pick_emoji (GtkEntry *entry, int icon, GdkEvent *event, gpointer data) { + GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry); + + if (gtk_widget_get_ancestor (GTK_WIDGET (entry), GTK_TYPE_EMOJI_CHOOSER) != NULL) + return; + if (icon == GTK_ENTRY_ICON_SECONDARY) - gtk_entry_insert_emoji (entry); + g_signal_emit_by_name (priv->text, "insert-emoji"); } static void