[gtk+] inspector: Allow picking insensitive widgets
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] inspector: Allow picking insensitive widgets
- Date: Fri, 19 Jan 2018 12:17:39 +0000 (UTC)
commit 8224e7ac722c9cdf21ae36e2b33bec20580c4692
Author: Timm Bäder <mail baedert org>
Date: Fri Jan 19 10:16:15 2018 +0100
inspector: Allow picking insensitive widgets
The default gtk_widget_contains/gtk_widget_pick don't consider
insensitive widgets.
gtk/gtkwidget.c | 6 +----
gtk/gtkwidgetprivate.h | 6 +++++
gtk/inspector/inspect-button.c | 47 +++++++++++++++++++++++++++++++++++++++-
3 files changed, 53 insertions(+), 6 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 55c4d60..d074b52 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -648,10 +648,6 @@ static AtkObject* gtk_widget_ref_accessible (AtkImplementor *implementor);
static gboolean gtk_widget_real_can_activate_accel (GtkWidget *widget,
guint signal_id);
-static void gtk_widget_get_origin_relative_to_parent(GtkWidget *widget,
- int *origin_x,
- int *origin_y);
-
static void gtk_widget_real_set_has_tooltip (GtkWidget *widget,
gboolean has_tooltip,
gboolean force);
@@ -4830,7 +4826,7 @@ gtk_widget_common_ancestor (GtkWidget *widget_a,
return widget_a;
}
-static void
+void
gtk_widget_get_origin_relative_to_parent (GtkWidget *widget,
int *origin_x,
int *origin_y)
diff --git a/gtk/gtkwidgetprivate.h b/gtk/gtkwidgetprivate.h
index da80377..75e84fe 100644
--- a/gtk/gtkwidgetprivate.h
+++ b/gtk/gtkwidgetprivate.h
@@ -332,6 +332,12 @@ gboolean gtk_widget_emit_event_signals (GtkWidget *widg
void gtk_widget_init_legacy_controller (GtkWidget *widget);
+void gtk_widget_get_origin_relative_to_parent (GtkWidget *widget,
+ int *origin_x,
+ int *origin_y);
+
+
+
/* inline getters */
diff --git a/gtk/inspector/inspect-button.c b/gtk/inspector/inspect-button.c
index 517e716..987eb4f 100644
--- a/gtk/inspector/inspect-button.c
+++ b/gtk/inspector/inspect-button.c
@@ -30,6 +30,51 @@
#include "gtkstack.h"
#include "gtkmain.h"
#include "gtkinvisible.h"
+#include "gtkwidgetprivate.h"
+
+
+static gboolean
+inspector_contains (GtkWidget *widget,
+ double x,
+ double y)
+{
+ g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+
+ if (!gtk_widget_is_drawable (widget))
+ return FALSE;
+
+ return GTK_WIDGET_GET_CLASS (widget)->contains (widget, x, y);
+}
+
+static GtkWidget *
+inspector_pick (GtkWidget *widget,
+ double x,
+ double y)
+{
+ /* Like gtk_widget_pick and gtk_widget_contains,
+ * but we need to consider insensitive widgets as well. */
+ GtkWidget *child;
+
+ for (child = _gtk_widget_get_last_child (widget);
+ child;
+ child = _gtk_widget_get_prev_sibling (child))
+ {
+ GtkWidget *picked;
+ int dx, dy;
+
+ gtk_widget_get_origin_relative_to_parent (child, &dx, &dy);
+
+ picked = inspector_pick (child, x - dx, y - dy);
+ if (picked)
+ return picked;
+ }
+
+
+ if (!inspector_contains (widget, x, y))
+ return NULL;
+
+ return widget;
+}
static GtkWidget *
find_widget_at_pointer (GdkDevice *device)
@@ -73,7 +118,7 @@ find_widget_at_pointer (GdkDevice *device)
gdk_window_get_device_position_double (gtk_widget_get_window (widget),
device, &x, &y, NULL);
- widget = gtk_widget_pick (widget, x, y);
+ widget = inspector_pick (widget, x, y);
}
return widget;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]