From adffcf8af64a21bb639c2e71199d1be63d1dd4fe Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Fri, 3 May 2013 10:39:24 +0200 Subject: [PATCH] Add gdk_window_get_children_with_user_data This function returns all the children that has a specific user_data set. This is used a lot in the new GtkWidget drawing code and doing it this way is faster than getting every child and calling get_user_data on each (which was a non-neglible part of the profiles). Additionally it also allows use to use some kind of hashtable to make this operation even faster if needed in the future. --- gdk/gdkwindow.c | 41 +++++++++++++++++++++++++++++++++++++++++ gdk/gdkwindow.h | 4 ++++ 2 files changed, 45 insertions(+) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 39ccda0b68..7a9b0c3657 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -2399,6 +2399,47 @@ gdk_window_peek_children (GdkWindow *window) return window->children; } + +/** + * gdk_window_get_children_with_user_data: + * @window: a #GdkWindow + * + * Gets the list of children of @window known to GDK with a particular + * user_data set on it. + * + * The returned list must be freed, but the elements in the + * list need not be. + * + * The list is returned in (relative) stacking order, i.e. the + * lowest window is first. + * + * Return value: (transfer container) (element-type GdkWindow): + * list of child windows inside @window + **/ +GList * +gdk_window_get_children_with_user_data (GdkWindow *window, gpointer user_data) +{ + GdkWindow *child; + GList *res, *l; + + g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); + + if (GDK_WINDOW_DESTROYED (window)) + return NULL; + + res = NULL; + for (l = window->children; l != NULL; l = l->next) + { + child = l->data; + + if (child->user_data == user_data) + res = g_list_prepend (res, child); + } + + return res; +} + + /** * gdk_window_add_filter: (skip) * @window: (allow-none): a #GdkWindow diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h index 73e6f86494..ddc8e70ca5 100644 --- a/gdk/gdkwindow.h +++ b/gdk/gdkwindow.h @@ -856,6 +856,10 @@ GDK_AVAILABLE_IN_ALL GList * gdk_window_get_children (GdkWindow *window); GDK_AVAILABLE_IN_ALL GList * gdk_window_peek_children (GdkWindow *window); +GDK_AVAILABLE_IN_3_10 +GList * gdk_window_get_children_with_user_data (GdkWindow *window, + gpointer user_data); + GDK_AVAILABLE_IN_ALL GdkEventMask gdk_window_get_events (GdkWindow *window); GDK_AVAILABLE_IN_ALL