[gtk+] tooltip: Remove custom picking code
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] tooltip: Remove custom picking code
- Date: Sat, 13 Jan 2018 09:37:48 +0000 (UTC)
commit fc711040d1c0b43e0d9a09a4f214d1e4ddca9043
Author: Timm Bäder <mail baedert org>
Date: Sat Jan 13 08:35:39 2018 +0100
tooltip: Remove custom picking code
Just use gtk_widget_pick here for now. This also makes tooltips of
widgets work which are not inside a container.
gtk/gtktooltip.c | 199 ++----------------------------------------------------
1 files changed, 5 insertions(+), 194 deletions(-)
---
diff --git a/gtk/gtktooltip.c b/gtk/gtktooltip.c
index 952ea95..fb768f3 100644
--- a/gtk/gtktooltip.c
+++ b/gtk/gtktooltip.c
@@ -431,133 +431,6 @@ gtk_tooltip_window_hide (GtkWidget *widget,
gtk_tooltip_set_custom (tooltip, NULL);
}
-/* event handling, etc */
-
-struct ChildLocation
-{
- GtkWidget *child;
- GtkWidget *container;
-
- gint x;
- gint y;
-};
-
-static void
-prepend_and_ref_widget (GtkWidget *widget,
- gpointer data)
-{
- GSList **slist_p = data;
-
- *slist_p = g_slist_prepend (*slist_p, g_object_ref (widget));
-}
-
-static void
-child_location_foreach (GtkWidget *child,
- gpointer data)
-{
- GtkAllocation child_allocation;
- gint x, y;
- struct ChildLocation *child_loc = data;
-
- /* Ignore invisible widgets */
- if (!gtk_widget_is_drawable (child))
- return;
-
- gtk_widget_get_allocation (child, &child_allocation);
-
- x = 0;
- y = 0;
-
- /* (child_loc->x, child_loc->y) are relative to
- * child_loc->container's allocation.
- */
-
- if (!child_loc->child &&
- gtk_widget_translate_coordinates (child_loc->container, child,
- child_loc->x, child_loc->y,
- &x, &y))
- {
- /* (x, y) relative to child's allocation. */
- if (x >= 0 && x < child_allocation.width
- && y >= 0 && y < child_allocation.height)
- {
- if (GTK_IS_CONTAINER (child))
- {
- struct ChildLocation tmp = { NULL, NULL, 0, 0 };
- GSList *children = NULL, *tmp_list;
-
- /* Take (x, y) relative the child's allocation and
- * recurse.
- */
- tmp.x = x;
- tmp.y = y;
- tmp.container = child;
-
- gtk_container_forall (GTK_CONTAINER (child),
- prepend_and_ref_widget, &children);
-
- for (tmp_list = children; tmp_list; tmp_list = tmp_list->next)
- {
- child_location_foreach (tmp_list->data, &tmp);
- g_object_unref (tmp_list->data);
- }
-
- if (tmp.child)
- child_loc->child = tmp.child;
- else
- child_loc->child = child;
-
- g_slist_free (children);
- }
- else
- child_loc->child = child;
- }
- }
-}
-
-/* Translates coordinates from dest_widget->window relative (src_x, src_y),
- * to allocation relative (dest_x, dest_y) of dest_widget.
- */
-static void
-window_to_alloc (GtkWidget *dest_widget,
- gint src_x,
- gint src_y,
- gint *dest_x,
- gint *dest_y)
-{
- GtkAllocation allocation;
-
- gtk_widget_get_allocation (dest_widget, &allocation);
-
- /* Translate from window relative to allocation relative */
- if (gtk_widget_get_has_window (dest_widget) &&
- gtk_widget_get_parent (dest_widget))
- {
- gint wx, wy;
- gdk_window_get_position (gtk_widget_get_window (dest_widget),
- &wx, &wy);
-
- /* Offset coordinates if widget->window is smaller than
- * widget->allocation.
- */
- src_x += wx - allocation.x;
- src_y += wy - allocation.y;
- }
- else
- {
- src_x -= allocation.x;
- src_y -= allocation.y;
- }
-
- if (dest_x)
- *dest_x = src_x;
- if (dest_y)
- *dest_y = src_y;
-}
-
-/* Translates coordinates from window relative (x, y) to
- * allocation relative (x, y) of the returned widget.
- */
GtkWidget *
_gtk_widget_find_at_coords (GdkWindow *window,
gint window_x,
@@ -566,7 +439,7 @@ _gtk_widget_find_at_coords (GdkWindow *window,
gint *widget_y)
{
GtkWidget *event_widget;
- struct ChildLocation child_loc = { NULL, NULL, 0, 0 };
+ GtkWidget *picked_widget;
g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
@@ -575,74 +448,12 @@ _gtk_widget_find_at_coords (GdkWindow *window,
if (!event_widget)
return NULL;
- /* Coordinates are relative to event window */
- child_loc.x = window_x;
- child_loc.y = window_y;
-
- /* We go down the window hierarchy to the widget->window,
- * coordinates stay relative to the current window.
- * We end up with window == widget->window, coordinates relative to that.
- */
- while (window && window != _gtk_widget_get_window (event_widget))
- {
- gdouble px, py;
-
- gdk_window_coords_to_parent (window,
- child_loc.x, child_loc.y,
- &px, &py);
- child_loc.x = px;
- child_loc.y = py;
-
- window = gdk_window_get_parent (window);
- }
-
- /* Failing to find widget->window can happen for e.g. a detached handle box;
- * chaining ::query-tooltip up to its parent probably makes little sense,
- * and users better implement tooltips on handle_box->child.
- * so we simply ignore the event for tooltips here.
- */
- if (!window)
- return NULL;
-
- /* Convert the window relative coordinates to allocation
- * relative coordinates.
- */
- window_to_alloc (event_widget,
- child_loc.x, child_loc.y,
- &child_loc.x, &child_loc.y);
-
- if (GTK_IS_CONTAINER (event_widget))
- {
- GtkWidget *container = event_widget;
-
- child_loc.container = event_widget;
- child_loc.child = NULL;
-
- gtk_container_forall (GTK_CONTAINER (event_widget),
- child_location_foreach, &child_loc);
-
- /* Here we have a widget, with coordinates relative to
- * child_loc.container's allocation.
- */
-
- if (child_loc.child)
- event_widget = child_loc.child;
- else if (child_loc.container)
- event_widget = child_loc.container;
-
- /* Translate to event_widget's allocation */
- gtk_widget_translate_coordinates (container, event_widget,
- child_loc.x, child_loc.y,
- &child_loc.x, &child_loc.y);
- }
+ picked_widget = gtk_widget_pick (event_widget, window_x, window_y);
- /* We return (x, y) relative to the allocation of event_widget. */
- if (widget_x)
- *widget_x = child_loc.x;
- if (widget_y)
- *widget_y = child_loc.y;
+ if (picked_widget != NULL)
+ gtk_widget_translate_coordinates (event_widget, picked_widget, window_x, window_y, widget_x, widget_y);
- return event_widget;
+ return picked_widget;
}
/* Ignores (x, y) on input, translates event coordinates to
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]