[gtk/readonly-events-1] Go back to ::enter/::leave for pointer changes



commit 28a1152c52a42c937c79c36617601f57d59a1ff5
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Feb 19 22:04:28 2020 -0500

    Go back to ::enter/::leave for pointer changes

 gtk/gtkeventcontrollermotion.c | 72 +++++++++++++++++++++++++++---------------
 gtk/gtkiconview.c              | 35 +++++++-------------
 gtk/gtklabel.c                 | 29 ++++++-----------
 gtk/gtkmodelbutton.c           | 32 +++++++++++--------
 gtk/gtkpopovermenu.c           | 19 ++++-------
 gtk/gtkpopovermenubar.c        | 36 ++++++++-------------
 gtk/gtkscrolledwindow.c        | 22 +++++--------
 gtk/gtktreepopover.c           | 19 ++++-------
 gtk/gtktreeview.c              | 71 +++++++++++++++++++++--------------------
 9 files changed, 159 insertions(+), 176 deletions(-)
---
diff --git a/gtk/gtkeventcontrollermotion.c b/gtk/gtkeventcontrollermotion.c
index 4134ce1335..72031ad470 100644
--- a/gtk/gtkeventcontrollermotion.c
+++ b/gtk/gtkeventcontrollermotion.c
@@ -54,8 +54,9 @@ struct _GtkEventControllerMotionClass
 };
 
 enum {
+  ENTER,
+  LEAVE,
   MOTION,
-  POINTER_CHANGE,
   N_SIGNALS
 };
 
