[gtk+/wip/matthiasc/kill-event-signals: 100/130] treeview: Use a motion event controller



commit a28acee2629cdefbccb6e18d759dff43b14df6ac
Author: Matthias Clasen <mclasen redhat com>
Date:   Mon Jan 1 20:24:28 2018 -0500

    treeview: Use a motion event controller
    
    This replaces handlers for ::enter/leave/motion-notify-event.

 gtk/gtktreeview.c |   81 +++++++++++++++++++++++++----------------------------
 1 files changed, 38 insertions(+), 43 deletions(-)
---
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index cc1047d..dfa1a05 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -59,6 +59,7 @@
 #include "gtksettingsprivate.h"
 #include "gtksnapshotprivate.h"
 #include "gtkwidgetpath.h"
+#include "gtkeventcontrollermotion.h"
 #include "a11y/gtktreeviewaccessibleprivate.h"
 
 
@@ -457,6 +458,7 @@ struct _GtkTreeViewPrivate
   GtkGesture *column_multipress_gesture;
   GtkGesture *drag_gesture; /* Rubberbanding, row DnD */
   GtkGesture *column_drag_gesture; /* Column reordering, resizing */
+  GtkEventController *motion_controller;
 
   /* Tooltip support */
   gint tooltip_column;
@@ -600,12 +602,6 @@ static gboolean gtk_tree_view_key_press            (GtkWidget        *widget,
                                                    GdkEventKey      *event);
 static gboolean gtk_tree_view_key_release          (GtkWidget        *widget,
                                                    GdkEventKey      *event);
-static gboolean gtk_tree_view_motion               (GtkWidget        *widget,
-                                                   GdkEventMotion   *event);
-static gboolean gtk_tree_view_enter_notify         (GtkWidget        *widget,
-                                                   GdkEventCrossing *event);
-static gboolean gtk_tree_view_leave_notify         (GtkWidget        *widget,
-                                                   GdkEventCrossing *event);
 
 static void     gtk_tree_view_set_focus_child      (GtkContainer     *container,
                                                    GtkWidget        *child);
@@ -926,6 +922,16 @@ static void gtk_tree_view_drag_gesture_end                  (GtkGestureDrag *ges
                                                              gdouble         offset_x,
                                                              gdouble         offset_y,
                                                              GtkTreeView    *tree_view);
+static void gtk_tree_view_motion_controller_enter           (GtkEventControllerMotion *controller,
+                                                             double                    x,
+                                                             double                    y,
+                                                             GtkTreeView              *tree_view);
+static void gtk_tree_view_motion_controller_leave           (GtkEventControllerMotion *controller,
+                                                             GtkTreeView              *tree_view);
+static void gtk_tree_view_motion_controller_motion          (GtkEventControllerMotion *controller,
+                                                             double                    x,
+                                                             double                    y,
+                                                             GtkTreeView              *tree_view);
 
 static guint tree_view_signals [LAST_SIGNAL] = { 0 };
 static GParamSpec *tree_view_props [LAST_PROP] = { NULL };
@@ -968,12 +974,9 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
   widget_class->unrealize = gtk_tree_view_unrealize;
   widget_class->measure = gtk_tree_view_measure;
   widget_class->size_allocate = gtk_tree_view_size_allocate;
-  widget_class->motion_notify_event = gtk_tree_view_motion;
   widget_class->snapshot = gtk_tree_view_snapshot;
   widget_class->key_press_event = gtk_tree_view_key_press;
   widget_class->key_release_event = gtk_tree_view_key_release;
-  widget_class->enter_notify_event = gtk_tree_view_enter_notify;
-  widget_class->leave_notify_event = gtk_tree_view_leave_notify;
   widget_class->focus_out_event = gtk_tree_view_focus_out;
   widget_class->drag_begin = gtk_tree_view_drag_begin;
   widget_class->drag_end = gtk_tree_view_drag_end;
@@ -1755,6 +1758,14 @@ gtk_tree_view_init (GtkTreeView *tree_view)
                     G_CALLBACK (gtk_tree_view_column_drag_gesture_end), tree_view);
   gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (priv->column_drag_gesture),
                                               GTK_PHASE_CAPTURE);
+
+  priv->motion_controller = gtk_event_controller_motion_new (GTK_WIDGET (tree_view));
+  g_signal_connect (priv->motion_controller, "enter",
+                    G_CALLBACK (gtk_tree_view_motion_controller_enter), tree_view);
+  g_signal_connect (priv->motion_controller, "leave",
+                    G_CALLBACK (gtk_tree_view_motion_controller_leave), tree_view);
+  g_signal_connect (priv->motion_controller, "motion",
+                    G_CALLBACK (gtk_tree_view_motion_controller_motion), tree_view);
 }
 
 
