[nautilus/wip/antoniof/gtk4-preparation-step-event-controllers: 4/28] list-view: Use event controllers for pointer and key events
- From: António Fernandes <antoniof src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [nautilus/wip/antoniof/gtk4-preparation-step-event-controllers: 4/28] list-view: Use event controllers for pointer and key events
- Date: Tue, 21 Dec 2021 15:52:48 +0000 (UTC)
commit ba8a241d1363ecf617005e49b1a1b532d14388ec
Author: Ernestas Kulik <ernestask gnome org>
Date: Tue Jul 10 15:05:50 2018 +0300
list-view: Use event controllers for pointer and key events
Rebased and ammended by António Fernandes <antoniof gnome org>
(Some style changes in the original have been extracted into
the next commit, for ease of review).
src/nautilus-list-view-private.h | 2 +
src/nautilus-list-view.c | 132 +++++++++++++++------------------------
2 files changed, 54 insertions(+), 80 deletions(-)
---
diff --git a/src/nautilus-list-view-private.h b/src/nautilus-list-view-private.h
index 9d4cbad42..c874c38f7 100644
--- a/src/nautilus-list-view-private.h
+++ b/src/nautilus-list-view-private.h
@@ -75,5 +75,7 @@ struct NautilusListViewDetails {
GtkGesture *tree_view_drag_gesture;
GtkGesture *tree_view_multi_press_gesture;
+ GtkEventController *motion_controller;
+ GtkEventController *key_controller;
};
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 1df7223b0..7a8fdbbd3 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -318,30 +318,24 @@ nautilus_list_view_did_not_drag (NautilusListView *view,
gtk_tree_path_free (path);
}
-static gboolean
-on_motion_notify (GtkWidget *widget,
- GdkEvent *event,
- gpointer callback_data)
+static void
+on_event_controller_motion_motion (GtkEventControllerMotion *controller,
+ double x,
+ double y,
+ gpointer user_data)
{
NautilusListView *view;
- gdouble x;
- gdouble y;
-
- view = NAUTILUS_LIST_VIEW (callback_data);
-
- /* Remove after switching to GTK+ 4. */
- if (gdk_event_get_window (event) != gtk_tree_view_get_bin_window (GTK_TREE_VIEW (widget)))
- {
- return GDK_EVENT_PROPAGATE;
- }
+ GtkWidget *widget;
- g_assert (gdk_event_get_coords (event, &x, &y));
+ view = user_data;
if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE)
{
GtkTreePath *old_hover_path;
+ widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller));
old_hover_path = view->details->hover_path;
+
gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
x, y,
&view->details->hover_path,
@@ -364,18 +358,15 @@ on_motion_notify (GtkWidget *widget,
gtk_tree_path_free (old_hover_path);
}
}
-
- return GDK_EVENT_PROPAGATE;
}
-static gboolean
-on_leave_notify (GtkWidget *widget,
- GdkEvent *event,
- gpointer callback_data)
+static void
+on_event_controller_motion_leave (GtkEventControllerMotion *controller,
+ gpointer user_data)
{
NautilusListView *view;
- view = NAUTILUS_LIST_VIEW (callback_data);
+ view = user_data;
if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE &&
view->details->hover_path != NULL)
@@ -383,30 +374,26 @@ on_leave_notify (GtkWidget *widget,
gtk_tree_path_free (view->details->hover_path);
view->details->hover_path = NULL;
}
-
- return GDK_EVENT_PROPAGATE;
}
-static gboolean
-on_enter_notify (GtkWidget *widget,
- GdkEvent *event,
- gpointer callback_data)
+static void
+on_event_controller_motion_enter (GtkEventControllerMotion *controller,
+ double x,
+ double y,
+ gpointer user_data)
{
NautilusListView *view;
+ GtkWidget *widget;
- view = NAUTILUS_LIST_VIEW (callback_data);
+ view = user_data;
if (get_click_policy () == NAUTILUS_CLICK_POLICY_SINGLE)
{
- gdouble x;
- gdouble y;
-
if (view->details->hover_path != NULL)
{
gtk_tree_path_free (view->details->hover_path);
}
-
- g_assert (gdk_event_get_coords (event, &x, &y));
+ widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller));
gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (widget),
x, y,
@@ -418,8 +405,6 @@ on_enter_notify (GtkWidget *widget,
gdk_window_set_cursor (gtk_widget_get_window (widget), hand_cursor);
}
}
-
- return GDK_EVENT_PROPAGATE;
}
static void
@@ -890,27 +875,23 @@ on_tree_view_multi_press_gesture_released (GtkGestureMultiPress *gesture,
}
static gboolean
-key_press_callback (GtkWidget *widget,
- GdkEvent *event,
- gpointer callback_data)
+on_event_controller_key_key_pressed (GtkEventControllerKey *controller,
+ unsigned int keyval,
+ unsigned int keycode,
+ GdkModifierType state,
+ gpointer user_data)
{
+ GtkWidget *widget;
NautilusFilesView *view;
GtkTreeView *tree_view;
- guint keyval;
- GdkModifierType state;
- view = NAUTILUS_FILES_VIEW (callback_data);
+ widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (controller));
+ view = NAUTILUS_FILES_VIEW (user_data);
tree_view = GTK_TREE_VIEW (widget);
NAUTILUS_LIST_VIEW (view)->details->last_event_button_x = -1;
NAUTILUS_LIST_VIEW (view)->details->last_event_button_y = -1;
- if (G_UNLIKELY (!gdk_event_get_keyval (event, &keyval)))
- {
- g_return_val_if_reached (GDK_EVENT_PROPAGATE);
- }
- gdk_event_get_state (event, &state);
-
if (keyval == GDK_KEY_F10)
{
if ((state & GDK_CONTROL_MASK) != 0)
@@ -991,36 +972,6 @@ key_press_callback (GtkWidget *widget,
return GDK_EVENT_PROPAGATE;
}
-static gboolean
-on_event (GtkWidget *widget,
- GdkEvent *event,
- gpointer user_data)
-{
- GdkEventType event_type;
-
- event_type = gdk_event_get_event_type (event);
-
- /* TODO: Replace motion events with motion controllers. */
- if (event_type == GDK_MOTION_NOTIFY)
- {
- return on_motion_notify (widget, event, user_data);
- }
- else if (event_type == GDK_ENTER_NOTIFY)
- {
- return on_enter_notify (widget, event, user_data);
- }
- else if (event_type == GDK_LEAVE_NOTIFY)
- {
- return on_leave_notify (widget, event, user_data);
- }
- else if (event_type == GDK_KEY_PRESS)
- {
- return key_press_callback (widget, event, user_data);
- }
-
- return GDK_EVENT_PROPAGATE;
-}
-
static void
subdirectory_done_loading_callback (NautilusDirectory *directory,
NautilusListView *view)
@@ -2127,6 +2078,7 @@ create_and_set_up_tree_view (NautilusListView *view)
gchar **default_column_order, **default_visible_columns;
GtkWidget *content_widget;
GtkGesture *longpress_gesture;
+ GtkEventController *controller;
content_widget = nautilus_files_view_get_content_widget (NAUTILUS_FILES_VIEW (view));
view->details->tree_view = GTK_TREE_VIEW (gtk_tree_view_new ());
@@ -2193,8 +2145,26 @@ create_and_set_up_tree_view (NautilusListView *view)
g_signal_connect (view->details->tree_view_multi_press_gesture, "released",
G_CALLBACK (on_tree_view_multi_press_gesture_released), view);
- g_signal_connect_object (view->details->tree_view, "event",
- G_CALLBACK (on_event), view, 0);
+ controller = gtk_event_controller_motion_new (GTK_WIDGET (view->details->tree_view));
+ view->details->motion_controller = controller;
+
+ gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
+
+ g_signal_connect (controller, "enter",
+ G_CALLBACK (on_event_controller_motion_enter), view);
+ g_signal_connect (controller, "leave",
+ G_CALLBACK (on_event_controller_motion_leave), view);
+ g_signal_connect (controller, "motion",
+ G_CALLBACK (on_event_controller_motion_motion), view);
+
+ controller = gtk_event_controller_key_new (GTK_WIDGET (view->details->tree_view));
+ view->details->key_controller = controller;
+
+ gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_BUBBLE);
+
+ g_signal_connect (controller, "key-pressed",
+ G_CALLBACK (on_event_controller_key_key_pressed), view);
+
g_signal_connect_object (view->details->tree_view, "test-expand-row",
G_CALLBACK (test_expand_row_callback), view, 0);
g_signal_connect_object (view->details->tree_view, "row-expanded",
@@ -3691,6 +3661,8 @@ nautilus_list_view_dispose (GObject *object)
g_clear_object (&list_view->details->tree_view_drag_gesture);
g_clear_object (&list_view->details->tree_view_multi_press_gesture);
+ g_clear_object (&list_view->details->motion_controller);
+ g_clear_object (&list_view->details->key_controller);
G_OBJECT_CLASS (nautilus_list_view_parent_class)->dispose (object);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]