[maemo-commits] [maemo-commits] r18888 - in projects/haf/trunk/gtk+: . gdk
From: subversion at stage.maemo.org subversion at stage.maemo.orgDate: Mon Jul 20 16:49:54 EEST 2009
- Previous message: [maemo-commits] r18887 - in projects/haf/trunk/gtk+: . gdk
- Next message: [maemo-commits] r18889 - in projects/haf/trunk/gtk+: . gdk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: herzi Date: 2009-07-20 16:49:52 +0300 (Mon, 20 Jul 2009) New Revision: 18888 Modified: projects/haf/trunk/gtk+/ChangeLog projects/haf/trunk/gtk+/gdk/gdkwindow.c Log: 2009-01-14 Sven Herzberg <sven at imendio.com> About: NB#89864 - RGBA support * gdk/gdkwindow.c (gdk_window_is_ancestor), (gdk_window_add_update_window), (gdk_window_remove_update_window), (gdk_window_process_all_updates), (gdk_window_process_updates), (gdk_window_invalidate_maybe_recurse), (gdk_window_get_update_area), (_gdk_window_clear_update_area): copied the window update ordering code from the offscreen branch Modified: projects/haf/trunk/gtk+/ChangeLog =================================================================== --- projects/haf/trunk/gtk+/ChangeLog 2009-07-20 13:49:48 UTC (rev 18887) +++ projects/haf/trunk/gtk+/ChangeLog 2009-07-20 13:49:52 UTC (rev 18888) @@ -2,6 +2,17 @@ About: NB#89864 - RGBA support + * gdk/gdkwindow.c (gdk_window_is_ancestor), + (gdk_window_add_update_window), (gdk_window_remove_update_window), + (gdk_window_process_all_updates), (gdk_window_process_updates), + (gdk_window_invalidate_maybe_recurse), + (gdk_window_get_update_area), (_gdk_window_clear_update_area): copied + the window update ordering code from the offscreen branch + +2009-01-14 Sven Herzberg <sven at imendio.com> + + About: NB#89864 - RGBA support + * gdk/gdkwindow.c (gdk_window_begin_paint_region): clear the window's background for each 32bit window Modified: projects/haf/trunk/gtk+/gdk/gdkwindow.c =================================================================== --- projects/haf/trunk/gtk+/gdk/gdkwindow.c 2009-07-20 13:49:48 UTC (rev 18887) +++ projects/haf/trunk/gtk+/gdk/gdkwindow.c 2009-07-20 13:49:52 UTC (rev 18888) @@ -2556,6 +2556,102 @@ static guint update_idle = 0; static gboolean debug_updates = FALSE; +static inline gboolean +gdk_window_is_ancestor (GdkWindow *window, + GdkWindow *ancestor) +{ + while (window) + { + GdkWindow *parent = (GdkWindow*) ((GdkWindowObject*) window)->parent; + + if (parent == ancestor) + return TRUE; + + window = parent; + } + + return FALSE; +} + +static void +gdk_window_add_update_window (GdkWindow *window) +{ + GSList *tmp; + GSList *prev = NULL; + gboolean has_ancestor_in_list = FALSE; + + for (tmp = update_windows; tmp; tmp = tmp->next) + { + GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent; + + /* check if tmp is an ancestor of "window"; if it is, set a + * flag indicating that all following windows are either + * children of "window" or from a differen hierarchy + */ + if (!has_ancestor_in_list && gdk_window_is_ancestor (window, tmp->data)) + has_ancestor_in_list = TRUE; + + /* insert in reverse stacking order when adding around siblings, + * so processing updates properly paints over lower stacked windows + */ + if (parent == GDK_WINDOW_OBJECT (tmp->data)->parent) + { + gint index = g_list_index (parent->children, window); + for (; tmp && parent == GDK_WINDOW_OBJECT (tmp->data)->parent; tmp = tmp->next) + { + gint sibling_index = g_list_index (parent->children, tmp->data); + if (index > sibling_index) + break; + prev = tmp; + } + /* here, tmp got advanced past all lower stacked siblings */ + tmp = g_slist_prepend (tmp, window); + if (prev) + prev->next = tmp; + else + update_windows = tmp; + return; + } + + /* if "window" has an ancestor in the list and tmp is one of + * "window's" children, insert "window" before tmp + */ + if (has_ancestor_in_list && gdk_window_is_ancestor (tmp->data, window)) + { + tmp = g_slist_prepend (tmp, window); + + if (prev) + prev->next = tmp; + else + update_windows = tmp; + return; + } + + /* if we're at the end of the list and had an ancestor it it, + * append to the list + */ + if (! tmp->next && has_ancestor_in_list) + { + tmp = g_slist_append (tmp, window); + return; + } + + prev = tmp; + } + + /* if all above checks failed ("window" is from a different + * hierarchy than what is already in the list) or the list is + * empty, prepend + */ + update_windows = g_slist_prepend (update_windows, window); +} + +static void +gdk_window_remove_update_window (GdkWindow *window) +{ + update_windows = g_slist_remove (update_windows, window); +} + static gboolean gdk_window_update_idle (gpointer data) { @@ -2713,7 +2809,7 @@ { if (private->update_freeze_count || gdk_window_is_toplevel_frozen (tmp_list->data)) - update_windows = g_slist_prepend (update_windows, private); + gdk_window_add_update_window (GDK_WINDOW (private)); else gdk_window_process_updates_internal (tmp_list->data); } @@ -2766,7 +2862,7 @@ !gdk_window_is_toplevel_frozen (window)) { gdk_window_process_updates_internal (window); - update_windows = g_slist_remove (update_windows, window); + gdk_window_remove_update_window (window); } if (update_children) @@ -2970,7 +3066,7 @@ } else { - update_windows = g_slist_prepend (update_windows, window); + gdk_window_add_update_window (window); private->update_area = gdk_region_copy (visible_region); gdk_window_schedule_update (window); @@ -3049,8 +3145,8 @@ tmp_region = private->update_area; private->update_area = NULL; - update_windows = g_slist_remove (update_windows, window); - + gdk_window_remove_update_window (window); + return tmp_region; } else @@ -3074,7 +3170,7 @@ if (private->update_area) { - update_windows = g_slist_remove (update_windows, window); + gdk_window_remove_update_window (window); gdk_region_destroy (private->update_area); private->update_area = NULL;
- Previous message: [maemo-commits] r18887 - in projects/haf/trunk/gtk+: . gdk
- Next message: [maemo-commits] r18889 - in projects/haf/trunk/gtk+: . gdk
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]