diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c
index e2630abb92..bd3760d8bf 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
@@ -611,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,
@@ -693,6 +698,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), "");
}
@@ -761,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/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
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 @@