Index: compiz-0.8.4/include/compiz-core.h =================================================================== --- compiz-0.8.4.orig/include/compiz-core.h 2009-11-01 11:14:28.704773780 -0600 +++ compiz-0.8.4/include/compiz-core.h 2009-11-01 11:15:04.254773783 -0600 @@ -142,6 +142,7 @@ #define CompWindowStateBelowMask (1 << 10) #define CompWindowStateDemandsAttentionMask (1 << 11) #define CompWindowStateDisplayModalMask (1 << 12) +#define CompWindowStateUnmanagingMask (1 << 13) #define MAXIMIZE_STATE (CompWindowStateMaximizedHorzMask | \ CompWindowStateMaximizedVertMask) Index: compiz-0.8.4/src/event.c =================================================================== --- compiz-0.8.4.orig/src/event.c 2009-11-01 11:14:04.764750121 -0600 +++ compiz-0.8.4/src/event.c 2009-11-01 11:15:04.254773783 -0600 @@ -1366,13 +1366,14 @@ } else /* X -> Withdrawn */ { + unsigned int newState = w->state; + /* Iconic -> Withdrawn */ if (w->state & CompWindowStateHiddenMask) { w->minimized = FALSE; - changeWindowState (w, - w->state & ~CompWindowStateHiddenMask); + newState &= ~CompWindowStateHiddenMask; updateClientListForScreen (w->screen); } @@ -1380,6 +1381,12 @@ if (!w->attrib.override_redirect) setWmState (d, WithdrawnState, w->id); + if (w->managed) + newState |= CompWindowStateUnmanagingMask; + + changeWindowState (w, newState); + + w->managed = FALSE; w->placed = FALSE; } Index: compiz-0.8.4/src/window.c =================================================================== --- compiz-0.8.4.orig/src/window.c 2009-11-01 11:14:04.774749786 -0600 +++ compiz-0.8.4/src/window.c 2009-11-01 11:15:04.264770655 -0600 @@ -2554,7 +2554,7 @@ if (w->unmapRefCnt > 0) return; - if (w->managed && !w->placed) /* only for managed and closed windows */ + if (w->state & CompWindowStateUnmanagingMask) { XWindowChanges xwc; unsigned int xwcm; @@ -2573,7 +2573,7 @@ if (xwcm) configureXWindow (w, xwcm, &xwc); - w->managed = FALSE; + changeWindowState (w, w->state & ~CompWindowStateUnmanagingMask); } if (w->struts) @@ -2948,6 +2948,12 @@ if (!w->managed) return FALSE; + if (w->destroyed) + return FALSE; + + if (w->state & CompWindowStateUnmanagingMask) + return FALSE; + if (!onCurrentDesktop (w)) return FALSE;