diff options
author | Matthias Clasen <mclasen@redhat.com> | 2018-01-25 08:27:43 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2018-04-05 19:26:53 +0200 |
commit | 19bd57ed1f4be5aca627c600f8bc54d3dec3a52f (patch) | |
tree | cde86a37b0bf6a9eaa230fd01a301630f8cb2113 | |
parent | b1eaeebe7d30e13707859f8e6b85d4bb85879808 (diff) | |
download | gtk+-19bd57ed1f4be5aca627c600f8bc54d3dec3a52f.tar.gz |
file chooser: Use a key event controller
We want to get rid of ::key-press-event.
-rw-r--r-- | gtk/gtkfilechooserwidget.c | 58 | ||||
-rw-r--r-- | gtk/ui/gtkfilechooserwidget.ui | 1 |
2 files changed, 35 insertions, 24 deletions
diff --git a/gtk/gtkfilechooserwidget.c b/gtk/gtkfilechooserwidget.c index 58ec9a1e64..169762d008 100644 --- a/gtk/gtkfilechooserwidget.c +++ b/gtk/gtkfilechooserwidget.c @@ -78,6 +78,7 @@ #include "gtkmodelbutton.h" #include "gtkgesturelongpress.h" #include "gtkgesturemultipress.h" +#include "gtkeventcontrollerkey.h" #include "gtkdebug.h" #include "gtkfilechoosererrorstackprivate.h" @@ -252,6 +253,7 @@ struct _GtkFileChooserWidgetPrivate { GtkGesture *long_press_gesture; GtkGesture *multipress_gesture; + GtkEventController *key_controller; GtkFileSystemModel *browse_files_model; char *browse_files_last_selected_name; @@ -1264,12 +1266,12 @@ places_sidebar_show_error_message_cb (GtkPlacesSidebar *sidebar, } static gboolean -key_is_left_or_right (GdkEventKey *event) +key_is_left_or_right (const GdkEvent *event) { guint modifiers, keyval, state; - if (!gdk_event_get_keyval ((GdkEvent *) event, &keyval) || - !gdk_event_get_state ((GdkEvent *) event, &state)) + if (!gdk_event_get_keyval (event, &keyval) || + !gdk_event_get_state (event, &state)) return FALSE; modifiers = gtk_accelerator_get_default_mod_mask (); @@ -1283,14 +1285,12 @@ key_is_left_or_right (GdkEventKey *event) static gboolean should_trigger_location_entry (GtkFileChooserWidget *impl, - GdkEventKey *event) + guint keyval, + GdkModifierType state) { GdkModifierType no_text_input_mask; - guint keyval, state; - if (impl->priv->operation_mode == OPERATION_MODE_SEARCH || - !gdk_event_get_keyval ((GdkEvent *) event, &keyval) || - !gdk_event_get_state ((GdkEvent *) event, &state)) + if (impl->priv->operation_mode == OPERATION_MODE_SEARCH) return FALSE; no_text_input_mask = @@ -1313,15 +1313,19 @@ should_trigger_location_entry (GtkFileChooserWidget *impl, * pressed. */ static gboolean -browse_files_key_press_event_cb (GtkWidget *widget, - GdkEventKey *event, - gpointer data) +key_press_cb (GtkEventController *controller, + guint keyval, + guint keycode, + GdkModifierType state, + gpointer data) { GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data; GtkFileChooserWidgetPrivate *priv = impl->priv; - guint keyval, state; + const GdkEvent *event; + + event = gtk_get_current_event (); - if (should_trigger_location_entry (impl, event) && + if (should_trigger_location_entry (impl, keyval, state) && (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN || priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)) { @@ -1329,17 +1333,16 @@ browse_files_key_press_event_cb (GtkWidget *widget, gdk_event_get_string ((GdkEvent *)event, &string); location_popup_handler (impl, string); - return TRUE; + return GDK_EVENT_STOP; } if (key_is_left_or_right (event)) { if (gtk_widget_child_focus (priv->places_sidebar, GTK_DIR_LEFT)) - return TRUE; + return GDK_EVENT_STOP; } - if (!gdk_event_get_keyval ((GdkEvent *) event, &keyval) || - !gdk_event_get_state ((GdkEvent *) event, &state)) + if (!gdk_event_get_state (event, &state)) return GDK_EVENT_PROPAGATE; if ((keyval == GDK_KEY_Return @@ -1351,6 +1354,7 @@ browse_files_key_press_event_cb (GtkWidget *widget, && !(priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER || priv->action == GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER)) { + GtkWidget *widget = GTK_WIDGET (impl); GtkWindow *window; window = get_toplevel (widget); @@ -1366,7 +1370,7 @@ browse_files_key_press_event_cb (GtkWidget *widget, { gtk_window_activate_default (window); - return TRUE; + return GDK_EVENT_STOP; } } } @@ -1375,10 +1379,10 @@ browse_files_key_press_event_cb (GtkWidget *widget, priv->operation_mode == OPERATION_MODE_SEARCH) { gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (priv->search_entry), (GdkEvent *)event); - return TRUE; + return GDK_EVENT_STOP; } - return FALSE; + return GDK_EVENT_PROPAGATE; } static gboolean @@ -1387,8 +1391,12 @@ gtk_file_chooser_widget_key_press_event (GtkWidget *widget, { GtkFileChooserWidget *impl = (GtkFileChooserWidget *) widget; GtkFileChooserWidgetPrivate *priv = impl->priv; + guint keyval, state; - if (should_trigger_location_entry (impl, event)) + gdk_event_get_keyval ((GdkEvent *)event, &keyval); + gdk_event_get_state ((GdkEvent *)event, &state); + + if (should_trigger_location_entry (impl, keyval, state)) { if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN || priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) @@ -3546,6 +3554,7 @@ gtk_file_chooser_widget_dispose (GObject *object) g_clear_object (&priv->long_press_gesture); g_clear_object (&priv->multipress_gesture); + g_clear_object (&priv->key_controller); G_OBJECT_CLASS (gtk_file_chooser_widget_parent_class)->dispose (object); } @@ -8378,7 +8387,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class) gtk_widget_class_bind_template_child_private (widget_class, GtkFileChooserWidget, box); /* And a *lot* of callbacks to bind ... */ - gtk_widget_class_bind_template_callback (widget_class, browse_files_key_press_event_cb); gtk_widget_class_bind_template_callback (widget_class, file_list_drag_drop_cb); gtk_widget_class_bind_template_callback (widget_class, file_list_drag_data_received_cb); gtk_widget_class_bind_template_callback (widget_class, list_popup_menu_cb); @@ -8548,8 +8556,12 @@ gtk_file_chooser_widget_init (GtkFileChooserWidget *impl) g_signal_connect (priv->multipress_gesture, "pressed", G_CALLBACK (multi_press_cb), impl); + priv->key_controller = gtk_event_controller_key_new (priv->browse_files_tree_view); + g_signal_connect (priv->key_controller, "key-pressed", + G_CALLBACK (key_press_cb), impl); + /* Setup various attributes and callbacks in the UI - * which cannot be done with GtkBuilder. + * which cannot be done with GtkBuilder */ post_process_ui (impl); diff --git a/gtk/ui/gtkfilechooserwidget.ui b/gtk/ui/gtkfilechooserwidget.ui index 5186a7211b..a034d8b67e 100644 --- a/gtk/ui/gtkfilechooserwidget.ui +++ b/gtk/ui/gtkfilechooserwidget.ui @@ -148,7 +148,6 @@ <signal name="drag-begin" handler="file_list_drag_begin_cb" swapped="no"/> <signal name="drag-motion" handler="file_list_drag_motion_cb" swapped="no"/> <signal name="drag-end" handler="file_list_drag_end_cb" swapped="no"/> - <signal name="key-press-event" handler="browse_files_key_press_event_cb" swapped="no"/> <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"/> |