All pastes #475612 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-05-07 15:35 UTC
rendered paste body
From 238f71e2b777c5332f03c63ccb5f5650fc05d78d Mon Sep 17 00:00:00 2001
From: Roi Cohen <roico@roico-desktop.(none)>
Date: Sun, 22 Apr 2007 14:10:14 +0300
Subject: [PATCH] transparent cube

---
 plugins/cube.c |  244 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 223 insertions(+), 21 deletions(-)

diff --git a/plugins/cube.c b/plugins/cube.c
index 78583a9..f12b99b 100644
--- a/plugins/cube.c
+++ b/plugins/cube.c
@@ -92,6 +92,21 @@ static char *cubeImages[] = {
 #define CUBE_ACCELERATION_MAX       20.0f
 #define CUBE_ACCELERATION_PRECISION 0.1f
 
+#define CUBE_FADE_TIME_DEFAULT			1.0
+#define CUBE_FADE_TIME_MAX			10.0
+#define CUBE_FADE_TIME_MIN			0.0
+#define CUBE_FADE_TIME_PRECISION		0.1
+
+#define CUBE_OPACITY_MIN 0.0
+#define CUBE_OPACITY_MAX 100.0
+#define CUBE_OPACITY_PRECISION 1.0
+
+#define CUBE_TRANSPARENT_MANUAL_ONLY_DEFAULT FALSE
+
+#define CUBE_ACTIVE_OPACITY_DEFAULT	30
+
+#define CUBE_INACTIVE_OPACITY_DEFAULT	100
+
 #define CUBE_SPEED_DEFAULT   1.5f
 #define CUBE_SPEED_MIN       0.1f
 #define CUBE_SPEED_MAX       50.0f
@@ -119,21 +134,25 @@ typedef struct _CubeDisplay {
     HandleCompizEventProc handleCompizEvent;
 } CubeDisplay;
 
-#define CUBE_SCREEN_OPTION_COLOR	      0
-#define CUBE_SCREEN_OPTION_IN		      1
-#define CUBE_SCREEN_OPTION_SCALE_IMAGE	      2
-#define CUBE_SCREEN_OPTION_IMAGES	      3
-#define CUBE_SCREEN_OPTION_SKYDOME	      4
-#define CUBE_SCREEN_OPTION_SKYDOME_IMG	      5
-#define CUBE_SCREEN_OPTION_SKYDOME_ANIM	      6
-#define CUBE_SCREEN_OPTION_SKYDOME_GRAD_START 7
-#define CUBE_SCREEN_OPTION_SKYDOME_GRAD_END   8
-#define CUBE_SCREEN_OPTION_ACCELERATION	      9
-#define CUBE_SCREEN_OPTION_SPEED	      10
-#define CUBE_SCREEN_OPTION_TIMESTEP	      11
-#define CUBE_SCREEN_OPTION_MIPMAP	      12
-#define CUBE_SCREEN_OPTION_BACKGROUNDS	      13
-#define CUBE_SCREEN_OPTION_NUM                14
+#define CUBE_SCREEN_OPTION_COLOR	           0
+#define CUBE_SCREEN_OPTION_IN		           1
+#define CUBE_SCREEN_OPTION_SCALE_IMAGE	           2
+#define CUBE_SCREEN_OPTION_IMAGES	           3
+#define CUBE_SCREEN_OPTION_SKYDOME	           4
+#define CUBE_SCREEN_OPTION_SKYDOME_IMG	           5
+#define CUBE_SCREEN_OPTION_SKYDOME_ANIM	           6
+#define CUBE_SCREEN_OPTION_SKYDOME_GRAD_START      7
+#define CUBE_SCREEN_OPTION_SKYDOME_GRAD_END        8
+#define CUBE_SCREEN_OPTION_ACCELERATION	           9
+#define CUBE_SCREEN_OPTION_SPEED	           10
+#define CUBE_SCREEN_OPTION_TIMESTEP	           11
+#define CUBE_SCREEN_OPTION_MIPMAP	           12
+#define CUBE_SCREEN_OPTION_ACTIVE_OPACITY          13
+#define CUBE_SCREEN_OPTION_INACTIVE_OPACITY        14
+#define CUBE_SCREEN_OPTION_FADE_TIME               15
+#define CUBE_SCREEN_OPTION_TRANSPARENT_MANUAL_ONLY 16
+#define CUBE_SCREEN_OPTION_BACKGROUNDS	           17
+#define CUBE_SCREEN_OPTION_NUM                     18
 
 #define MULTM(x,y,z) \
 z[0] = x[0] * y[0] + x[4] * y[1] + x[8] * y[2] + x[12] * y[3]; \
@@ -172,6 +191,7 @@ typedef struct _CubeScreen {
     PaintScreenProc	       paintScreen;
     PaintTransformedScreenProc paintTransformedScreen;
     PaintBackgroundProc        paintBackground;
+    PaintWindowProc            paintWindow;
     ApplyScreenTransformProc   applyScreenTransform;
     SetScreenOptionProc	       setScreenOption;
     OutputChangeNotifyProc     outputChangeNotify;
@@ -225,6 +245,9 @@ typedef struct _CubeScreen {
     
     Bool disableCaps;
     Bool paintAllViewports;
+    
+    float desktopOpacity;
+    float toOpacity;
 
     CompTexture *bg;
     int		nBg;
@@ -1088,6 +1111,12 @@ cubeSetScreenOption (CompPlugin      *plugin,
 	    damageScreen (screen);
 	    return TRUE;
 	}
+	break;
+    case CUBE_SCREEN_OPTION_FADE_TIME:
+    case CUBE_SCREEN_OPTION_ACTIVE_OPACITY:
+    case CUBE_SCREEN_OPTION_INACTIVE_OPACITY:
+	if (compSetFloatOption (o,value))
+	    return TRUE;
     default:
 	break;
     }
@@ -1222,6 +1251,45 @@ cubeScreenInitOptions (CubeScreen *cs,
     o->type	  = CompOptionTypeBool;
     o->value.b    = CUBE_MIPMAP_DEFAULT;
 
+    o = &cs->opt[CUBE_SCREEN_OPTION_FADE_TIME];
+    o->name = "fade_time";
+    o->shortDesc = N_("Fade Time");
+    o->longDesc = N_("Desktop Window Opacity Fade Time.");
+    o->type = CompOptionTypeFloat;
+    o->value.f = CUBE_FADE_TIME_DEFAULT;
+    o->rest.f.min = CUBE_FADE_TIME_MIN;
+    o->rest.f.max = CUBE_FADE_TIME_MAX;
+    o->rest.f.precision = CUBE_FADE_TIME_PRECISION;
+
+    o = &cs->opt[CUBE_SCREEN_OPTION_ACTIVE_OPACITY];
+    o->name = "active_opacity";
+    o->shortDesc = N_("Opacity During Rotation");
+    o->longDesc = N_("Opacity of desktop window during rotation.");
+    o->type = CompOptionTypeFloat;
+    o->value.f = CUBE_ACTIVE_OPACITY_DEFAULT;
+    o->rest.f.min = CUBE_OPACITY_MIN;
+    o->rest.f.max = CUBE_OPACITY_MAX;
+    o->rest.f.precision = CUBE_OPACITY_PRECISION;
+
+    o = &cs->opt[CUBE_SCREEN_OPTION_INACTIVE_OPACITY];
+    o->name = "inactive_opacity";
+    o->shortDesc = N_("Opacity When Not Rotating");
+    o->longDesc = N_("Opacity of desktop window when not rotating.");
+    o->type = CompOptionTypeFloat;
+    o->value.f = CUBE_INACTIVE_OPACITY_DEFAULT;
+    o->rest.f.min = CUBE_OPACITY_MIN;
+    o->rest.f.max = CUBE_OPACITY_MAX;
+    o->rest.f.precision = CUBE_OPACITY_PRECISION;
+
+    o = &cs->opt[CUBE_SCREEN_OPTION_TRANSPARENT_MANUAL_ONLY];
+    o->name = "transparent_manual_only";
+    o->shortDesc = N_("Transparency Only\non Mouse Rotate");
+    o->longDesc =
+	N_
+	("Initiates Cube transparency only if rotation is mouse driven.");
+    o->type = CompOptionTypeBool;
+    o->value.b = CUBE_TRANSPARENT_MANUAL_ONLY_DEFAULT;
+
     o = &cs->opt[CUBE_SCREEN_OPTION_BACKGROUNDS];
     o->name	         = "backgrounds";
     o->shortDesc         = N_("Background Images");
@@ -1297,6 +1365,39 @@ cubePreparePaintScreen (CompScreen *s,
     }
 
     memset (cs->cleared, 0, sizeof (Bool) * s->nOutputDev);
+    
+    //transparency, mostly copied/ported from beryl's cube.c, orig. by onestone
+    if (cs->rotationMode != NoRotation && ((cs->rotationMode == RotationManual) || 
+		!(cs->opt[CUBE_SCREEN_OPTION_TRANSPARENT_MANUAL_ONLY].value.b)))
+    {
+	cs->toOpacity = 
+	      (cs->opt[CUBE_SCREEN_OPTION_ACTIVE_OPACITY].value.f / 100.0f) * OPAQUE;
+    }
+    else
+	cs->toOpacity =
+	    (cs->opt[CUBE_SCREEN_OPTION_INACTIVE_OPACITY].value.f / 100.0f) * OPAQUE;
+
+    if (cs->opt[CUBE_SCREEN_OPTION_FADE_TIME].value.f == 0.0f)
+	cs->desktopOpacity = cs->toOpacity;
+
+    else if (cs->desktopOpacity != cs->toOpacity)
+    {
+	float steps = (msSinceLastPaint * OPAQUE / 1000.0) /
+	    cs->opt[CUBE_SCREEN_OPTION_FADE_TIME].value.f;
+	if (steps < 12)
+	    steps = 12;
+
+	if (cs->toOpacity > cs->desktopOpacity)
+	{
+	    cs->desktopOpacity += steps;
+	    cs->desktopOpacity = MIN(cs->toOpacity, cs->desktopOpacity);
+	}
+	if (cs->toOpacity < cs->desktopOpacity)
+	{
+	    cs->desktopOpacity -= steps;
+	    cs->desktopOpacity = MAX(cs->toOpacity, cs->desktopOpacity);
+	}
+    }
 
     UNWRAP (cs, s, preparePaintScreen);
     (*s->preparePaintScreen) (s, msSinceLastPaint);
@@ -1316,7 +1417,7 @@ cubePaintScreen (CompScreen		 *s,
 
     CUBE_SCREEN (s);
 
-    if (cs->grabIndex)
+    if (cs->grabIndex || cs->desktopOpacity != OPAQUE)
     {
 	mask &= ~PAINT_SCREEN_REGION_MASK;
 	mask |= PAINT_SCREEN_TRANSFORMED_MASK;
@@ -1334,7 +1435,7 @@ cubeDonePaintScreen (CompScreen *s)
 {
     CUBE_SCREEN (s);
 
-    if (cs->grabIndex)
+    if (cs->grabIndex || cs->desktopOpacity != cs->toOpacity)
 	damageScreen (s);
 
     UNWRAP (cs, s, donePaintScreen);
@@ -1533,12 +1634,20 @@ cubePaintTransformedScreen (CompScreen		    *s,
     int		      hsize, xMove = 0;
     float	      size;
     Bool	      clear;
+    Bool wasCulled = FALSE;
     GLenum filter = s->display->textureFilter;
 
     CUBE_SCREEN (s);
 
     hsize = s->hsize * cs->nOutput;
     size  = hsize;
+    
+    if (cs->desktopOpacity != OPAQUE)
+    {
+	wasCulled = glIsEnabled(GL_CULL_FACE);
+	if (wasCulled)
+	    glDisable(GL_CULL_FACE);
+    }
 
     if (!cs->fullscreenOutput)
     {
@@ -1647,7 +1756,7 @@ cubePaintTransformedScreen (CompScreen		    *s,
 	mask |= PAINT_SCREEN_ORDER_FRONT_TO_BACK_MASK;	// Outside cube - start with FTB faces.
 	                                              	// Inside cube - start with BTF faces.
     
-    if (cs->paintAllViewports || cs->invert == -1)
+    if (cs->paintAllViewports || cs->desktopOpacity != OPAQUE || cs->invert == -1)
 	cubePaintAllViewports(s, &sa, transform, region, output, mask, xMove, size, hsize);
     
     if (cs->invert == 1)
@@ -1662,7 +1771,7 @@ cubePaintTransformedScreen (CompScreen		    *s,
 
 	screenLighting (s, TRUE);
 
-	glColor3usv (cs->color);
+	glColor4us (cs->color[0], cs->color[1], cs->color[2], cs->desktopOpacity);
 
 	glPushMatrix ();
 
@@ -1672,6 +1781,13 @@ cubePaintTransformedScreen (CompScreen		    *s,
 	glTranslatef (cs->outputXOffset, -cs->outputYOffset, 0.0f);
 	glScalef (cs->outputXScale, cs->outputYScale, 1.0f);
 	sa.yRotate -= 360.0f / size;
+	
+	if (cs->desktopOpacity != OPAQUE)
+	{
+	    screenTexEnvMode (s, GL_MODULATE);
+	    glEnable(GL_BLEND);
+	    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	}
 
 	glVertexPointer (3, GL_FLOAT, 0, cs->vertices);
 
@@ -1710,17 +1826,68 @@ cubePaintTransformedScreen (CompScreen		    *s,
 	
 	glColor4usv (defaultColor);
 	glEnableClientState (GL_TEXTURE_COORD_ARRAY);
+	
+	screenTexEnvMode(s, GL_REPLACE);
+	glDisable(GL_BLEND);
+	glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
     }
     
-    if (cs->paintAllViewports || cs->invert == 1)
+    if (cs->paintAllViewports || cs->desktopOpacity != OPAQUE || cs->invert == 1)
 	cubePaintAllViewports(s, &sa, transform, region, output, mask, xMove, size, hsize);
     
     s->display->textureFilter = filter;
     
+    if (cs->desktopOpacity != OPAQUE && wasCulled)
+	glEnable(GL_CULL_FACE);
+    
     WRAP (cs, s, paintTransformedScreen, cubePaintTransformedScreen);
 }
 
 static void
+cubeSetBackgroundOpacity(CompScreen* s)
+{
+    CUBE_SCREEN(s);
+
+    if (cs->desktopOpacity != OPAQUE)
+    {
+	if (s->desktopWindowCount)
+	{
+	    glColor4us(0, 0, 0, 0);
+	    glEnable(GL_BLEND);
+	}
+	else
+	{
+	    glColor4us(0xffff, 0xffff, 0xffff, cs->desktopOpacity);
+	    glEnable(GL_BLEND);
+	    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+	    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+	}
+    }
+}
+
+static void
+cubeUnSetBackgroundOpacity(CompScreen* s)
+{
+    CUBE_SCREEN(s);
+
+    if (cs->desktopOpacity != OPAQUE)
+    {
+	if (s->desktopWindowCount)
+	{
+	    glColor3usv(defaultColor);
+	    glDisable(GL_BLEND);
+	}
+	else
+	{
+	    glColor3usv(defaultColor);
+	    glDisable(GL_BLEND);
+	    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
+	    screenTexEnvMode(s, GL_REPLACE);
+	}
+    }
+}
+
+static void
 cubePaintBackground (CompScreen   *s,
 		     Region	  region,
 		     unsigned int mask)
@@ -1728,6 +1895,8 @@ cubePaintBackground (CompScreen   *s,
     int n;
 
     CUBE_SCREEN (s);
+    
+    cubeSetBackgroundOpacity(s);
 
     n = cs->opt[CUBE_SCREEN_OPTION_BACKGROUNDS].value.list.nValue;
     if (n)
@@ -1745,6 +1914,7 @@ cubePaintBackground (CompScreen   *s,
 	if (s->desktopWindowCount)
 	{
 	    cubeUnloadBackgrounds (s);
+	    cubeUnSetBackgroundOpacity(s);
 	    return;
 	}
 	else
@@ -1757,8 +1927,11 @@ cubePaintBackground (CompScreen   *s,
 
 	data = malloc (sizeof (GLfloat) * nBox * 16);
 	if (!data)
+	{
+	    cubeUnSetBackgroundOpacity(s);
 	    return;
-
+	}
+	
 	d = data;
 	n = nBox;
 	while (n--)
@@ -1814,6 +1987,31 @@ cubePaintBackground (CompScreen   *s,
 	(*s->paintBackground) (s, region, mask);
 	WRAP (cs, s, paintBackground, cubePaintBackground);
     }
+    
+    cubeUnSetBackgroundOpacity(s);
+}
+
+static Bool
+cubePaintWindow (CompWindow		  *w,
+		 const WindowPaintAttrib  *attrib,
+		 const CompTransform	  *transform,
+		 Region			  region,
+		 unsigned int		  mask)
+{
+    Bool status;
+    CompScreen* s = w->screen;
+    CUBE_SCREEN(s);
+    
+    WindowPaintAttrib wa = *attrib;
+
+    if (w->type & CompWindowTypeDesktopMask)
+	wa.opacity = cs->desktopOpacity;
+
+    UNWRAP (cs, s, paintWindow);
+    status = (*s->paintWindow) (w, &wa, transform, region, mask);
+    WRAP (cs, s, paintWindow, cubePaintWindow);
+    
+    return status;
 }
 
 static void cubeSetClipPlanes (CompScreen *s, Region region, int output)
@@ -2325,6 +2523,8 @@ cubeInitScreen (CompPlugin *p,
     cs->disableCaps = FALSE;
     cs->paintAllViewports = FALSE;
     cs->rotationMode = NoRotation;
+    
+    cs->desktopOpacity = (CUBE_INACTIVE_OPACITY_DEFAULT / 100.0f) * OPAQUE;
 
     memset (cs->cleared, 0, sizeof (cs->cleared));
 
@@ -2340,6 +2540,7 @@ cubeInitScreen (CompPlugin *p,
     WRAP (cs, s, paintScreen, cubePaintScreen);
     WRAP (cs, s, paintTransformedScreen, cubePaintTransformedScreen);
     WRAP (cs, s, paintBackground, cubePaintBackground);
+    WRAP (cs, s, paintWindow, cubePaintWindow);
     WRAP (cs, s, applyScreenTransform, cubeApplyScreenTransform);
     WRAP (cs, s, setScreenOption, cubeSetGlobalScreenOption);
     WRAP (cs, s, outputChangeNotify, cubeOutputChangeNotify);
@@ -2376,6 +2577,7 @@ cubeFiniScreen (CompPlugin *p,
     UNWRAP (cs, s, paintScreen);
     UNWRAP (cs, s, paintTransformedScreen);
     UNWRAP (cs, s, paintBackground);
+    UNWRAP (cs, s, paintWindow);
     UNWRAP (cs, s, applyScreenTransform);
     UNWRAP (cs, s, setScreenOption);
     UNWRAP (cs, s, outputChangeNotify);
-- 
1.4.4.2