SOURCES: compiz-minimize-scaler-mod.patch (NEW) zoom in newly crea...

wolf wolf at pld-linux.org
Sat Apr 1 20:57:24 CEST 2006


Author: wolf                         Date: Sat Apr  1 18:57:24 2006 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
zoom in newly created windows; from compiz mail list

---- Files affected:
SOURCES:
   compiz-minimize-scaler-mod.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/compiz-minimize-scaler-mod.patch
diff -u /dev/null SOURCES/compiz-minimize-scaler-mod.patch:1.1
--- /dev/null	Sat Apr  1 20:57:24 2006
+++ SOURCES/compiz-minimize-scaler-mod.patch	Sat Apr  1 20:57:19 2006
@@ -0,0 +1,303 @@
+Index: plugins/minimize.c
+===================================================================
+RCS file: /cvs/xorg/app/compiz/plugins/minimize.c,v
+retrieving revision 1.3
+diff -u -r1.3 minimize.c
+--- plugins/minimize.c	31 Mar 2006 11:22:34 -0000	1.3
++++ plugins/minimize.c	1 Apr 2006 16:20:55 -0000
+@@ -26,6 +26,7 @@
+ #include <X11/Xatom.h>
+ 
+ #include <stdlib.h>
++#include <stdio.h>
+ #include <string.h>
+ #include <math.h>
+ 
+@@ -41,6 +42,8 @@
+ #define MIN_TIMESTEP_MAX       50.0f
+ #define MIN_TIMESTEP_PRECISION 0.1f
+ 
++#define FAKE_ICON_SIZE         4
++
+ static char *winType[] = {
+     "Toolbar",
+     "Utility",
+@@ -61,7 +64,9 @@
+ #define MIN_SCREEN_OPTION_SPEED       0
+ #define MIN_SCREEN_OPTION_TIMESTEP    1
+ #define MIN_SCREEN_OPTION_WINDOW_TYPE 2
+-#define MIN_SCREEN_OPTION_NUM         3
++#define MIN_SCREEN_OPTION_ON_CREATE   3
++#define MIN_SCREEN_OPTION_CENTER      4
++#define MIN_SCREEN_OPTION_NUM         5
+ 
+ typedef struct _MinScreen {
+     int	windowPrivateIndex;
+@@ -81,6 +86,8 @@
+     unsigned int wMask;
+ 
+     int moreAdjust;
++    Bool scaleInNewWindows;
++    Bool scaleFromCenter;
+ } MinScreen;
+ 
+ typedef struct _MinWindow {
+@@ -95,6 +102,7 @@
+     int state, newState;
+ 
+     int unmapCnt;
++    int destroyCnt;
+ } MinWindow;
+ 
+ #define GET_MIN_DISPLAY(d)				    \
+@@ -119,6 +127,23 @@
+ 
+ #define NUM_OPTIONS(s) (sizeof ((s)->opt) / sizeof (CompOption))
+ 
++static Bool
++getMousePointerXY(CompScreen *s, short *x, short *y)
++{
++    Window w1, w2;
++    int xp, yp, xj, yj;
++    unsigned int m;
++    
++    if (XQueryPointer (s->display->display, s->root, &w1, &w2, &xj, &yj, &xp, &yp, &m))
++    {
++        *x = xp;
++        *y = yp;
++        return TRUE;
++    }
++    
++    return FALSE;
++}
++
+ static CompOption *
+ minGetScreenOptions (CompScreen *screen,
+ 		     int	*count)
+@@ -164,6 +189,19 @@
+ 	    ms->wMask = compWindowTypeMaskFromStringList (&o->value);
+ 	    return TRUE;
+ 	}
++	break;
++    case MIN_SCREEN_OPTION_ON_CREATE:
++	if (compSetBoolOption (o, value))
++	{
++	    ms->scaleInNewWindows = o->value.b;
++	    return TRUE;
++	}
++    case MIN_SCREEN_OPTION_CENTER:
++	if (compSetBoolOption (o, value))
++	{
++	    ms->scaleFromCenter = o->value.b;
++	    return TRUE;
++	}
+     default:
+ 	break;
+     }
+@@ -210,8 +248,22 @@
+ 	o->value.list.value[i].s = strdup (winType[i]);
+     o->rest.s.string     = windowTypeString;
+     o->rest.s.nString    = nWindowTypeString;
+-
+     ms->wMask = compWindowTypeMaskFromStringList (&o->value);
++
++    o = &ms->opt[MIN_SCREEN_OPTION_ON_CREATE];
++    o->name      = "zoom_created_windows";
++    o->shortDesc = "Zoom Created Windows";
++    o->longDesc  = "Zooms created windows in from cursor/center";
++    o->type      = CompOptionTypeBool;
++    o->value.b   = TRUE;
++    
++    o = &ms->opt[MIN_SCREEN_OPTION_CENTER];
++    o->name      = "zoom_created_windows_from_center";
++    o->shortDesc = "Zoom Created Windows from Center";
++    o->longDesc  = "Zooms created windows in from center instead of cursor";
++    o->type      = CompOptionTypeBool;
++    o->value.b   = FALSE;
++
+ }
+ 
+ static Bool
+@@ -286,7 +338,7 @@
+ 
+     MIN_WINDOW (w);
+ 
+-    if (mw->newState == IconicState)
++    if (mw->newState == IconicState || mw->newState == WithdrawnState)
+     {
+ 	x1 = mw->icon.x;
+ 	y1 = mw->icon.y;
+@@ -357,6 +409,11 @@
+ 	mw->ty = y1 - w->attrib.y;
+ 	mw->xScale = xScale;
+ 	mw->yScale = yScale;
++	if (mw->destroyCnt)
++	{
++	    destroyWindow (w);
++	    mw->destroyCnt--;
++	}
+ 
+ 	return 0;
+     }
+@@ -531,6 +588,21 @@
+ 	    }
+ 	}
+ 	break;
++    case DestroyNotify:
++        w = findWindowAtDisplay (d, event->xunmap.window);
++        /* mark it for zooming out */
++        if (w)
++        {
++            MIN_SCREEN (w->screen);
++            if (ms->wMask & w->type)
++            {
++                MIN_WINDOW(w);
++                mw->destroyCnt++;
++                w->destroyRefCnt++;
++                addWindowDamage(w);
++            }
++        }
++        break;
+     case UnmapNotify:
+ 	w = findWindowAtDisplay (d, event->xunmap.window);
+ 	if (w)
+@@ -564,13 +636,39 @@
+ 	    else  /* X -> Withdrawn */
+ 	    {
+ 		MIN_WINDOW (w);
+-
+-		if (mw->state == IconicState)
+-		{
+-		    (*w->screen->setWindowScale) (w, 1.0f, 1.0f);
+-		    mw->state = NormalState;
+-		}
+-	    }
++                if (ms->wMask & w->type)
++                {
++		      if (mw->state == IconicState)
++		      {
++                          (*w->screen->setWindowScale) (w, 1.0f, 1.0f);
++		      }
++                      
++                      mw->state = NormalState;
++                      mw->newState = WithdrawnState;
++                      
++                      /* let's zoom windows on hide */
++                      if (getMousePointerXY (w->screen, &mw->icon.x, &mw->icon.y) &&
++                          ms->scaleInNewWindows && (ms->wMask & w->type))
++                      {
++                          mw->icon.width = FAKE_ICON_SIZE;
++                          mw->icon.height = FAKE_ICON_SIZE;
++                          mw->icon.x -= FAKE_ICON_SIZE/2;
++                          mw->icon.y -= FAKE_ICON_SIZE/2;
++                          
++                          if (ms->scaleFromCenter)
++                          {
++                              mw->icon.x = w->attrib.x + w->attrib.width/2 - FAKE_ICON_SIZE/2;
++                              mw->icon.y = w->attrib.y + w->attrib.height/2 - FAKE_ICON_SIZE/2;
++                          }
++                          
++                          mw->adjust = TRUE;
++                          ms->moreAdjust = TRUE;
++                          mw->unmapCnt++;
++                          w->unmapRefCnt++;
++                          addWindowDamage (w);
++                      }
++                }
++            }
+ 	}
+     default:
+ 	break;
+@@ -630,6 +728,33 @@
+ 		(*w->screen->setWindowScale) (w, 1.0f, 1.0f);
+ 	    }
+ 	}
++        else if (mw->state != NormalState)
++        {
++            if (getMousePointerXY(w->screen,&mw->icon.x,&mw->icon.y) && ms->scaleInNewWindows)
++            {
++                mw->icon.width  = FAKE_ICON_SIZE;
++                mw->icon.height = FAKE_ICON_SIZE;
++                mw->icon.x -= FAKE_ICON_SIZE/2;
++                mw->icon.y -= FAKE_ICON_SIZE/2;
++                
++                if (ms->scaleFromCenter)
++                {
++                    mw->icon.x = w->attrib.x + w->attrib.width/2  - FAKE_ICON_SIZE/2;
++                    mw->icon.y = w->attrib.y + w->attrib.height/2 - FAKE_ICON_SIZE/2;
++                }
++                
++                mw->tx = mw->icon.x-w->attrib.x;
++                mw->ty = mw->icon.y-w->attrib.y;
++                mw->xScale = ((float)FAKE_ICON_SIZE) / w->attrib.width;
++                mw->yScale = ((float)FAKE_ICON_SIZE) / w->attrib.height;
++                
++                mw->state = IconicState; /* we're doing this as a hack, it may not be necessary */
++                mw->newState = NormalState;
++                mw->adjust = TRUE;
++                ms->moreAdjust = TRUE;
++                addWindowDamage (w);
++            }
++        }
+ 
+ 	mw->newState = NormalState;
+     }
+@@ -649,7 +774,7 @@
+     MIN_SCREEN (w->screen);
+     MIN_WINDOW (w);
+ 
+-    if (mw->unmapCnt)
++    if (mw->unmapCnt || mw->destroyCnt)
+ 	return FALSE;
+ 
+     UNWRAP (ms, w->screen, focusWindow);
+@@ -723,6 +848,8 @@
+ 
+     ms->speed    = MIN_SPEED_DEFAULT;
+     ms->timestep = MIN_TIMESTEP_DEFAULT;
++    ms->scaleInNewWindows = TRUE;
++    ms->scaleFromCenter   = FALSE;
+ 
+     minScreenInitOptions (ms);
+ 
+@@ -775,11 +902,40 @@
+     mw->xScaleVelocity = mw->yScaleVelocity = 1.0f;
+ 
+     mw->unmapCnt = 0;
++    mw->destroyCnt = 0;
+ 
+     mw->state = mw->newState = minGetWindowState (w);
+ 
+     w->privates[ms->windowPrivateIndex].ptr = mw;
+ 
++    /* use a 'virtual' icon of 32x32 at mpx-16,mpy-16 */
++    /* TODO consider changing this to a configurable thing somehow */
++    if (w->type & ms->wMask && ms->scaleInNewWindows && mw->state == NormalState)
++    {
++        if (getMousePointerXY (w->screen, &mw->icon.x, &mw->icon.y))
++        {
++            mw->icon.width = FAKE_ICON_SIZE;
++            mw->icon.height = FAKE_ICON_SIZE;
++            mw->icon.x -= FAKE_ICON_SIZE / 2;
++            mw->icon.y -= FAKE_ICON_SIZE / 2;
++            if (ms->scaleFromCenter)
++            {
++                mw->icon.x = w->attrib.x + w->attrib.width/2 - FAKE_ICON_SIZE/2;
++                mw->icon.y = w->attrib.y + w->attrib.height/2 - FAKE_ICON_SIZE/2;
++            }
++            
++            mw->tx = mw->icon.x - w->attrib.x;
++            mw->ty = mw->icon.y - w->attrib.y;
++            mw->xScale = ((float)FAKE_ICON_SIZE) / w->attrib.width;
++            mw->yScale = ((float)FAKE_ICON_SIZE) / w->attrib.height;
++            mw->state = IconicState; /* we're doing this as a hack, it may not be necessary */
++            mw->newState = NormalState;
++            mw->adjust=TRUE;
++            ms->moreAdjust=TRUE;
++            addWindowDamage (w);
++        }
++    }
++
+     return TRUE;
+ }
+ 
================================================================


More information about the pld-cvs-commit mailing list