summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2018-08-26 18:39:51 +0200
committerMatthias Clasen <mclasen@redhat.com>2020-03-22 11:14:07 -0400
commit211720d107e90cd3f733df2c4fe2611e4a4ca2f7 (patch)
treebe52407cb6f86d7b06add9c6cb6d4170ab477a34
parentb7fcf6c2464dfbc8c26d1d9b1e67a2f3046c4be3 (diff)
downloadgtk+-211720d107e90cd3f733df2c4fe2611e4a4ca2f7.tar.gz
filechooser: Trigger the location popup via bindings
Simplifies code quite a bit.
-rw-r--r--gtk/gtkfilechooserwidget.c137
-rw-r--r--gtk/ui/gtkfilechooserwidget.ui10
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>