diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | libwnck/tasklist.c | 17 | ||||
-rw-r--r-- | libwnck/window.c | 3 |
3 files changed, 26 insertions, 6 deletions
@@ -1,3 +1,15 @@ +2006-03-28 Elijah Newren <newren gmail com> + + Fix transient cycles causing infinite loops, #332493. Portion of + patch providing robustness against self-transiency (i.e. cycle + length of 1) provided by Dan Winship. + + * libwnck/tasklist.c (wnck_tasklist_active_window_changed): check + for transient cycles + + * libwnck/window.c (update_transient_for): disallow + self-transiency entirely + 2006-03-26 Vincent Untz <vuntz@gnome.org> * doc/.cvsignore: libwnck-sections.txt shouldn't be ignored diff --git a/libwnck/tasklist.c b/libwnck/tasklist.c index 63586c2..deb31ef 100644 --- a/libwnck/tasklist.c +++ b/libwnck/tasklist.c @@ -2054,14 +2054,21 @@ wnck_tasklist_active_window_changed (WnckScreen *screen, WnckTasklist *tasklist) { WnckWindow *active_window; + WnckWindow *initial_window; WnckTask *active_task = NULL; /* FIXME: check for group modal window */ - for (active_window = wnck_screen_get_active_window (screen); - active_window && !active_task; - active_window = wnck_window_get_transient (active_window)) - active_task = g_hash_table_lookup (tasklist->priv->win_hash, - active_window); + initial_window = active_window = wnck_screen_get_active_window (screen); + active_task = g_hash_table_lookup (tasklist->priv->win_hash, active_window); + while (active_window && !active_task) + { + active_window = wnck_window_get_transient (active_window); + active_task = g_hash_table_lookup (tasklist->priv->win_hash, + active_window); + /* Check for transient cycles */ + if (active_window == initial_window) + break; + } wnck_tasklist_change_active_task (tasklist, active_task); } diff --git a/libwnck/window.c b/libwnck/window.c index f02912b..83e9ea1 100644 --- a/libwnck/window.c +++ b/libwnck/window.c @@ -2168,7 +2168,8 @@ update_transient_for (WnckWindow *window) if (_wnck_get_window (window->priv->xwindow, _wnck_atom_get ("WM_TRANSIENT_FOR"), - &parent)) + &parent) && + parent != window->priv->xwindow) { window->priv->transient_for = parent; |