[gtk/pick-insensitive2: 7/9] Add a flags argument to gtk_widget_pick



commit b804235aea791a65f1c50668c4bc43d27a4922e8
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Apr 7 17:19:09 2019 +0000

    Add a flags argument to gtk_widget_pick
    
    This will be used to let the inspector and other users
    pick insensitive widgets again. For now, update all
    callers to pass no flags, preserving the current
    behavior.

 demos/gtk-demo/dnd.c            |  4 ++--
 demos/gtk-demo/sliding_puzzle.c |  2 +-
 gtk/gtkenums.h                  |  4 ++++
 gtk/gtkflowbox.c                |  2 +-
 gtk/gtkmain.c                   |  4 ++--
 gtk/gtkpointerfocus.c           |  2 +-
 gtk/gtkrange.c                  |  4 ++--
 gtk/gtktooltip.c                |  2 +-
 gtk/gtkwidget.c                 | 23 +++++++++++++++--------
 gtk/gtkwidget.h                 |  7 ++++---
 gtk/gtkwindow.c                 |  9 +++++----
 gtk/gtkwindowprivate.h          |  7 ++++---
 gtk/inspector/inspect-button.c  |  2 +-
 tests/testwidgettransforms.c    |  2 +-
 14 files changed, 44 insertions(+), 30 deletions(-)
