All pastes #674500 Raw Edit

Unbenannt

public text v1 · immutable
#674500 ·published 2007-08-29 09:31 UTC
rendered paste body
diff --git a/workarounds.c b/workarounds.c
index be4fd8e..20d7c8d 100644
--- a/workarounds.c
+++ b/workarounds.c
@@ -220,12 +220,44 @@ workaroundsDoFixes (CompWindow *w)
 
     recalcWindowType (w);
 
-    if (workaroundsGetLegacyFullscreen (w->screen->display))
+    if (workaroundsGetLegacyFullscreen (w->screen->display) &&
+	(!(w->type & CompWindowTypeDesktopMask)))
     {
-        /* Some code to make Wine and legacy applications work. */
-        if (w->width == w->screen->width && w->height == w->screen->height &&
-            !(w->type & CompWindowTypeDesktopMask))
-                w->type = CompWindowTypeFullscreenMask;
+	Bool   isFullSize;
+	int    output;
+	BoxPtr box;
+
+	/* get output region for window */
+	output = outputDeviceForGeometry (w->screen,
+					  w->serverX, w->serverY,
+					  w->serverWidth, w->serverHeight,
+					  w->serverBorderWidth);
+
+	box = &w->screen->outputDev[output].region.extents;
+
+	/* does the size match the output rectangle? */
+	isFullSize = (w->serverX == box->x1) && (w->serverY == box->y1) &&
+	             (w->serverWidth == (box->x2 - box->x1)) &&
+		     (w->serverHeight == (box->y2 - box->y1));
+
+	printf ("window %d (%s) : isFull %d, state %x\n", w->id,
+		w->resName, isFullSize, w->state);
+	if ((isFullSize && !(w->state & CompWindowStateFullscreenMask)) ||
+	    (!isFullSize && (w->state & CompWindowStateFullscreenMask)))
+	{
+	    unsigned int state = w->state & ~CompWindowStateFullscreenMask;
+
+	    if (isFullSize)
+		state |= CompWindowStateFullscreenMask;
+
+	    if (state != w->state)
+	    {
+		changeWindowState (w, state);
+		recalcWindowType (w);
+		recalcWindowActions (w);
+		updateWindowAttributes (w, CompStackingUpdateModeNormal);
+	    }
+	}
     }
 }