File compiz-plugins-main-better-neg.patch of Package compiz-plugins-main

--- a/metadata/neg.xml.in
+++ b/metadata/neg.xml.in
@@ -22,15 +22,15 @@
 			</option>
 		</display>
 		<screen>
+			<option name="toggle_by_default" type="bool">
+				<_short>Auto-Toggle Matched Windows</_short>
+				<_long>Automatically toggle windows in the match list by default</_long>
+				<default>false</default>
+			</option>
 			<option name="neg_match" type="match">
 				<_short>Negative Windows</_short>
-				<_long>Windows to be negative by default</_long>
-				<default>any</default>
-			</option>
-			<option name="exclude_match" type="match">
-				<_short>Exclude Windows</_short>
-				<_long>Windows to exclude from negating</_long>
-				<default>type=Desktop</default>
+				<_long>Windows to affect when negating</_long>
+				<default>!(type=Desktop)</default>
 			</option>
 		</screen>
 	</plugin>
--- a/src/neg/neg.c
+++ b/src/neg/neg.c
@@ -40,7 +40,7 @@ typedef struct _NEGDisplay
 } NEGDisplay;
 
 
-typedef struct _NEGSCreen
+typedef struct _NEGScreen
 {
     int windowPrivateIndex;
 
@@ -55,6 +55,7 @@ typedef struct _NEGSCreen
 typedef struct _NEGWindow
 {
     Bool isNeg; /* negative window flag */
+    Bool matched;
 } NEGWindow;
 
 #define GET_NEG_CORE(c) \
@@ -78,16 +79,15 @@ typedef struct _NEGWindow
 
 
 static void
-NEGToggle (CompWindow *w)
+NEGUpdateState (CompWindow *w)
 {
     NEG_WINDOW (w);
 
-    /* toggle window negative flag */
-    nw->isNeg = !nw->isNeg;
-
-    /* check exclude list */
-    if (matchEval (negGetExcludeMatch (w->screen), w))
-	nw->isNeg = FALSE;
+    /* check include list */
+    if (matchEval (negGetNegMatch (w->screen), w))
+		nw->isNeg = !nw->isNeg;
+	else
+		nw->isNeg = FALSE;
 
     /* cause repainting */
     addWindowDamage (w);
@@ -106,7 +106,7 @@ NEGToggleScreen (CompScreen *s)
     /* toggle every window */
     for (w = s->windows; w; w = w->next)
 	if (w)
-	    NEGToggle (w);
+	    NEGUpdateState (w);
 }
 
 static Bool
@@ -123,7 +123,7 @@ negToggle (CompDisplay     *d,
     w = findWindowAtDisplay (d, xid);
 
     if (w)
-	NEGToggle (w);
+	NEGUpdateState (w);
 
     return TRUE;
 }
@@ -549,10 +549,15 @@ static void
 NEGWindowAdd (CompScreen *s,
 	      CompWindow *w)
 {
-    /* nw->isNeg is initialized to FALSE in InitWindow, so we only
-       have to toggle it to TRUE if necessary */
-    if (matchEval (negGetNegMatch (s), w))
-	NEGToggle (w);
+	NEG_SCREEN (s);
+	NEG_WINDOW (w);
+
+	nw->matched = matchEval (negGetNegMatch (s), w);
+
+	/* nw->isNeg is initialized to FALSE in InitWindow, so we only
+	have to toggle it to TRUE if necessary */
+	if (ns->isNeg && nw->matched)
+		NEGUpdateState (w);
 }
 
 static void
@@ -562,24 +567,48 @@ NEGScreenOptionChanged (CompScreen
 {
     switch (num)
     {
+    case NegScreenOptionToggleByDefault:
+    {
+		CompWindow *w;
+
+		NEG_SCREEN (s);
+
+		ns->isNeg = opt[NegScreenOptionToggleByDefault].value.b;
+
+		for (w = s->windows; w; w = w->next)
+		{
+			NEG_WINDOW (w);
+			if (ns->isNeg)
+			{
+				if (!nw->isNeg)
+					NEGUpdateState (w);
+			}
+			else
+			{
+				if (nw->isNeg)
+					NEGUpdateState (w);
+			}
+		}
+	}
+    break;
     case NegScreenOptionNegMatch:
-    case NegScreenOptionExcludeMatch:
 	{
 	    CompWindow *w;
 	    NEG_SCREEN (s);
 
 	    for (w = s->windows; w; w = w->next)
 	    {
-		Bool isNeg;
-		NEG_WINDOW (w);
+			NEG_WINDOW (w);
 
-		isNeg = matchEval (negGetNegMatch (s), w);
-		isNeg = isNeg && !matchEval (negGetExcludeMatch (s), w);
+			nw->matched = matchEval (negGetNegMatch (w->screen), w);
 
-		if (isNeg && ns->isNeg && !nw->isNeg)
-		    NEGToggle (w);
-		else if (!isNeg && nw->isNeg)
-		    NEGToggle (w);
+			if (nw->matched)
+			{
+				if ((ns->isNeg || negGetToggleByDefault (s)) && !nw->isNeg)
+					NEGUpdateState (w);
+			}
+			else if (nw->isNeg)
+				NEGUpdateState (w);
 	    }
 	}
 	break;
@@ -711,8 +740,8 @@ NEGInitScreen (CompPlugin *p,
     ns->negFunction      = 0;
     ns->negAlphaFunction = 0;
 
+    negSetToggleByDefaultNotify (s, NEGScreenOptionChanged);
     negSetNegMatchNotify (s, NEGScreenOptionChanged);
-    negSetExcludeMatchNotify (s, NEGScreenOptionChanged);
 
     /* wrap overloaded functions */
     WRAP (ns, s, drawWindowTexture, NEGDrawWindowTexture);
@@ -753,6 +782,7 @@ NEGInitWindow (CompPlugin *p,
 	return FALSE;
 
     nw->isNeg       = FALSE;
+    nw->matched     = FALSE;
 
     w->base.privates[ns->windowPrivateIndex].ptr = nw;
 
openSUSE Build Service is sponsored by