compiz (0.8.4-4) 020_fix_focus.patch

Summary

 include/compiz-core.h |    1 +
 src/event.c           |   11 +++++++++--
 src/window.c          |   10 ++++++++--
 3 files changed, 18 insertions(+), 4 deletions(-)

    
download this patch

Patch contents

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;