summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2018-12-25 12:19:32 +0100
committerTimm Bäder <mail@baedert.org>2018-12-25 12:19:32 +0100
commitd8baf606b8b96d858d81b1e0d5ad9d88322771b3 (patch)
tree6eae81594a15aa45c0bd8a3687d3564ac69b95cf
parentcc56dca251a7013da5083e7a0c7e64866ed637fd (diff)
downloadgtk+-wip/baedert/some-api.tar.gz
main: Use the new widget depth when delivering eventswip/baedert/some-api
-rw-r--r--gtk/gtkmain.c35
1 files changed, 26 insertions, 9 deletions
diff --git a/gtk/gtkmain.c b/gtk/gtkmain.c
index eff0d62ed3..130b02e70e 100644
--- a/gtk/gtkmain.c
+++ b/gtk/gtkmain.c
@@ -2459,26 +2459,35 @@ propagate_event_down (GtkWidget *widget,
GdkEvent *event,
GtkWidget *topmost)
{
- gint handled_event = FALSE;
- GList *widgets = NULL;
- GList *l;
+ gboolean handled_event = FALSE;
+ GtkWidget **widgets;
+ int n_widgets = 0;
+ int topmost_depth;
+ int i;
+
+ if (topmost)
+ topmost_depth = gtk_widget_get_depth (topmost);
+ else
+ topmost_depth = 0;
- widgets = g_list_prepend (widgets, g_object_ref (widget));
+ widgets = g_alloca (sizeof (*widgets) *
+ (gtk_widget_get_depth (widget) - topmost_depth));
while (widget && widget != topmost)
{
widget = gtk_widget_get_parent (widget);
if (!widget)
break;
- widgets = g_list_prepend (widgets, g_object_ref (widget));
+ widgets[n_widgets] = g_object_ref (widget);
+ n_widgets ++;
if (widget == topmost)
break;
}
- for (l = widgets; l && !handled_event; l = l->next)
+ for (i = n_widgets - 1; i >= 0; i --)
{
- widget = (GtkWidget *)l->data;
+ widget = widgets[i];
if (!gtk_widget_is_sensitive (widget))
{
@@ -2491,9 +2500,17 @@ propagate_event_down (GtkWidget *widget,
handled_event = TRUE;
}
else
- handled_event = _gtk_widget_captured_event (widget, event);
+ {
+ handled_event = _gtk_widget_captured_event (widget, event);
+ }
+
+ if (handled_event)
+ break;
}
- g_list_free_full (widgets, (GDestroyNotify)g_object_unref);
+
+ /* Unref all now */
+ for (i = 0; i < n_widgets; i ++)
+ g_object_unref (widgets[i]);
return handled_event;
}