Hi,

> > - Remembering of the last window state inside the state change notify
> > This is useful for properly tracking down the window state changes (e.g.
> > has the window been maximized in that state change?). In Beryl, we added
> > a variable lastState into CompWindow, which is updated inside core's
> > stateChangeNotify. The attached last-window-state.patch brings that
> > behaviour to Compiz.
> 
> I've applied the patch. However, all code that cause a change to the
> state should be modified so that a mask of changed bits can be passed to
> the state change notify function instead. This lastState variable
> shouldn't have to exist.

In the attached patch, I've modified your recently added function
changeWindowState to make the passing of a changed state bit mask
easier:
- Don't modify w->state outside of changeWindowState
- Issue the state change notify only if the state was changed

I think with these changes, only the actual bitmask passing is missing.
What do you think?

Regards,

Danny
diff --git a/src/event.c b/src/event.c
index b7f1d61..d2f1d22 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1290,9 +1290,9 @@ handleEvent (CompDisplay *d,
 		if (w->state & CompWindowStateHiddenMask)
 		{
 		    w->minimized = FALSE;
-		    w->state &= ~CompWindowStateHiddenMask;
 
-		    changeWindowState (w, w->state);
+		    changeWindowState (w, w->state &
+			    ~CompWindowStateHiddenMask);
 
 		    updateClientListForScreen (w->screen);
 		}
@@ -1645,13 +1645,11 @@ handleEvent (CompDisplay *d,
 
 		if (wState != w->state)
 		{
-		    w->state = wState;
+		    changeWindowState (w, wState);
 
 		    recalcWindowType (w);
 		    recalcWindowActions (w);
 
-		    changeWindowState (w, w->state);
-
 		    updateWindowAttributes (w, FALSE);
 		}
 	    }
@@ -1927,8 +1925,6 @@ handleEvent (CompDisplay *d,
 	    w = findWindowAtDisplay (d, event->xfocus.window);
 	    if (w && w->managed)
 	    {
-		unsigned int state = w->state;
-
 		if (w->id != d->activeWindow)
 		{
 		    d->activeWindow = w->id;
@@ -1940,10 +1936,8 @@ handleEvent (CompDisplay *d,
 				     (unsigned char *) &w->id, 1);
 		}
 
-		state &= ~CompWindowStateDemandsAttentionMask;
-
-		if (w->state != state)
-		    changeWindowState (w, state);
+		changeWindowState (w, w->state &
+			~CompWindowStateDemandsAttentionMask);
 	    }
 	}
 	break;
diff --git a/src/window.c b/src/window.c
index 6fcfc21..11924ae 100644
--- a/src/window.c
+++ b/src/window.c
@@ -568,14 +568,17 @@ changeWindowState (CompWindow   *w,
 		   unsigned int newState)
 {
     CompDisplay *d = w->screen->display;
+    unsigned int lastState = w->state;
 
     w->state = newState;
 
     setWindowState (d, w->state, w->id);
 
-    (*w->screen->windowStateChangeNotify) (w);
-
-    (*d->matchPropertyChanged) (d, w);
+    if (w->state != lastState)
+    {
+       (*w->screen->windowStateChangeNotify) (w);
+       (*d->matchPropertyChanged) (d, w);
+    }
 }
 
 static void
@@ -3878,7 +3881,9 @@ activateWindow (CompWindow *w)
 
     if (w->state & CompWindowStateHiddenMask)
     {
-	w->state &= ~CompWindowStateShadedMask;
+	changeWindowState (w, w->state &
+		~CompWindowStateShadedMask);
+
 	if (w->shaded)
 	    showWindow (w);
     }
@@ -4098,6 +4103,7 @@ void
 hideWindow (CompWindow *w)
 {
     Bool onDesktop = onCurrentDesktop (w);
+    unsigned int state = w->state;
 
     if (!w->managed)
 	return;
@@ -4127,7 +4133,7 @@ hideWindow (CompWindow *w)
 	return;
 
     if (w->minimized || w->inShowDesktopMode || w->hidden || w->shaded)
-	w->state |= CompWindowStateHiddenMask;
+	state |= CompWindowStateHiddenMask;
 
     w->pendingUnmaps++;
 
@@ -4136,13 +4142,14 @@ hideWindow (CompWindow *w)
 
     XUnmapWindow (w->screen->display->display, w->id);
 
-    changeWindowState (w, w->state);
+    changeWindowState (w, state);
 }
 
 void
 showWindow (CompWindow *w)
 {
     Bool onDesktop = onCurrentDesktop (w);
+    unsigned int state = w->state;
 
     if (!w->managed)
 	return;
@@ -4154,9 +4161,9 @@ showWindow (CompWindow *w)
 	{
 	    if (w->state & CompWindowStateHiddenMask)
 	    {
-		w->state &= ~CompWindowStateHiddenMask;
+		state &= ~CompWindowStateHiddenMask;
 
-		changeWindowState (w, w->state);
+		changeWindowState (w, state);
 	    }
 	}
 
@@ -4186,13 +4193,13 @@ showWindow (CompWindow *w)
 	w->shaded = FALSE;
     }
 
-    w->state &= ~CompWindowStateHiddenMask;
+    state &= ~CompWindowStateHiddenMask;
 
     w->pendingMaps++;
 
     XMapWindow (w->screen->display->display, w->id);
 
-    changeWindowState (w, w->state);
+    changeWindowState (w, state);
 }
 
 static void
@@ -4259,6 +4266,8 @@ void
 maximizeWindow (CompWindow *w,
 		int	   state)
 {
+    unsigned int newState = w->state;
+
     if (w->attrib.override_redirect)
 	return;
 
@@ -4269,13 +4278,13 @@ maximizeWindow (CompWindow *w,
     if (state == (w->state & MAXIMIZE_STATE))
 	return;
 
-    w->state &= ~MAXIMIZE_STATE;
-    w->state |= state;
+    newState &= ~MAXIMIZE_STATE;
+    newState |= state;
 
     recalcWindowType (w);
     recalcWindowActions (w);
 
-    changeWindowState (w, w->state);
+    changeWindowState (w, newState);
 
     updateWindowAttributes (w, FALSE);
 }
_______________________________________________
compiz mailing list
compiz@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/compiz

Reply via email to