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;