[PATCH] Bring fullscreen rectangle calculation in line with EWMH.

Danny Baumann dannybaumann at web.de
Wed Dec 31 04:01:29 PST 2008


---
 src/window.c |   73 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 37 insertions(+), 36 deletions(-)

diff --git a/src/window.c b/src/window.c
index 8ee080f..b65c54a 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1359,54 +1359,55 @@ setWindowFullscreenMonitors (CompWindow               *w,
 {
     CompScreen  *s = w->screen;
     CompDisplay *d = s->display;
-    Region      region = NULL;
-    long        data[4];
+    Bool        hadFsMonitors = w->fullscreenMonitorsSet;
 
-    /* sanity check monitor numbers */
-    if (monitors->left >= s->nOutputDev || monitors->right  >= s->nOutputDev ||
-	monitors->top  >= s->nOutputDev || monitors->bottom >= s->nOutputDev)
+    w->fullscreenMonitorsSet = FALSE;
+
+    if (monitors                         &&
+	monitors->left   < s->nOutputDev &&
+	monitors->right  < s->nOutputDev &&
+	monitors->top    < s->nOutputDev &&
+	monitors->bottom < s->nOutputDev)
     {
-	monitors = NULL;
-    }
+	BOX fsBox;
 
-    if (monitors)
-	region = XCreateRegion ();
+	fsBox.x1 = s->outputDev[monitors->left].region.extents.x1;
+	fsBox.y1 = s->outputDev[monitors->top].region.extents.y1;
+	fsBox.x2 = s->outputDev[monitors->right].region.extents.x2;
+	fsBox.y2 = s->outputDev[monitors->bottom].region.extents.y2;
 
-    if (!monitors || !region)
-    {
-	if (w->fullscreenMonitorsSet)
+	if (fsBox.x1 < fsBox.x2 && fsBox.y1 < fsBox.y2)
 	{
-	    w->fullscreenMonitorsSet = FALSE;
-	    XDeleteProperty (d->display, w->id, d->wmFullscreenMonitorsAtom);
-	}
+	    w->fullscreenMonitorsSet = TRUE;
 
-	return;
+	    w->fullscreenMonitorRect.x      = fsBox.x1;
+	    w->fullscreenMonitorRect.y      = fsBox.y1;
+	    w->fullscreenMonitorRect.width  = fsBox.x2 - fsBox.x1;
+	    w->fullscreenMonitorRect.height = fsBox.y2 - fsBox.y1;
+	}
     }
 
-    XUnionRegion (region, &s->outputDev[monitors->top].region, region);
-    XUnionRegion (region, &s->outputDev[monitors->bottom].region, region);
-    XUnionRegion (region, &s->outputDev[monitors->left].region, region);
-    XUnionRegion (region, &s->outputDev[monitors->right].region, region);
-
-    w->fullscreenMonitorsSet   = TRUE;
-    w->fullscreenMonitorRect.x      = region->extents.x1;
-    w->fullscreenMonitorRect.y      = region->extents.y1;
-    w->fullscreenMonitorRect.width  = region->extents.x2 - region->extents.x1;
-    w->fullscreenMonitorRect.height = region->extents.y2 - region->extents.y1;
-
-    XDestroyRegion (region);
+    if (w->fullscreenMonitorsSet)
+    {
+	long data[4];
 
-    data[0] = monitors->top;
-    data[1] = monitors->bottom;
-    data[2] = monitors->left;
-    data[3] = monitors->right;
+	data[0] = monitors->top;
+	data[1] = monitors->bottom;
+	data[2] = monitors->left;
+	data[3] = monitors->right;
 
-    XChangeProperty (d->display, w->id, d->wmFullscreenMonitorsAtom,
-		     XA_CARDINAL, 32, PropModeReplace,
-		     (unsigned char *) data, 4);
+	XChangeProperty (d->display, w->id, d->wmFullscreenMonitorsAtom,
+			 XA_CARDINAL, 32, PropModeReplace,
+			 (unsigned char *) data, 4);
+    }
+    else if (hadFsMonitors)
+    {
+	XDeleteProperty (d->display, w->id, d->wmFullscreenMonitorsAtom);
+    }
 
     if (w->state & CompWindowStateFullscreenMask)
-	updateWindowAttributes (w, CompStackingUpdateModeNone);
+	if (w->fullscreenMonitorsSet || hadFsMonitors)
+	    updateWindowAttributes (w, CompStackingUpdateModeNone);
 }
 
 static void
-- 
1.6.0.6


--=-dRqhaWWe5Kh+JBuJYoHq--



More information about the compiz mailing list