From 66e0f8505e9d5ed17566e69127589b7c992254fd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 24 Aug 2020 18:31:08 -0400 Subject: [PATCH 1/2] emojichooser: Grab focus on map This is the right thing to do, since we have a visible entry and want text input to go there. --- gtk/gtkemojichooser.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/gtk/gtkemojichooser.c b/gtk/gtkemojichooser.c index 6275a088f0..62a8e19f5a 100644 --- a/gtk/gtkemojichooser.c +++ b/gtk/gtkemojichooser.c @@ -999,6 +999,16 @@ keynav_failed (GtkWidget *box, return FALSE; } +static void +gtk_emoji_chooser_map (GtkWidget *widget) +{ + GtkEmojiChooser *chooser = GTK_EMOJI_CHOOSER (widget); + + GTK_WIDGET_CLASS (gtk_emoji_chooser_parent_class)->map (widget); + + gtk_widget_grab_focus (chooser->search_entry); +} + static void gtk_emoji_chooser_class_init (GtkEmojiChooserClass *klass) { @@ -1007,6 +1017,7 @@ gtk_emoji_chooser_class_init (GtkEmojiChooserClass *klass) object_class->finalize = gtk_emoji_chooser_finalize; widget_class->show = gtk_emoji_chooser_show; + widget_class->map = gtk_emoji_chooser_map; /** * GtkEmojiChooser::emoji-picked: From 43ec96684a5cc6d9955002c52345a86cffb449bd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 24 Aug 2020 18:31:35 -0400 Subject: [PATCH 2/2] text: Properly handle focus moving to a descendent To discriminate between is-focus and contains-focus, we need to use notify::is-focus. This makes sure we don't get annoying warnings when the blink_cb gets triggered on an unfocused entry. Fixes: #2979 --- gtk/gtktext.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/gtk/gtktext.c b/gtk/gtktext.c index 873dd1df64..a87f21b798 100644 --- a/gtk/gtktext.c +++ b/gtk/gtktext.c @@ -326,6 +326,9 @@ static void gtk_text_snapshot (GtkWidget *widget, GtkSnapshot *snapshot); static void gtk_text_focus_in (GtkWidget *widget); static void gtk_text_focus_out (GtkWidget *widget); +static void gtk_text_focus_changed (GtkEventControllerFocus *focus, + GParamSpec *pspec, + GtkWidget *widget); static gboolean gtk_text_grab_focus (GtkWidget *widget); static void gtk_text_css_changed (GtkWidget *widget, GtkCssStyleChange *change); @@ -1894,10 +1897,8 @@ gtk_text_init (GtkText *self) controller = gtk_event_controller_focus_new (); gtk_event_controller_set_name (controller, "gtk-text-focus-controller"); - g_signal_connect_swapped (controller, "enter", - G_CALLBACK (gtk_text_focus_in), self); - g_signal_connect_swapped (controller, "leave", - G_CALLBACK (gtk_text_focus_out), self); + g_signal_connect (controller, "notify::is-focus", + G_CALLBACK (gtk_text_focus_changed), self); gtk_widget_add_controller (GTK_WIDGET (self), controller); widget_node = gtk_widget_get_css_node (GTK_WIDGET (self)); @@ -3196,6 +3197,17 @@ gtk_text_focus_out (GtkWidget *widget) gtk_text_check_cursor_blink (self); } +static void +gtk_text_focus_changed (GtkEventControllerFocus *controller, + GParamSpec *pspec, + GtkWidget *widget) +{ + if (gtk_event_controller_focus_is_focus (controller)) + gtk_text_focus_in (widget); + else + gtk_text_focus_out (widget); +} + static gboolean gtk_text_grab_focus (GtkWidget *widget) {