summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntónio Fernandes <antoniof@gnome.org>2021-08-07 13:09:31 +0100
committerAntónio Fernandes <antoniof@gnome.org>2021-08-16 10:14:03 +0100
commita4ca28dcd12f7c034993481c3c8f8d9122aa6e53 (patch)
tree184a659721e45634db937a648aa4dabcc4f5583c
parent30142f2ce660d1409689cc889d9c13fcc3427b3a (diff)
downloadnautilus-a4ca28dcd12f7c034993481c3c8f8d9122aa6e53.tar.gz
location-entry: Use event controller for key events
Preparing for GTK4, where the ::event signal will be gone.
-rw-r--r--src/nautilus-location-entry.c65
1 files changed, 21 insertions, 44 deletions
diff --git a/src/nautilus-location-entry.c b/src/nautilus-location-entry.c
index 3d1bbe997..cce5c3d3e 100644
--- a/src/nautilus-location-entry.c
+++ b/src/nautilus-location-entry.c
@@ -75,6 +75,8 @@ typedef struct _NautilusLocationEntryPrivate
gchar *special_text;
NautilusLocationEntryAction secondary_action;
+ GtkEventController *controller;
+
GtkEntryCompletion *completion;
GtkListStore *completions_store;
GtkCellRenderer *completion_cell;
@@ -527,6 +529,8 @@ finalize (GObject *object)
g_clear_object (&priv->completion);
g_clear_object (&priv->completions_store);
+ g_clear_object (&priv->controller);
+
G_OBJECT_CLASS (nautilus_location_entry_parent_class)->finalize (object);
}
@@ -626,27 +630,18 @@ nautilus_location_entry_icon_release (GtkEntry *gentry,
}
static gboolean
-nautilus_location_entry_on_event (GtkWidget *widget,
- GdkEvent *event)
+nautilus_location_entry_key_pressed (GtkEventControllerKey *controller,
+ unsigned int keyval,
+ unsigned int keycode,
+ GdkModifierType state,
+ gpointer user_data)
{
- GtkWidgetClass *parent_widget_class;
- NautilusLocationEntry *entry;
- NautilusLocationEntryPrivate *priv;
+ GtkWidget *widget;
GtkEditable *editable;
gboolean selected;
- guint keyval;
- GdkModifierType state;
- gboolean handled;
- parent_widget_class = GTK_WIDGET_CLASS (nautilus_location_entry_parent_class);
- if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
- {
- return parent_widget_class->event (widget, event);
- }
-
- entry = NAUTILUS_LOCATION_ENTRY (widget);
- priv = nautilus_location_entry_get_instance_private (entry);
+ widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller));
editable = GTK_EDITABLE (widget);
selected = gtk_editable_get_selection_bounds (editable, NULL, NULL);
@@ -655,15 +650,6 @@ nautilus_location_entry_on_event (GtkWidget *widget,
return GDK_EVENT_PROPAGATE;
}
- if (G_UNLIKELY (!gdk_event_get_keyval (event, &keyval)))
- {
- g_return_val_if_reached (GDK_EVENT_PROPAGATE);
- }
- if (G_UNLIKELY (!gdk_event_get_state (event, &state)))
- {
- g_return_val_if_reached (GDK_EVENT_PROPAGATE);
- }
-
/* The location bar entry wants TAB to work kind of
* like it does in the shell for command completion,
* so if we get a tab and there's a selection, we
@@ -681,7 +667,7 @@ nautilus_location_entry_on_event (GtkWidget *widget,
}
else
{
- gtk_widget_error_bell (GTK_WIDGET (entry));
+ gtk_widget_error_bell (widget);
}
return GDK_EVENT_STOP;
@@ -693,23 +679,6 @@ nautilus_location_entry_on_event (GtkWidget *widget,
set_position_and_selection_to_end (editable);
}
- /* GTK+ 4 TODO: Calling the event vfunc is not enough, we need the entry
- * to handle the key press and insert the text first.
- *
- * Chaining up here is required either way, since the code below
- * used to be in the handler for ::event-after, which is no longer a thing.
- */
- handled = parent_widget_class->key_press_event (widget, (GdkEventKey *) event);
-
-
- if (keyval == GDK_KEY_Down || keyval == GDK_KEY_Up)
- {
- /* Ignore up/down arrow keys. These are used by the entry completion,
- * and if we modify the completion store, navigation through the list
- * will be interrupted. */
- return GDK_EVENT_PROPAGATE;
- }
-
return GDK_EVENT_PROPAGATE;
}
@@ -809,7 +778,6 @@ nautilus_location_entry_class_init (NautilusLocationEntryClass *class)
widget_class = GTK_WIDGET_CLASS (class);
widget_class->destroy = destroy;
- widget_class->event = nautilus_location_entry_on_event;
gobject_class = G_OBJECT_CLASS (class);
gobject_class->finalize = finalize;
@@ -949,6 +917,15 @@ nautilus_location_entry_init (NautilusLocationEntry *entry)
g_signal_connect_object (entry, "changed",
G_CALLBACK (editable_changed_callback), entry, 0);
+ priv->controller = gtk_event_controller_key_new (GTK_WIDGET (entry));
+ /* In GTK3, the Tab key binding (for focus change) happens in the bubble
+ * phase, and we want to stop that from happening. After porting to GTK4
+ * we need to check whether this is still correct. */
+ gtk_event_controller_set_propagation_phase (priv->controller, GTK_PHASE_BUBBLE);
+ g_signal_connect (priv->controller,
+ "key-pressed",
+ G_CALLBACK (nautilus_location_entry_key_pressed),
+ NULL);
g_signal_connect_after (entry,
"insert-text",
G_CALLBACK (on_after_insert_text),