[gtk+] window: Fix traversal of popovers during picking
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] window: Fix traversal of popovers during picking
- Date: Sun, 6 Aug 2017 20:48:43 +0000 (UTC)
commit 4f31afcd9cf59e65fcb172996438a5e1dcf42f19
Author: Carlos Garnacho <carlosg gnome org>
Date: Sun Aug 6 22:17:27 2017 +0200
window: Fix traversal of popovers during picking
These need to be traversed in the opposite direction. Given the order is
opposite to rendering, use a GQueue so it's cheap to traverse/add either
way.
gtk/gtkwindow.c | 32 +++++++++++++-------------------
1 files changed, 13 insertions(+), 19 deletions(-)
---
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index eb86d20..5be147f 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -190,7 +190,7 @@ struct _GtkWindowPrivate
GdkDisplay *display;
GtkApplication *application;
- GList *popovers;
+ GQueue popovers;
GdkModifierType mnemonic_modifier;
@@ -747,15 +747,13 @@ gtk_window_pick (GtkWidget *widget,
gdouble *y_out)
{
GtkWindow *window = GTK_WINDOW (widget);
- GList *popovers = window->priv->popovers;
+ GList *popovers;
- while (popovers)
+ for (popovers = window->priv->popovers.tail; popovers; popovers = popovers->prev)
{
GtkWindowPopover *popover = popovers->data;
cairo_rectangle_int_t rect;
- popovers = popovers->next;
-
if (!gtk_widget_is_sensitive (popover->widget) ||
!gtk_widget_is_drawable (popover->widget))
continue;
@@ -3250,13 +3248,11 @@ gtk_window_dispose (GObject *object)
G_OBJECT_CLASS (gtk_window_parent_class)->dispose (object);
unset_titlebar (window);
- while (priv->popovers)
+ while (!g_queue_is_empty (&priv->popovers))
{
- GtkWindowPopover *popover = priv->popovers->data;
- priv->popovers = g_list_delete_link (priv->popovers, priv->popovers);
+ GtkWindowPopover *popover = g_queue_pop_head (&priv->popovers);
popover_destroy (popover);
}
-
}
static void
@@ -7042,11 +7038,9 @@ _gtk_window_set_allocation (GtkWindow *window,
*allocation_out = child_allocation;
- link = priv->popovers;
- while (link)
+ for (link = priv->popovers.head; link; link = link->next)
{
GtkWindowPopover *popover = link->data;
- link = link->next;
popover_size_allocate (popover->widget, popover, window);
}
@@ -7571,7 +7565,7 @@ _gtk_window_has_popover (GtkWindow *window,
GtkWindowPrivate *priv = window->priv;
GList *link;
- for (link = priv->popovers; link; link = link->next)
+ for (link = priv->popovers.head; link; link = link->next)
{
GtkWindowPopover *popover = link->data;
@@ -9121,7 +9115,7 @@ gtk_window_snapshot (GtkWidget *widget,
if (gtk_bin_get_child (GTK_BIN (widget)))
gtk_widget_snapshot_child (widget, gtk_bin_get_child (GTK_BIN (widget)), snapshot);
- for (l = priv->popovers; l; l = l->next)
+ for (l = priv->popovers.head; l; l = l->next)
{
GtkWindowPopover *data = l->data;
gtk_widget_snapshot_child (widget, data->widget, snapshot);
@@ -10583,7 +10577,7 @@ _gtk_window_add_popover (GtkWindow *window,
data->widget = popover;
data->parent = parent;
data->clamp_allocation = !!clamp_allocation;
- priv->popovers = g_list_prepend (priv->popovers, data);
+ g_queue_push_head (&priv->popovers, data);
gtk_widget_set_parent (popover, GTK_WIDGET (window));
@@ -10613,7 +10607,7 @@ _gtk_window_remove_popover (GtkWindow *window,
g_object_ref (popover);
gtk_widget_unparent (popover);
- priv->popovers = g_list_remove (priv->popovers, data);
+ g_queue_remove (&priv->popovers, data);
accessible = gtk_widget_get_accessible (GTK_WIDGET (window));
_gtk_container_accessible_remove_child (GTK_CONTAINER_ACCESSIBLE (accessible),
@@ -10730,15 +10724,15 @@ _gtk_window_raise_popover (GtkWindow *window,
GtkWindowPrivate *priv = window->priv;
GList *link;
- for (link = priv->popovers; link; link = link->next)
+ for (link = priv->popovers.head; link; link = link->next)
{
GtkWindowPopover *popover = link->data;
if (popover->widget != widget)
continue;
- priv->popovers = g_list_remove_link (priv->popovers, link);
- priv->popovers = g_list_append (priv->popovers, link->data);
+ g_queue_unlink (&priv->popovers, link);
+ g_queue_push_tail (&priv->popovers, link->data);
g_list_free (link);
break;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]