diff -burN compiz-0.8.4/include/compiz-core.h compiz-0.8.4.new/include/compiz-core.h --- compiz-0.8.4/include/compiz-core.h 2009-10-02 16:35:00.000000000 -0500 +++ compiz-0.8.4.new/include/compiz-core.h 2009-10-25 18:39:32.000000000 -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) diff -burN compiz-0.8.4/src/event.c compiz-0.8.4.new/src/event.c --- compiz-0.8.4/src/event.c 2009-10-10 22:14:20.000000000 -0500 +++ compiz-0.8.4.new/src/event.c 2009-10-25 18:41:48.000000000 -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; } diff -burN compiz-0.8.4/src/window.c compiz-0.8.4.new/src/window.c --- compiz-0.8.4/src/window.c 2009-10-12 22:23:38.000000000 -0500 +++ compiz-0.8.4.new/src/window.c 2009-10-25 18:45:03.000000000 -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;