From 6277f2fccc3b7da589a34a410a3699000404aa05 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 27 Apr 2019 15:59:45 +0000 Subject: [PATCH] fontchooser: Fix type-to-search The key capture was interfering with other entries in the dialog, so be smarter about when we want to capture keys and when we don't. Closes: https://gitlab.gnome.org/GNOME/gtk/issues/1842 --- gtk/gtkfontchooserwidget.c | 64 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 3 deletions(-) diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c index 4f9954fd64..b5cc584c77 100644 --- a/gtk/gtkfontchooserwidget.c +++ b/gtk/gtkfontchooserwidget.c @@ -55,6 +55,7 @@ #include "gtkcombobox.h" #include "gtkgesturemultipress.h" #include "gtkeventcontrollerscroll.h" +#include "gtkroot.h" #if defined(HAVE_HARFBUZZ) && defined(HAVE_PANGOFT) #include @@ -617,6 +618,35 @@ rows_changed_cb (GtkFontChooserWidget *fontchooser) gtk_stack_set_visible_child_name (GTK_STACK (priv->list_stack), page); } +static void +update_key_capture (GtkWidget *chooser) +{ + GtkFontChooserWidgetPrivate *priv; + GtkWidget *capture_widget; + + priv = gtk_font_chooser_widget_get_instance_private (GTK_FONT_CHOOSER_WIDGET (chooser)); + + if (gtk_widget_get_mapped (chooser) && + g_str_equal (gtk_stack_get_visible_child_name (GTK_STACK (priv->stack)), "list")) + { + GtkWidget *toplevel; + GtkWidget *focus; + + toplevel = gtk_widget_get_toplevel (chooser); + focus = gtk_root_get_focus (GTK_ROOT (toplevel)); + + if (GTK_IS_EDITABLE (focus) && focus != priv->search_entry) + capture_widget = NULL; + else + capture_widget = chooser; + } + else + capture_widget = NULL; + + gtk_search_entry_set_key_capture_widget (GTK_SEARCH_ENTRY (priv->search_entry), + capture_widget); +} + static void gtk_font_chooser_widget_map (GtkWidget *widget) { @@ -628,6 +658,34 @@ gtk_font_chooser_widget_map (GtkWidget *widget) g_simple_action_set_state (G_SIMPLE_ACTION (priv->tweak_action), g_variant_new_boolean (FALSE)); GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->map (widget); + + update_key_capture (widget); +} + +static void +gtk_font_chooser_widget_unmap (GtkWidget *widget) +{ + update_key_capture (widget); + + GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->unmap (widget); +} + +static void +gtk_font_chooser_widget_root (GtkWidget *widget) +{ + GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->root (widget); + + g_signal_connect_swapped (gtk_widget_get_root (widget), "notify::focus-widget", + G_CALLBACK (update_key_capture), widget); + } + +static void +gtk_font_chooser_widget_unroot (GtkWidget *widget) +{ + g_signal_handlers_disconnect_by_func (gtk_widget_get_root (widget), + update_key_capture, widget); + + GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->unroot (widget); } static void @@ -688,7 +746,10 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass) widget_class->display_changed = gtk_font_chooser_widget_display_changed; widget_class->measure = gtk_font_chooser_widget_measure; widget_class->size_allocate = gtk_font_chooser_widget_size_allocate; + widget_class->root = gtk_font_chooser_widget_root; + widget_class->unroot = gtk_font_chooser_widget_unroot; widget_class->map = gtk_font_chooser_widget_map; + widget_class->unmap = gtk_font_chooser_widget_unmap; gobject_class->finalize = gtk_font_chooser_widget_finalize; gobject_class->dispose = gtk_font_chooser_widget_dispose; @@ -876,9 +937,6 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser) gtk_font_chooser_widget_set_cell_size (fontchooser); gtk_font_chooser_widget_take_font_desc (fontchooser, NULL); - - gtk_search_entry_set_key_capture_widget (GTK_SEARCH_ENTRY (priv->search_entry), - GTK_WIDGET (fontchooser)); } /**