diff options
author | Benjamin Otte <otte@redhat.com> | 2018-08-26 18:39:51 +0200 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2020-03-22 11:14:07 -0400 |
commit | 211720d107e90cd3f733df2c4fe2611e4a4ca2f7 (patch) | |
tree | be52407cb6f86d7b06add9c6cb6d4170ab477a34 | |
parent | b7fcf6c2464dfbc8c26d1d9b1e67a2f3046c4be3 (diff) | |
download | gtk+-211720d107e90cd3f733df2c4fe2611e4a4ca2f7.tar.gz |
filechooser: Trigger the location popup via bindings
Simplifies code quite a bit.
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 137 | ||||
-rw-r--r-- | gtk/ui/gtkfilechooserwidget.ui | 10 |
2 files changed, 24 insertions, 123 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index f2dcd32766..163fc25dbd 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -1189,125 +1189,22 @@ places_sidebar_show_error_message_cb (GtkPlacesSidebar *sidebar, } static gboolean -should_trigger_location_entry (GtkFileChooserWidget *impl, - guint keyval, - GdkModifierType state, - const char **string) +trigger_location_entry (GtkWidget *widget, + GVariant *arguments, + gpointer unused) { + GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (widget); GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl); - GdkModifierType no_text_input_mask; if (priv->operation_mode == OPERATION_MODE_SEARCH) return FALSE; - no_text_input_mask = - gtk_widget_get_modifier_mask (GTK_WIDGET (impl), GDK_MODIFIER_INTENT_NO_TEXT_INPUT); - - if (state & no_text_input_mask) - return FALSE; - - switch (keyval) - { - case GDK_KEY_slash: - case GDK_KEY_KP_Divide: - *string = "/"; - return TRUE; - - case GDK_KEY_period: - *string = "."; - return TRUE; - - case GDK_KEY_asciitilde: - *string = "~"; - return TRUE; - - default: - return FALSE; - } -} - -/* Handles key press events on the file list, so that we can trap Enter to - * activate the default button on our own. Also, checks to see if “/” has been - * pressed. - */ -static gboolean -treeview_key_press_cb (GtkEventControllerKey *controller, - guint keyval, - guint keycode, - GdkModifierType state, - gpointer data) -{ - GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data; - GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl); - const char *string; - - if (should_trigger_location_entry (impl, keyval, state, &string) && - (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN || - priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)) - { - location_popup_handler (impl, string); - return GDK_EVENT_STOP; - } - - if ((keyval == GDK_KEY_Return || - keyval == GDK_KEY_ISO_Enter || - keyval == GDK_KEY_KP_Enter || - keyval == GDK_KEY_space || - keyval == GDK_KEY_KP_Space) && - !(state & gtk_accelerator_get_default_mod_mask ()) && + if (priv->action != GTK_FILE_CHOOSER_ACTION_OPEN && priv->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) - { - gtk_widget_activate_default (GTK_WIDGET (impl)); - return GDK_EVENT_STOP; - } - - if (keyval == GDK_KEY_Escape && - priv->operation_mode == OPERATION_MODE_SEARCH) - { - return gtk_event_controller_key_forward (controller, - GTK_WIDGET (gtk_search_entry_get_text_widget (GTK_SEARCH_ENTRY (priv->search_entry)))); - } - - return GDK_EVENT_PROPAGATE; -} - -static gboolean -widget_key_press_cb (GtkEventControllerKey *controller, - guint keyval, - guint keycode, - GdkModifierType state, - gpointer data) -{ - GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data; - GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl); - gboolean handled = FALSE; - const char *string; - - if (should_trigger_location_entry (impl, keyval, state, &string)) - { - if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN || - priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) - { - location_popup_handler (impl, string); - handled = TRUE; - } - } - else - { - priv->starting_search = TRUE; - if (gtk_event_controller_key_forward (controller, priv->search_entry)) - { - gtk_widget_grab_focus (priv->search_entry); - - if (priv->operation_mode != OPERATION_MODE_SEARCH && - priv->starting_search) - operation_mode_set (impl, OPERATION_MODE_SEARCH); - - handled = TRUE; - } - } + return FALSE; - return handled; + location_popup_handler (impl, g_variant_get_string (arguments, NULL)); + return TRUE; } /* Callback used from gtk_tree_selection_selected_foreach(); adds a bookmark for @@ -7820,6 +7717,22 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) GDK_KEY_p, GDK_MOD1_MASK, "places-shortcut", NULL); + gtk_widget_class_add_binding (widget_class, + GDK_KEY_slash, 0, + trigger_location_entry, + "s", "/"); + gtk_widget_class_add_binding (widget_class, + GDK_KEY_KP_Divide, 0, + trigger_location_entry, + "s", "/"); + gtk_widget_class_add_binding (widget_class, + GDK_KEY_period, 0, + trigger_location_entry, + "s", "."); + gtk_widget_class_add_binding (widget_class, + GDK_KEY_asciitilde, 0, + trigger_location_entry, + "s", "~"); for (i = 0; i < G_N_ELEMENTS (quick_bookmark_keyvals); i++) gtk_widget_class_add_binding_signal (widget_class, @@ -7910,8 +7823,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) gtk_widget_class_bind_template_callback (widget_class, rename_file_end); gtk_widget_class_bind_template_callback (widget_class, click_cb); gtk_widget_class_bind_template_callback (widget_class, long_press_cb); - gtk_widget_class_bind_template_callback (widget_class, treeview_key_press_cb); - gtk_widget_class_bind_template_callback (widget_class, widget_key_press_cb); gtk_widget_class_set_css_name (widget_class, I_("filechooser")); diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui index ff7ad061fd..c8dbe7823a 100644 --- a/gtk/ui/gtkfilechooserwidget.ui +++ b/gtk/ui/gtkfilechooserwidget.ui @@ -160,11 +160,6 @@ <signal name="pressed" handler="click_cb" swapped="no"/> </object> </child> - <child> - <object class="GtkEventControllerKey"> - <signal name="key-pressed" handler="treeview_key_press_cb" swapped="no"/> - </object> - </child> <signal name="popup-menu" handler="list_popup_menu_cb" swapped="no"/> <signal name="query-tooltip" handler="file_list_query_tooltip_cb" swapped="no"/> <signal name="row-activated" handler="list_row_activated" swapped="no"/> @@ -368,11 +363,6 @@ </child> </object> </child> - <child> - <object class="GtkEventControllerKey"> - <signal name="key-pressed" handler="widget_key_press_cb" swapped="no"/> - </object> - </child> </template> <object class="GtkSizeGroup" id="browse_path_bar_size_group"> <property name="mode">vertical</property> |