---
diff --git a/demos/gtk-demo/dnd.c b/demos/gtk-demo/dnd.c
index cb21d2f25b..7ee7591e74 100644
--- a/demos/gtk-demo/dnd.c
+++ b/demos/gtk-demo/dnd.c
@@ -243,7 +243,7 @@ pressed_cb (GtkGesture *gesture,
   GtkWidget *child;
 
   widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
-  child = gtk_widget_pick (widget, x, y);
+  child = gtk_widget_pick (widget, x, y, 0);
 
   if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_SECONDARY)
     {
@@ -320,7 +320,7 @@ released_cb (GtkGesture *gesture,
   GtkWidget *child;
 
   widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (gesture));
-  child = gtk_widget_pick (widget, x, y);
+  child = gtk_widget_pick (widget, x, y, 0);
 
   if (gtk_gesture_single_get_current_button (GTK_GESTURE_SINGLE (gesture)) == GDK_BUTTON_PRIMARY)
     {
diff --git a/demos/gtk-demo/sliding_puzzle.c b/demos/gtk-demo/sliding_puzzle.c
index dd1bc65151..2cba018d27 100644
--- a/demos/gtk-demo/sliding_puzzle.c
+++ b/demos/gtk-demo/sliding_puzzle.c
@@ -228,7 +228,7 @@ puzzle_button_pressed (GtkGestureMultiPress *gesture,
   int l, t, i;
   int pos;
 
-  child = gtk_widget_pick (grid, x, y);
+  child = gtk_widget_pick (grid, x, y, 0);
 
   if (!child)
     {
diff --git a/gtk/gtkenums.h b/gtk/gtkenums.h
index 7eab7923e3..7f0a178ab8 100644
--- a/gtk/gtkenums.h
+++ b/gtk/gtkenums.h
@@ -1040,4 +1040,8 @@ typedef enum {
   GTK_PLACES_OPEN_NEW_WINDOW = 1 << 2
 } GtkPlacesOpenFlags;
 
+typedef enum {
+  GTK_PICK_ALL = 1 << 0
+} GtkPickFlags;
+
 #endif /* __GTK_ENUMS_H__ */
diff --git a/gtk/gtkflowbox.c b/gtk/gtkflowbox.c
index 1cb1683606..d134da1c69 100644
--- a/gtk/gtkflowbox.c
+++ b/gtk/gtkflowbox.c
@@ -3928,7 +3928,7 @@ gtk_flow_box_get_child_at_pos (GtkFlowBox *box,
                                gint        x,
                                gint        y)
 {
-  GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y);
+  GtkWidget *child = gtk_widget_pick (GTK_WIDGET (box), x, y, 0);
 
   if (!child)
     return NULL;
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index 2c61209eac..e00cc59497 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -1703,7 +1703,7 @@ handle_pointing_event (GdkEvent *event)
       target = gtk_window_lookup_pointer_focus_implicit_grab (toplevel, device, sequence);
 
       if (!target)
-        target = gtk_widget_pick (toplevel_widget, x, y);
+        target = gtk_widget_pick (toplevel_widget, x, y, 0);
 
       if (!target)
         target = toplevel_widget;
@@ -1742,7 +1742,7 @@ handle_pointing_event (GdkEvent *event)
       if (event->any.type == GDK_BUTTON_RELEASE)
         {
           GtkWidget *new_target;
-          new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y);
+          new_target = gtk_widget_pick (GTK_WIDGET (toplevel), x, y, 0);
           if (new_target == NULL)
             new_target = GTK_WIDGET (toplevel);
           gtk_synthesize_crossing_events (GTK_ROOT (toplevel), target, new_target, event,
diff --git a/gtk/gtkpointerfocus.c b/gtk/gtkpointerfocus.c
index 6c2c90f455..cb338a11e8 100644
--- a/gtk/gtkpointerfocus.c
+++ b/gtk/gtkpointerfocus.c
@@ -135,7 +135,7 @@ gtk_pointer_focus_repick_target (GtkPointerFocus *focus)
 {
   GtkWidget *target;
 
-  target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y);
+  target = gtk_widget_pick (GTK_WIDGET (focus->toplevel), focus->x, focus->y, 0);
   if (target == NULL)
     target = GTK_WIDGET (focus->toplevel);
   gtk_pointer_focus_set_target (focus, target);
diff --git a/gtk/gtkrange.c b/gtk/gtkrange.c
index 586561917e..9b430d79c9 100644
--- a/gtk/gtkrange.c
+++ b/gtk/gtkrange.c
@@ -1865,7 +1865,7 @@ gtk_range_long_press_gesture_pressed (GtkGestureLongPress *gesture,
   GtkRangePrivate *priv = gtk_range_get_instance_private (range);
   GtkWidget *mouse_location;
 
-  mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y);
+  mouse_location = gtk_widget_pick (GTK_WIDGET (range), x, y, 0);
 
   if (mouse_location == priv->slider_widget && !priv->zoom)
     {
@@ -1909,7 +1909,7 @@ gtk_range_multipress_gesture_pressed (GtkGestureMultiPress *gesture,
                 "gtk-primary-button-warps-slider", &primary_warps,
                 NULL);
 
-  mouse_location = gtk_widget_pick (widget, x, y);
+  mouse_location = gtk_widget_pick (widget, x, y, 0);
 
   /* For the purposes of this function, we ignore fill and highlight and
    * handle them like the trough */
diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c
index f309fc7683..fafc80c8be 100644
--- a/gtk/gtktooltip.c
+++ b/gtk/gtktooltip.c
@@ -434,7 +434,7 @@ _gtk_widget_find_at_coords (GdkSurface *surface,
   if (!event_widget)
     return NULL;
 
-  picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y);
+  picked_widget = gtk_widget_pick (event_widget, surface_x, surface_y, 0);
 
   if (picked_widget != NULL)
     gtk_widget_translate_coordinates (event_widget, picked_widget, surface_x, surface_y, widget_x, widget_y);
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 39ac2bd10b..f7b2087914 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -11006,6 +11006,7 @@ gtk_widget_contains (GtkWidget  *widget,
  * @widget: the widget to query
  * @x: X coordinate to test, relative to @widget's origin
  * @y: Y coordinate to test, relative to @widget's origin
+ * @flags: Flags to influence what is picked
  *
  * Finds the descendant of @widget (including @widget itself) closest
  * to the screen at the point (@x, @y). The point must be given in
@@ -11024,20 +11025,26 @@ gtk_widget_contains (GtkWidget  *widget,
  *     coordinate or %NULL if none.
  **/
 GtkWidget *
-gtk_widget_pick (GtkWidget *widget,
-                 gdouble    x,
-                 gdouble    y)
+gtk_widget_pick (GtkWidget    *widget,
+                 gdouble       x,
+                 gdouble       y,
+                 GtkPickFlags  flags)
 {
   GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
   GtkWidget *child;
 
   g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
 
-  if (!gtk_widget_get_can_pick (widget) ||
-      !_gtk_widget_is_sensitive (widget) ||
-      !_gtk_widget_is_drawable (widget))
+  if (!_gtk_widget_is_drawable (widget))
     return NULL;
 
+  if ((flags & GTK_PICK_ALL) == 0)
+    {
+      if (!gtk_widget_get_can_pick (widget) ||
+          !_gtk_widget_is_sensitive (widget))
+        return NULL;
+    }
+
   switch (priv->overflow)
     {
     default:
@@ -11061,7 +11068,7 @@ gtk_widget_pick (GtkWidget *widget,
     {
       GtkWidget *picked;
 
-      picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y);
+      picked = gtk_window_pick_popover (GTK_WINDOW (widget), x, y, flags);
       if (picked)
         return picked;
     }
@@ -11097,7 +11104,7 @@ gtk_widget_pick (GtkWidget *widget,
 
       graphene_point3d_interpolate (&p0, &p1, p0.z / (p0.z - p1.z), &res);
 
-      picked = gtk_widget_pick (child, res.x, res.y);
+      picked = gtk_widget_pick (child, res.x, res.y, flags);
       if (picked)
         return picked;
     }
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index 5424d2182d..8f0591306b 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -751,9 +751,10 @@ gboolean     gtk_widget_contains              (GtkWidget  *widget,
                                                gdouble     x,
                                                gdouble     y);
 GDK_AVAILABLE_IN_ALL
-GtkWidget *  gtk_widget_pick                  (GtkWidget  *widget,
-                                               gdouble     x,
-                                               gdouble     y);
+GtkWidget *  gtk_widget_pick                  (GtkWidget   *widget,
+                                               gdouble      x,
+                                               gdouble      y,
+                                               GtkPickFlags flags);
 
 GDK_AVAILABLE_IN_ALL
 void         gtk_widget_add_controller        (GtkWidget          *widget,
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index ab7dc0419a..ce1ab54dc0 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -736,9 +736,10 @@ static void popover_get_rect (GtkWindowPopover      *popover,
                               cairo_rectangle_int_t *rect);
 
 GtkWidget *
-gtk_window_pick_popover (GtkWindow *window,
-                         double     x,
-                         double     y)
+gtk_window_pick_popover (GtkWindow    *window,
+                         double        x,
+                         double        y,
+                         GtkPickFlags  flags)
 {
   GtkWindowPrivate *priv = gtk_window_get_instance_private (window);
   GList *popovers;
@@ -753,7 +754,7 @@ gtk_window_pick_popover (GtkWindow *window,
                                         x, y,
                                         &dest_x, &dest_y);
 
-      picked = gtk_widget_pick (popover->widget, dest_x, dest_y);
+      picked = gtk_widget_pick (popover->widget, dest_x, dest_y, flags);
       if (picked)
         return picked;
     }
diff --git a/gtk/gtkwindowprivate.h b/gtk/gtkwindowprivate.h
index 67e3973c10..555f5faa6f 100644
--- a/gtk/gtkwindowprivate.h
+++ b/gtk/gtkwindowprivate.h
@@ -162,9 +162,10 @@ void             gtk_window_maybe_revoke_implicit_grab (GtkWindow *window,
 void             gtk_window_maybe_update_cursor (GtkWindow *window,
                                                  GtkWidget *widget,
                                                  GdkDevice *device);
-GtkWidget *      gtk_window_pick_popover (GtkWindow *window,
-                                          double     x,
-                                          double     y);
+GtkWidget *      gtk_window_pick_popover (GtkWindow   *window,
+                                          double       x,
+                                          double       y,
+                                          GtkPickFlags flags);
 
 G_END_DECLS
 
diff --git a/gtk/inspector/inspect-button.c b/gtk/inspector/inspect-button.c
index 76e52f4df1..430d3c49e5 100644
--- a/gtk/inspector/inspect-button.c
+++ b/gtk/inspector/inspect-button.c
@@ -55,7 +55,7 @@ find_widget_at_pointer (GdkDevice *device)
       gdk_surface_get_device_position (gtk_widget_get_surface (widget),
                                        device, &x, &y, NULL);
 
-      widget = gtk_widget_pick (widget, x, y);
+      widget = gtk_widget_pick (widget, x, y, 0);
     }
 
   return widget;
diff --git a/tests/testwidgettransforms.c b/tests/testwidgettransforms.c
index 1dd8d2c1ad..314d72c01d 100644
--- a/tests/testwidgettransforms.c
+++ b/tests/testwidgettransforms.c
@@ -187,7 +187,7 @@ gtk_transform_tester_snapshot (GtkWidget   *widget,
           const float py = y;
           GtkWidget *picked;
 #if 1
-          picked = gtk_widget_pick (widget, px, py);
+          picked = gtk_widget_pick (widget, px, py, 0);
 #else
           {
             int dx, dy;


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