summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--libwnck/tasklist.c17
-rw-r--r--libwnck/window.c3
3 files changed, 26 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index aa62f15..7f6dc78 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;