@@ -91,12 +92,16 @@ gtk_event_controller_motion_handle_event (GtkEventController *controller,
 
 static void
 update_pointer_focus (GtkEventController    *controller,
-                      const GtkCrossingData *crossing)
+                      const GtkCrossingData *crossing,
+                      double                 x,
+                      double                 y)
 {
   GtkEventControllerMotion *motion = GTK_EVENT_CONTROLLER_MOTION (controller);
   GtkWidget *widget = gtk_event_controller_get_widget (controller);
   gboolean is_pointer = FALSE;
   gboolean contains_pointer = FALSE;
+  gboolean enter = FALSE;
+  gboolean leave = FALSE;
 
   if (crossing->direction == GTK_CROSSING_IN)
     {
@@ -106,6 +111,17 @@ update_pointer_focus (GtkEventController    *controller,
         contains_pointer = TRUE;
     }
 
+  if (motion->contains_pointer != contains_pointer)
+    {
+      if (contains_pointer)
+        enter = TRUE;
+      else
+        leave = TRUE;
+    }
+
+  if (enter)
+    g_signal_emit (controller, signals[ENTER], 0, x, y, crossing->mode);
+
   g_object_freeze_notify (G_OBJECT (motion));
   if (motion->is_pointer != is_pointer)
     {
@@ -118,6 +134,9 @@ update_pointer_focus (GtkEventController    *controller,
       g_object_notify (G_OBJECT (motion), "contains-pointer");
     }
   g_object_thaw_notify (G_OBJECT (motion));
+
+  if (leave)
+    g_signal_emit (controller, signals[LEAVE], 0, crossing->mode);
 }
 
 static void
@@ -133,13 +152,7 @@ gtk_event_controller_motion_handle_crossing (GtkEventController    *controller,
 
   motion->current_crossing = crossing;
 
-  update_pointer_focus (controller, crossing);
-
-  g_signal_emit (controller, signals[POINTER_CHANGE], 0,
-                 crossing->direction,
-                 x,
-                 y,
-                 crossing->mode);
+  update_pointer_focus (controller, crossing, x, y);
 
   motion->current_crossing = NULL;
 }
@@ -216,34 +229,41 @@ gtk_event_controller_motion_class_init (GtkEventControllerMotionClass *klass)
   g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
 
   /**
-   * GtkEventControllerMotion::pointer-change:
+   * GtkEventControllerMotion::enter:
    * @controller: the object which received the signal
-   * @direction: the direction of this crossing event
    * @x: coordinates of pointer location
    * @y: coordinates of pointer location
    * @mode: crossing mode
    *
-   * This signal is emitted whenever the pointer focus changes
-   * from or to a widget that is a descendant of the widget to
-   * which @controller is attached.
-   *
-   * Handlers for this signal can use
-   * gtk_event_controller_motion_get_pointer_origin() and
-   * gtk_event_controller_motion_get_pointer_target() to find
-   * the old and new pointer locations.
+   * Signals that the pointer has entered the widget.
    */
-  signals[POINTER_CHANGE] =
-    g_signal_new (I_("pointer-change"),
+  signals[ENTER] =
+    g_signal_new (I_("enter"),
                   GTK_TYPE_EVENT_CONTROLLER_MOTION,
                   G_SIGNAL_RUN_LAST,
                   0, NULL, NULL,
                   NULL,
-                  G_TYPE_NONE, 4,
-                  GTK_TYPE_CROSSING_DIRECTION,
+                  G_TYPE_NONE, 3,
                   G_TYPE_DOUBLE,
                   G_TYPE_DOUBLE,
                   GDK_TYPE_CROSSING_MODE);
 
+  /**
+   * GtkEventControllerMotion::leave:
+   * @controller: the object which received the signal
+   * @mode: crossing mode
+   *
+   * Signals that the pointer has left the widget.
+   */
+  signals[LEAVE] =
+    g_signal_new (I_("leave"),
+                  GTK_TYPE_EVENT_CONTROLLER_MOTION,
+                  G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL,
+                  NULL,
+                  G_TYPE_NONE, 1,
+                  GDK_TYPE_CROSSING_MODE);
+
   /**
    * GtkEventControllerMotion::motion:
    * @controller: The object that received the signal
@@ -290,7 +310,8 @@ gtk_event_controller_motion_new (void)
  * Returns the widget that contained the pointer before.
  *
  * This function can only be used in handlers for the
- * #GtkEventControllerMotion::pointer-change signal.
+ * #GtkEventControllerMotion::enter or
+ * #GtkEventControllerMotion::leave signals.
  *
  * Returns: (transfer none): the previous pointer focus
  */
@@ -310,7 +331,8 @@ gtk_event_controller_motion_get_pointer_origin (GtkEventControllerMotion *contro
  * Returns the widget that will contain the pointer afterwards.
  *
  * This function can only be used in handlers for the
- * #GtkEventControllerMotion::pointer-change signal.
+ * #GtkEventControllerMotion::enter or
+ * #GtkEventControllerMotion::leave signals.
  *
  * Returns: (transfer none): the next pointer focus
  */
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 520f869dec..0024804763 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -167,10 +167,7 @@ static void             gtk_icon_view_motion                    (GtkEventControl
                                                                  double              x,
                                                                  double              y,
                                                                  gpointer            user_data);
-static void             gtk_icon_view_pointer                   (GtkEventController   *controller,
-                                                                 GtkCrossingDirection  direction,
-                                                                 double                x,
-                                                                 double                y,
+static void             gtk_icon_view_leave                     (GtkEventController   *controller,
                                                                  GdkCrossingMode       mode,
                                                                  gpointer              user_data);
 static void             gtk_icon_view_button_press              (GtkGestureClick *gesture,
@@ -968,10 +965,8 @@ gtk_icon_view_init (GtkIconView *icon_view)
   gtk_widget_add_controller (GTK_WIDGET (icon_view), GTK_EVENT_CONTROLLER (gesture));
 
   controller = gtk_event_controller_motion_new ();
-  g_signal_connect (controller, "pointer-change", G_CALLBACK (gtk_icon_view_pointer),
-                    icon_view);
-  g_signal_connect (controller, "motion", G_CALLBACK (gtk_icon_view_motion),
-                    icon_view);
+  g_signal_connect (controller, "leave", G_CALLBACK (gtk_icon_view_leave), icon_view);
+  g_signal_connect (controller, "motion", G_CALLBACK (gtk_icon_view_motion), icon_view);
   gtk_widget_add_controller (GTK_WIDGET (icon_view), controller);
 
   controller = gtk_event_controller_key_new ();
@@ -1884,26 +1879,20 @@ gtk_icon_view_motion (GtkEventController *controller,
 }
 
 static void
-gtk_icon_view_pointer (GtkEventController   *controller,
-                       GtkCrossingDirection  direction,
-                       double                x,
-                       double                y,
-                       GdkCrossingMode       mode,
-                       gpointer              user_data)
+gtk_icon_view_leave(GtkEventController   *controller,
+                    GdkCrossingMode       mode,
+                    gpointer              user_data)
 {
   GtkIconView *icon_view;
   GtkIconViewPrivate *priv;
 
-  if (direction == GTK_CROSSING_OUT)
-    {
-      icon_view = GTK_ICON_VIEW (user_data);
-      priv = icon_view->priv;
+  icon_view = GTK_ICON_VIEW (user_data);
+  priv = icon_view->priv;
 
-      if (priv->last_prelight)
-        {
-          gtk_icon_view_queue_draw_item (icon_view, priv->last_prelight);
-          priv->last_prelight = NULL;
-        }
+  if (priv->last_prelight)
+    {
+      gtk_icon_view_queue_draw_item (icon_view, priv->last_prelight);
+      priv->last_prelight = NULL;
     }
 }
 
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index 1c7d1ba130..306b01e2c7 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -448,10 +448,7 @@ static void gtk_label_motion            (GtkEventControllerMotion *controller,
                                          double                    x,
                                          double                    y,
                                          gpointer                  data);
-static void gtk_label_pointer           (GtkEventControllerMotion *controller,
-                                         GtkCrossingDirection      direction,
-                                         double                    x,
-                                         double                    y,
+static void gtk_label_leave             (GtkEventControllerMotion *controller,
                                          GdkCrossingMode           mode,
                                          gpointer                  data);
 
@@ -4859,24 +4856,18 @@ gtk_label_motion (GtkEventControllerMotion *controller,
 }
 
 static void
-gtk_label_pointer (GtkEventControllerMotion *controller,
-                   GtkCrossingDirection      direction,
-                   double                    x,
-                   double                    y,
-                   GdkCrossingMode           mode,
-                   gpointer                  data)
+gtk_label_leave (GtkEventControllerMotion *controller,
+                 GdkCrossingMode           mode,
+                 gpointer                  data)
 {
   GtkLabel *label = GTK_LABEL (data);
   GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
 
-  if (direction == GTK_CROSSING_OUT)
+  if (priv->select_info)
     {
-      if (priv->select_info)
-        {
-          priv->select_info->active_link = NULL;
-          gtk_label_update_cursor (label);
-          gtk_widget_queue_draw (GTK_WIDGET (label));
-        }
+      priv->select_info->active_link = NULL;
+      gtk_label_update_cursor (label);
+      gtk_widget_queue_draw (GTK_WIDGET (label));
     }
 }
 
@@ -5022,8 +5013,8 @@ gtk_label_ensure_select_info (GtkLabel *label)
       priv->select_info->motion_controller = gtk_event_controller_motion_new ();
       g_signal_connect (priv->select_info->motion_controller, "motion",
                         G_CALLBACK (gtk_label_motion), label);
-      g_signal_connect (priv->select_info->motion_controller, "pointer-change",
-                        G_CALLBACK (gtk_label_pointer), label);
+      g_signal_connect (priv->select_info->motion_controller, "leave",
+                        G_CALLBACK (gtk_label_leave), label);
       gtk_widget_add_controller (GTK_WIDGET (label), priv->select_info->motion_controller);
 
       priv->select_info->provider = g_object_new (GTK_TYPE_LABEL_CONTENT, NULL);
diff --git a/gtk/gtkmodelbutton.c b/gtk/gtkmodelbutton.c
index 803006f95c..2f5d3aba9e 100644
--- a/gtk/gtkmodelbutton.c
+++ b/gtk/gtkmodelbutton.c
@@ -1312,23 +1312,23 @@ stop_open (GtkModelButton *button)
 }
 
 static void
-pointer_change_cb (GtkEventController   *controller,
-                   GtkCrossingDirection  direction,
-                   double                x,
-                   double                y,
-                   GdkCrossingMode       mode,
-                   gpointer              data)
+pointer_cb (GObject    *object,
+            GParamSpec *pspec,
+            gpointer    data)
 {
-  GtkModelButton *button = data;
-  GtkWidget *target;
-  GtkWidget *popover;
+  gboolean contains;
+
+  contains = gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (object));
 
-  if (direction == GTK_CROSSING_IN)
+  if (contains)
     {
-      target = gtk_event_controller_get_widget (controller);
+      GtkWidget *target;
+      GtkWidget *popover;
+
+      target = GTK_WIDGET (data);
       popover = gtk_widget_get_ancestor (target, GTK_TYPE_POPOVER_MENU);
 
-      if (popover && gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)))
+      if (popover)
         {
           if (gtk_popover_menu_get_open_submenu (GTK_POPOVER_MENU (popover)) != NULL)
             start_open (GTK_MODEL_BUTTON (target));
@@ -1337,7 +1337,11 @@ pointer_change_cb (GtkEventController   *controller,
         }
     }
   else
-    stop_open (button);
+    {
+      GtkModelButton *button = data;
+
+      stop_open (button);
+    }
 }
 
 static void
@@ -1383,7 +1387,7 @@ gtk_model_button_init (GtkModelButton *self)
   gtk_widget_add_css_class (GTK_WIDGET (self), "flat");
 
   controller = gtk_event_controller_motion_new ();
-  g_signal_connect (controller, "pointer-change", G_CALLBACK (pointer_change_cb), self);
+  g_signal_connect (controller, "notify::contains-pointer", G_CALLBACK (pointer_cb), self);
   g_signal_connect (controller, "motion", G_CALLBACK (motion_cb), self);
   gtk_widget_add_controller (GTK_WIDGET (self), controller);
 
diff --git a/gtk/gtkpopovermenu.c b/gtk/gtkpopovermenu.c
index 50eccf17dc..3ea64b1309 100644
--- a/gtk/gtkpopovermenu.c
+++ b/gtk/gtkpopovermenu.c
@@ -184,22 +184,15 @@ focus_out (GtkEventController   *controller,
 }
 
 static void
-pointer_cb (GtkEventController   *controller,
-            GtkCrossingDirection  direction,
-            double                x,
-            double                y,
-            GdkCrossingMode       mode,
-            gpointer              data)
+leave_cb (GtkEventController   *controller,
+          GdkCrossingMode       mode,
+          gpointer              data)
 {
   GtkWidget *target;
 
-  if (direction == GTK_CROSSING_OUT)
-    {
-      target = gtk_event_controller_get_widget (controller);
+  target = gtk_event_controller_get_widget (controller);
 
-      if (!gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)))
-        gtk_popover_menu_set_active_item (GTK_POPOVER_MENU (target), NULL);
-    }
+  gtk_popover_menu_set_active_item (GTK_POPOVER_MENU (target), NULL);
 }
 
 static void
@@ -223,7 +216,7 @@ gtk_popover_menu_init (GtkPopoverMenu *popover)
   gtk_widget_add_controller (GTK_WIDGET (popover), controller);
 
   controller = gtk_event_controller_motion_new ();
-  g_signal_connect (controller, "pointer-change", G_CALLBACK (pointer_cb), popover);
+  g_signal_connect (controller, "leave", G_CALLBACK (leave_cb), popover);
   gtk_widget_add_controller (GTK_WIDGET (popover), controller);
 }
 
diff --git a/gtk/gtkpopovermenubar.c b/gtk/gtkpopovermenubar.c
index 2e9a1dec4b..411d4c0358 100644
--- a/gtk/gtkpopovermenubar.c
+++ b/gtk/gtkpopovermenubar.c
@@ -166,12 +166,11 @@ clicked_cb (GtkGesture *gesture,
 }
 
 static void
-item_pointer_change_cb (GtkEventController   *controller,
-                        GtkCrossingDirection  direction,
-                        double                x,
-                        double                y,
-                        GdkCrossingMode       mode,
-                        gpointer              data)
+item_enter_cb (GtkEventController   *controller,
+               double                x,
+               double                y,
+               GdkCrossingMode       mode,
+               gpointer              data)
 {
   GtkWidget *target;
   GtkPopoverMenuBar *bar;
@@ -179,17 +178,13 @@ item_pointer_change_cb (GtkEventController   *controller,
   target = gtk_event_controller_get_widget (controller);
   bar = GTK_POPOVER_MENU_BAR (gtk_widget_get_ancestor (target, GTK_TYPE_POPOVER_MENU_BAR));
 
-  if (direction == GTK_CROSSING_IN)
-    set_active_item (bar, GTK_POPOVER_MENU_BAR_ITEM (target), FALSE);
+  set_active_item (bar, GTK_POPOVER_MENU_BAR_ITEM (target), FALSE);
 }
 
 static void
-bar_pointer_change_cb (GtkEventController   *controller,
-                       GtkCrossingDirection  direction,
-                       double                x,
-                       double                y,
-                       GdkCrossingMode       mode,
-                       gpointer              data)
+bar_leave_cb (GtkEventController   *controller,
+              GdkCrossingMode       mode,
+              gpointer              data)
 {
   GtkWidget *target;
   GtkPopoverMenuBar *bar;
@@ -197,12 +192,9 @@ bar_pointer_change_cb (GtkEventController   *controller,
   target = gtk_event_controller_get_widget (controller);
   bar = GTK_POPOVER_MENU_BAR (gtk_widget_get_ancestor (target, GTK_TYPE_POPOVER_MENU_BAR));
 
-  if (direction == GTK_CROSSING_OUT)
-    {
-      if (bar->active_item &&
-          !gtk_widget_get_mapped (GTK_WIDGET (bar->active_item->popover)))
-        set_active_item (bar, NULL, FALSE);
-    }
+  if (bar->active_item &&
+      !gtk_widget_get_mapped (GTK_WIDGET (bar->active_item->popover)))
+    set_active_item (bar, NULL, FALSE);
 }
 
 static gboolean
@@ -265,7 +257,7 @@ gtk_popover_menu_bar_item_init (GtkPopoverMenuBarItem *item)
 
   controller = gtk_event_controller_motion_new ();
   gtk_event_controller_set_propagation_limit (controller, GTK_LIMIT_NONE);
-  g_signal_connect (controller, "pointer-change", G_CALLBACK (item_pointer_change_cb), NULL);
+  g_signal_connect (controller, "enter", G_CALLBACK (item_enter_cb), NULL);
   gtk_widget_add_controller (GTK_WIDGET (item), controller);
 }
 
@@ -617,7 +609,7 @@ gtk_popover_menu_bar_init (GtkPopoverMenuBar *bar)
 
   controller = gtk_event_controller_motion_new ();
   gtk_event_controller_set_propagation_limit (controller, GTK_LIMIT_NONE);
-  g_signal_connect (controller, "pointer-change", G_CALLBACK (bar_pointer_change_cb), NULL);
+  g_signal_connect (controller, "leave", G_CALLBACK (bar_leave_cb), NULL);
   gtk_widget_add_controller (GTK_WIDGET (bar), controller);
 }
 
diff --git a/gtk/gtkscrolledwindow.c b/gtk/gtkscrolledwindow.c
index ca035f5c2b..d076add4cb 100644
--- a/gtk/gtkscrolledwindow.c
+++ b/gtk/gtkscrolledwindow.c
@@ -444,22 +444,16 @@ add_tab_bindings (GtkBindingSet    *binding_set,
 }
 
 static void
-motion_controller_pointer (GtkEventController   *controller,
-                           GtkCrossingDirection  direction,
-                           double                x,
-                           double                y,
-                           GdkCrossingMode       mode,
-                           GtkScrolledWindow    *scrolled_window)
+motion_controller_leave (GtkEventController   *controller,
+                         GdkCrossingMode       mode,
+                         GtkScrolledWindow    *scrolled_window)
 {
   GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
 
-  if (direction == GTK_CROSSING_OUT)
+  if (priv->use_indicators)
     {
-      if (priv->use_indicators)
-        {
-          indicator_set_over (&priv->hindicator, FALSE);
-          indicator_set_over (&priv->vindicator, FALSE);
-        }
+      indicator_set_over (&priv->hindicator, FALSE);
+      indicator_set_over (&priv->vindicator, FALSE);
     }
 }
 
@@ -2023,8 +2017,8 @@ gtk_scrolled_window_init (GtkScrolledWindow *scrolled_window)
   gtk_widget_add_controller (widget, controller);
 
   controller = gtk_event_controller_motion_new ();
-  g_signal_connect (controller, "pointer-change",
-                    G_CALLBACK (motion_controller_pointer), scrolled_window);
+  g_signal_connect (controller, "leave",
+                    G_CALLBACK (motion_controller_leave), scrolled_window);
   gtk_widget_add_controller (widget, controller);
 }
 
diff --git a/gtk/gtktreepopover.c b/gtk/gtktreepopover.c
index 019090e9aa..207f107699 100644
--- a/gtk/gtktreepopover.c
+++ b/gtk/gtktreepopover.c
@@ -619,21 +619,16 @@ item_activated_cb (GtkGesture     *gesture,
 }
 
 static void
-pointer_change_cb (GtkEventController   *controller,
-                   GtkCrossingDirection  direction,
-                   double                x,
-                   double                y,
-                   GdkCrossingMode       mode,
-                   GtkTreePopover       *popover)
+enter_cb (GtkEventController   *controller,
+          double                x,
+          double                y,
+          GdkCrossingMode       mode,
+          GtkTreePopover       *popover)
 {
   GtkWidget *item;
   item = gtk_event_controller_get_widget (controller);
 
-  if (direction == GTK_CROSSING_IN)
-    {
-      if (gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)))
-        gtk_tree_popover_set_active_item (popover, item);
-    }
+  gtk_tree_popover_set_active_item (popover, item);
 }
 
 static GtkWidget *