@@ -2139,6 +2150,7 @@ gtk_tree_view_destroy (GtkWidget *widget)
   g_clear_object (&tree_view->priv->drag_gesture);
   g_clear_object (&tree_view->priv->column_multipress_gesture);
   g_clear_object (&tree_view->priv->column_drag_gesture);
+  g_clear_object (&tree_view->priv->motion_controller);
 
   GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->destroy (widget);
 }
@@ -4409,20 +4421,17 @@ gtk_tree_view_drag_gesture_update (GtkGestureDrag *gesture,
     }
 }
 
-static gboolean
-gtk_tree_view_motion (GtkWidget      *widget,
-                     GdkEventMotion *event)
+static void
+gtk_tree_view_motion_controller_motion (GtkEventControllerMotion *controller,
+                                        double                    x,
+                                        double                    y,
+                                        GtkTreeView              *tree_view)
 {
-  GtkTreeView *tree_view;
   GtkRBTree *tree;
   GtkRBNode *node;
   gint new_y;
   GList *list;
   gboolean cursor_set = FALSE;
-  gdouble x, y;
-
-  tree_view = (GtkTreeView *) widget;
-  gdk_event_get_coords ((GdkEvent *) event, &x, &y);
 
   if (tree_view->priv->tree)
     {
@@ -4450,16 +4459,14 @@ gtk_tree_view_motion (GtkWidget      *widget,
 
       if (_gtk_tree_view_column_coords_in_resize_rect (column, x, y))
         {
-          gtk_widget_set_cursor_from_name (widget, "col-resize");
+          gtk_widget_set_cursor_from_name (GTK_WIDGET (tree_view), "col-resize");
           cursor_set = TRUE;
           break;
         }
     }
 
   if (!cursor_set)
-    gtk_widget_set_cursor (widget, NULL);
-
-  return GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->motion_notify_event (widget, event);
+    gtk_widget_set_cursor (GTK_WIDGET (tree_view), NULL);
 }
 
 /* Invalidate the focus rectangle near the edge of the bin_window; used when
@@ -5769,22 +5776,18 @@ gtk_tree_view_key_release (GtkWidget   *widget,
   return GTK_WIDGET_CLASS (gtk_tree_view_parent_class)->key_release_event (widget, event);
 }
 
-/* FIXME Is this function necessary? Can I get an enter_notify event
- * w/o either an expose event or a mouse motion event?
- */
-static gboolean
-gtk_tree_view_enter_notify (GtkWidget        *widget,
-                           GdkEventCrossing *event)
+static void
+gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller,
+                                       double                    x,
+                                       double                    y,
+                                       GtkTreeView              *tree_view)
 {
-  GtkTreeView *tree_view = GTK_TREE_VIEW (widget);
   GtkRBTree *tree;
   GtkRBNode *node;
-  gdouble x, y;
   gint new_y;
 
-  if (tree_view->priv->tree == NULL ||
-      !gdk_event_get_coords ((GdkEvent *) event, &x, &y))
-    return FALSE;
+  if (tree_view->priv->tree == NULL)
+    return;
 
   /* find the node internally */
   new_y = TREE_WINDOW_Y_TO_RBTREE_Y(tree_view, y);
@@ -5798,18 +5801,12 @@ gtk_tree_view_enter_notify (GtkWidget        *widget,
   if ((tree_view->priv->button_pressed_node == NULL) ||
       (tree_view->priv->button_pressed_node == node))
     prelight_or_select (tree_view, tree, node, x, y);
-
-  return TRUE;
 }
 
-static gboolean
-gtk_tree_view_leave_notify (GtkWidget        *widget,
-                           GdkEventCrossing *event)
+static void
+gtk_tree_view_motion_controller_leave (GtkEventControllerMotion *controller,
+                                       GtkTreeView              *tree_view)
 {
-  GtkTreeView *tree_view;
-
-  tree_view = GTK_TREE_VIEW (widget);
-
   if (tree_view->priv->prelight_node)
     _gtk_tree_view_queue_draw_node (tree_view,
                                    tree_view->priv->prelight_tree,
@@ -5822,8 +5819,6 @@ gtk_tree_view_leave_notify (GtkWidget        *widget,
   prelight_or_select (tree_view,
                      NULL, NULL,
                      -1000, -1000); /* coords not possibly over an arrow */
-
-  return TRUE;
 }
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]