[gtk/wip/ebassi/shortcut: 1/5] filechooser: Trigger the location popup via bindings
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/ebassi/shortcut: 1/5] filechooser: Trigger the location popup via bindings
- Date: Thu, 6 Feb 2020 18:37:44 +0000 (UTC)
commit 9ff35b38993580225ed7cc91dd27c18a57aa9316
Author: Benjamin Otte <otte redhat com>
Date: Sun Aug 26 18:39:51 2018 +0200
filechooser: Trigger the location popup via bindings
Simplifies code quite a bit.
gtk/gtkfilechooserwidget.c | 138 +++++++----------------------------------
gtk/ui/gtkfilechooserwidget.ui | 5 --
2 files changed, 24 insertions(+), 119 deletions(-)
---
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c
index 23e26c5938..f306266ffb 100644
--- a/gtk/gtkfilechooserwidget.c
+++ b/gtk/gtkfilechooserwidget.c
@@ -1287,126 +1287,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)
+ if (priv->action != GTK_FILE_CHOOSER_ACTION_OPEN &&
+ priv->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
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 ())
- && !(priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER ||
- priv->action == GTK_FILE_CHOOSER_ACTION_CREATE_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 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
@@ -8250,6 +8146,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,
@@ -8342,8 +8254,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 a1ee4f8573..9c56994788 100644
--- a/gtk/ui/gtkfilechooserwidget.ui
+++ b/gtk/ui/gtkfilechooserwidget.ui
@@ -368,11 +368,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>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]