@@ -693,7 +688,7 @@ gtk_tree_popover_create_item (GtkTreePopover *popover,
       gtk_widget_add_controller (item, GTK_EVENT_CONTROLLER (controller));
 
       controller = gtk_event_controller_motion_new ();
-      g_signal_connect (controller, "pointer-change", G_CALLBACK (pointer_change_cb), popover);
+      g_signal_connect (controller, "enter", G_CALLBACK (enter_cb), popover);
       gtk_widget_add_controller (item, controller);
 
       g_object_set_data (G_OBJECT (item), "is-header", GINT_TO_POINTER (header_item));
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index eccacdc91b..ca2ad2bb53 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -970,12 +970,14 @@ 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_pointer         (GtkEventControllerMotion *controller,
-                                                             GtkCrossingDirection      direction,
+static void gtk_tree_view_motion_controller_enter           (GtkEventControllerMotion *controller,
                                                              double                    x,
                                                              double                    y,
                                                              GdkCrossingMode           mode,
                                                              GtkTreeView              *tree_view);
+static void gtk_tree_view_motion_controller_leave           (GtkEventControllerMotion *controller,
+                                                             GdkCrossingMode           mode,
+                                                             GtkTreeView              *tree_view);
 static void gtk_tree_view_motion_controller_motion          (GtkEventControllerMotion *controller,
                                                              double                    x,
                                                              double                    y,
@@ -1821,8 +1823,10 @@ gtk_tree_view_init (GtkTreeView *tree_view)
   gtk_widget_add_controller (GTK_WIDGET (tree_view), GTK_EVENT_CONTROLLER (tree_view->column_drag_gesture));
 
   controller = gtk_event_controller_motion_new ();
-  g_signal_connect (controller, "pointer-change",
-                    G_CALLBACK (gtk_tree_view_motion_controller_pointer), tree_view);
+  g_signal_connect (controller, "enter",
+                    G_CALLBACK (gtk_tree_view_motion_controller_enter), tree_view);
+  g_signal_connect (controller, "leave",
+                    G_CALLBACK (gtk_tree_view_motion_controller_leave), tree_view);
   g_signal_connect (controller, "motion",
                     G_CALLBACK (gtk_tree_view_motion_controller_motion), tree_view);
   gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
@@ -5497,46 +5501,45 @@ gtk_tree_view_key_controller_key_released (GtkEventControllerKey *key,
 }
 
 static void
-gtk_tree_view_motion_controller_pointer (GtkEventControllerMotion *controller,
-                                         GtkCrossingDirection      direction,
-                                         double                    x,
-                                         double                    y,
-                                         GdkCrossingMode           mode,
-                                         GtkTreeView              *tree_view)
+gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller,
+                                       double                    x,
+                                       double                    y,
+                                       GdkCrossingMode           mode,
+                                       GtkTreeView              *tree_view)
 {
   GtkTreeRBTree *tree;
   GtkTreeRBNode *node;
   gint new_y;
  
-  if (direction == GTK_CROSSING_IN)
-    {
-      if (tree_view->tree == NULL)
-        return;
+  if (tree_view->tree == NULL)
+    return;
 
-      /* find the node internally */
-      new_y = TREE_WINDOW_Y_TO_RBTREE_Y(tree_view, y);
-      if (new_y < 0)
-        new_y = 0;
-      gtk_tree_rbtree_find_offset (tree_view->tree, new_y, &tree, &node);
+  /* find the node internally */
+  new_y = TREE_WINDOW_Y_TO_RBTREE_Y(tree_view, y);
+  if (new_y < 0)
+    new_y = 0;
+  gtk_tree_rbtree_find_offset (tree_view->tree, new_y, &tree, &node);
 
-      tree_view->event_last_x = x;
-      tree_view->event_last_y = y;
+  tree_view->event_last_x = x;
+  tree_view->event_last_y = y;
 
-      if ((tree_view->button_pressed_node == NULL) ||
-          (tree_view->button_pressed_node == node))
-        prelight_or_select (tree_view, tree, node, x, y);
-    }
-  else
-    {
-      if (tree_view->prelight_node)
-        gtk_widget_queue_draw (GTK_WIDGET (tree_view));
+  if ((tree_view->button_pressed_node == NULL) ||
+      (tree_view->button_pressed_node == node))
+    prelight_or_select (tree_view, tree, node, x, y);
+}
 
-      tree_view->event_last_x = -10000;
-      tree_view->event_last_y = -10000;
+static void
+gtk_tree_view_motion_controller_leave (GtkEventControllerMotion *controller,
+                                       GdkCrossingMode           mode,
+                                       GtkTreeView              *tree_view)
+{
+  if (tree_view->prelight_node)
+    gtk_widget_queue_draw (GTK_WIDGET (tree_view));
 
-      if (!gtk_event_controller_motion_contains_pointer (GTK_EVENT_CONTROLLER_MOTION (controller)))
-        prelight_or_select (tree_view, NULL, NULL, -1000, -1000); /* not possibly over an arrow */
-    }
+  tree_view->event_last_x = -10000;
+  tree_view->event_last_y = -10000;
+
+  prelight_or_select (tree_view, NULL, NULL, -1000, -1000); /* not possibly over an arrow */
 }
 
 static void


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