[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

compiz: Changes to 'debian-unstable'



 .gitignore                                    |   47 
 Makefile.am                                   |   15 
 NEWS                                          |   34 
 configure.ac                                  |    6 
 gtk/gnome/50-compiz-desktop-key.xml.in        |   10 
 gtk/gnome/50-compiz-key.xml.in                |    4 
 include/compiz-core.h                         |   30 
 kde/window-decorator-kde4/Makefile.am         |    3 
 kde/window-decorator-kde4/decorator.cpp       |  169 -
 kde/window-decorator-kde4/decorator.h         |   31 
 kde/window-decorator-kde4/main.cpp            |   82 
 kde/window-decorator-kde4/paintredirector.cpp |  125 +
 kde/window-decorator-kde4/paintredirector.h   |   60 
 kde/window-decorator-kde4/switcher.cpp        |   39 
 kde/window-decorator-kde4/switcher.h          |    2 
 kde/window-decorator-kde4/utils.h             |    6 
 kde/window-decorator-kde4/window.cpp          | 1103 ++-------
 kde/window-decorator-kde4/window.h            |   77 
 metadata/core.xml.in.in                       |    2 
 metadata/gnomecompat.xml.in                   |    2 
 metadata/obs.xml.in                           |   24 
 metadata/place.xml.in                         |   46 
 metadata/screenshot.xml.in                    |    9 
 plugins/annotate.c                            |    4 
 plugins/blur.c                                |    3 
 plugins/clone.c                               |    2 
 plugins/cube.c                                |    2 
 plugins/decoration.c                          |   37 
 plugins/fuse.c                                |    3 
 plugins/glib.c                                |   13 
 plugins/move.c                                |   61 
 plugins/place.c                               |  725 +++++-
 plugins/regex.c                               |   11 
 plugins/resize.c                              |  344 ++
 plugins/rotate.c                              |   31 
 plugins/scale.c                               |   27 
 plugins/screenshot.c                          |  132 +
 plugins/switcher.c                            |  175 -
 plugins/water.c                               |    2 
 plugins/wobbly.c                              |  132 +
 plugins/zoom.c                                |    4 
 po/POTFILES.in                                |    1 
 po/POTFILES.skip                              |    1 
 po/af.po                                      |  112 
 po/ar.po                                      |  127 -
 po/as.po                                      | 2624 ++++++++++++++++++++++
 po/be.po                                      | 2738 +++++++++++++++++++++++
 po/bg.po                                      |  334 +-
 po/bn.po                                      |  133 -
 po/bn_IN.po                                   |  133 -
 po/bs.po                                      |  106 
 po/ca.po                                      |  131 -
 po/cs.po                                      |  141 -
 po/cy.po                                      |  120 -
 po/da.po                                      |  163 -
 po/de.po                                      |  196 -
 po/el.po                                      |  399 +--
 po/en_GB.po                                   |  122 -
 po/es.po                                      |  455 +--
 po/et.po                                      |  122 -
 po/eu.po                                      |  290 --
 po/fa.po                                      | 2634 ++++++++++++++++++++++
 po/fi.po                                      |  264 --
 po/fr.po                                      |  279 +-
 po/gl.po                                      |  617 ++---
 po/gu.po                                      |  131 -
 po/he.po                                      |  302 +-
 po/hi.po                                      |  127 -
 po/hr.po                                      |  128 -
 po/hu.po                                      |  259 --
 po/id.po                                      |  104 
 po/it.po                                      | 1243 +++++-----
 po/ja.po                                      |  694 ++----
 po/ka.po                                      |   96 
 po/km.po                                      |  122 -
 po/ko.po                                      |  437 +--
 po/lo.po                                      |   96 
 po/lt.po                                      |  122 -
 po/mk.po                                      |   97 
 po/ml_IN.po                                   | 3000 ++++++++++++++++++++++++++
 po/nb.po                                      |  139 -
 po/nl.po                                      |  141 -
 po/or.po                                      |  139 -
 po/pa.po                                      |  127 -
 po/pl.po                                      |  474 +---
 po/pt.po                                      |  282 --
 po/pt_BR.po                                   |  139 -
 po/ro.po                                      |  141 -
 po/ru.po                                      |  301 +-
 po/sk.po                                      |  139 -
 po/sl.po                                      |  126 -
 po/sr.po                                      |  132 -
 po/sv.po                                      |  139 -
 po/ta.po                                      |  111 
 po/tr.po                                      |  147 -
 po/uk.po                                      | 1651 +++++---------
 po/vi.po                                      |   96 
 po/xh.po                                      |  112 
 po/zh_CN.po                                   |  413 +--
 po/zh_TW.po                                   | 1279 ++++-------
 po/zu.po                                      |  112 
 src/Makefile.am                               |    2 
 src/display.c                                 |  100 
 src/event.c                                   |   94 
 src/main.c                                    |   17 
 src/plugin.c                                  |    3 
 src/screen.c                                  |  317 +-
 src/texture.c                                 |    4 
 src/window.c                                  |  214 +
 109 files changed, 19836 insertions(+), 10089 deletions(-)

New commits:
commit 79a275b240a98d9f64c8dd1e799e5d469ec8f204
Author: Danny Baumann <dannybaumann@web.de>
Date:   Wed Jan 20 15:05:10 2010 +0100

    Fix window region calculation for windows that have border width set.

diff --git a/src/window.c b/src/window.c
index 90922d1..e7bb987 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1701,8 +1701,8 @@ updateWindowRegion (CompWindow *w)
     {
 	r.x      = -w->attrib.border_width;
 	r.y      = -w->attrib.border_width;
-	r.width  = w->width;
-	r.height = w->height;
+	r.width  = w->attrib.width + w->attrib.border_width;
+	r.height = w->attrib.height + w->attrib.border_width;
 
 	rects = &r;
 	n = 1;
@@ -1719,8 +1719,10 @@ updateWindowRegion (CompWindow *w)
     {
 	rect.extents.x1 = rects[i].x + w->attrib.border_width;
 	rect.extents.y1 = rects[i].y + w->attrib.border_width;
-	rect.extents.x2 = rect.extents.x1 + rects[i].width;
-	rect.extents.y2 = rect.extents.y1 + rects[i].height;
+	rect.extents.x2 = rect.extents.x1 + rects[i].width +
+			  w->attrib.border_width;
+	rect.extents.y2 = rect.extents.y1 + rects[i].height +
+			  w->attrib.border_width;
 
 	if (rect.extents.x1 < 0)
 	    rect.extents.x1 = 0;

commit af6a23a1e9e325a2488cfeceb12741bb1ab21e6c
Author: Erkin Bahceci <erkinbah@gmail.com>
Date:   Fri Dec 25 14:14:32 2009 -0600

    wobbly: Constrain throwing at the bottom as well.
    
    Backport from 7d75379a834afaed0e8621751c1b217966122765.

diff --git a/plugins/wobbly.c b/plugins/wobbly.c
index 7625c7e..e33e750 100644
--- a/plugins/wobbly.c
+++ b/plugins/wobbly.c
@@ -1709,27 +1709,46 @@ wobblyPreparePaintScreen (CompScreen *s,
 
 			if (!ww->grabbed && ws->grabWindowWorkArea)
 			{
+			    float topmostYPos    = MAXSHORT;
 			    float bottommostYPos = MINSHORT;
-			    int   i, decorTop;
+			    int   decorTop;
+			    int   decorTitleBottom;
+			    int   i;
 
-			    /* find the bottommost top-row object */
 			    for (i = 0; i < GRID_WIDTH; i++)
 			    {
 				int modelY = model->objects[i].position.y;
+
+				/* find the bottommost top-row object */
 				bottommostYPos = MAX (modelY, bottommostYPos);
+
+				/* find the topmost top-row object */
+				topmostYPos = MIN (modelY, topmostYPos);
 			    }
 
 			    decorTop = bottommostYPos +
 				       w->output.top - w->input.top;
+			    decorTitleBottom = topmostYPos + w->output.top;
 
 			    if (ws->grabWindowWorkArea->y > decorTop)
 			    {
-				/* constrain to work area */
+				/* constrain to work area box top edge */
 				modelMove (model, 0,
 					   ws->grabWindowWorkArea->y -
 					   decorTop);
 				modelCalcBounds (model);
 			    }
+			    else if (ws->grabWindowWorkArea->y +
+			    	     ws->grabWindowWorkArea->height <
+			    	     decorTitleBottom)
+			    {
+				/* constrain to work area box bottom edge */
+				modelMove (model, 0,
+					   ws->grabWindowWorkArea->y +
+					   ws->grabWindowWorkArea->height -
+					   decorTitleBottom);
+				modelCalcBounds (model);
+			    }
 			}
 		    }
 		    else

commit 275ebddc4af09ccdeefb8ab5a03cb3db24cc5a79
Author: Erkin Bahceci <erkinbah@gmail.com>
Date:   Fri Dec 25 14:08:17 2009 -0600

    wobbly: Fix warning.

diff --git a/plugins/wobbly.c b/plugins/wobbly.c
index 4dceb36..7625c7e 100644
--- a/plugins/wobbly.c
+++ b/plugins/wobbly.c
@@ -1699,8 +1699,6 @@ wobblyPreparePaintScreen (CompScreen *s,
 
 		    if (ww->wobbly)
 		    {
-			WOBBLY_DISPLAY (s->display);
-
 			/* snapped to more than one edge, we have to reduce
 			   edge escape velocity until only one edge is snapped */
 			if (ww->wobbly == WobblyForce && !ww->grabbed)

commit 6d5f911b83b523c7863ee1addbbcee38aec74db9
Author: Erkin Bahceci <erkinbah@gmail.com>
Date:   Fri Dec 25 14:05:50 2009 -0600

    wobbly: Fix y constraint on throwing.

diff --git a/plugins/wobbly.c b/plugins/wobbly.c
index 51f733e..4dceb36 100644
--- a/plugins/wobbly.c
+++ b/plugins/wobbly.c
@@ -1786,6 +1786,8 @@ wobblyPreparePaintScreen (CompScreen *s,
 		ws->wobblyWindows |= ww->wobbly;
 	    }
 	}
+	if (!ws->wobblyWindows)
+	    ws->grabWindowWorkArea = NULL;
     }
 
     UNWRAP (ws, s, preparePaintScreen);
@@ -2638,9 +2640,8 @@ wobblyWindowUngrabNotify (CompWindow *w)
 
     if (w == ws->grabWindow)
     {
-	ws->grabMask           = 0;
-	ws->grabWindow         = NULL;
-	ws->grabWindowWorkArea = NULL;
+	ws->grabMask   = 0;
+	ws->grabWindow = NULL;
     }
 
     if (ww->grabbed)

commit 6c9c0da40c2eb129b80ce6f4f759c889ba4eeaf5
Author: Erkin Bahceci <erkinbah@gmail.com>
Date:   Mon Dec 14 11:27:41 2009 -0600

    Complete the work area optimization.

diff --git a/plugins/resize.c b/plugins/resize.c
index 628bd90..06c43bc 100644
--- a/plugins/resize.c
+++ b/plugins/resize.c
@@ -317,7 +317,6 @@ static Region
 resizeGetConstraintRegion (CompScreen *s)
 {
     Region       region;
-    XRectangle   workArea;
     int          i;
 
     region = XCreateRegion ();
@@ -325,10 +324,7 @@ resizeGetConstraintRegion (CompScreen *s)
 	return NULL;
 
     for (i = 0; i < s->nOutputDev; i++)
-    {
-	getWorkareaForOutput (s, i, &workArea);
 	XUnionRectWithRegion (&s->outputDev[i].workArea, region, region);
-    }
 
     return region;
 }

commit 53976f1916a6659a75e0159a4dfbc1fb2188d34f
Author: Erkin Bahceci <erkinbah@gmail.com>
Date:   Mon Dec 14 11:21:27 2009 -0600

    Do the resize output snap only when "outside".

diff --git a/plugins/resize.c b/plugins/resize.c
index 32f3a97..628bd90 100644
--- a/plugins/resize.c
+++ b/plugins/resize.c
@@ -725,7 +725,7 @@ resizeHandleMotionEvent (CompScreen *s,
 	int    w, h;                    /* size of window contents */
 	int    wX, wY, wWidth, wHeight; /* rect. for window contents+borders */
 	int    i;
-	int    workAreaSnapDistance = 10;
+	int    workAreaSnapDistance = 15;
 
 	RESIZE_DISPLAY (s->display);
 
@@ -859,23 +859,23 @@ resizeHandleMotionEvent (CompScreen *s,
 	    {
 		if (rd->mask & ResizeLeftMask)
 		{
-		    int dw = wX - workArea->x;
+		    int dw = workArea->x - wX;
 
-		    if (abs (dw) < workAreaSnapDistance)
+		    if (0 < dw && dw < workAreaSnapDistance)
 		    {
-			w      += dw;
-			wWidth += dw;
-			wX     -= dw;
+			w      -= dw;
+			wWidth -= dw;
+			wX     += dw;
 		    }
 		}
 		else if (rd->mask & ResizeRightMask)
 		{
-		    int dw = workArea->x + workArea->width - (wX + wWidth);
+		    int dw = wX + wWidth - (workArea->x + workArea->width);
 
-		    if (abs (dw) < workAreaSnapDistance)
+		    if (0 < dw && dw < workAreaSnapDistance)
 		    {
-			w      += dw;
-			wWidth += dw;
+			w      -= dw;
+			wWidth -= dw;
 		    }
 		}
 	    }
@@ -886,23 +886,23 @@ resizeHandleMotionEvent (CompScreen *s,
 	    {
 		if (rd->mask & ResizeUpMask)
 		{
-		    int dh = wY - workArea->y;
+		    int dh = workArea->y - wY;
 
-		    if (abs (dh) < workAreaSnapDistance)
+		    if (0 < dh && dh < workAreaSnapDistance)
 		    {
-			h       += dh;
-			wHeight += dh;
-			wY      -= dh;
+			h       -= dh;
+			wHeight -= dh;
+			wY      += dh;
 		    }
 		}
 		else if (rd->mask & ResizeDownMask)
 		{
-		    int dh = workArea->y + workArea->height - (wY + wHeight);
+		    int dh = wY + wHeight - (workArea->y + workArea->height);
 
-		    if (abs (dh) < workAreaSnapDistance)
+		    if (0 < dh && dh < workAreaSnapDistance)
 		    {
-			h       += dh;
-			wHeight += dh;
+			h       -= dh;
+			wHeight -= dh;
 		    }
 		}
 	    }

commit 36d16aeae7f416a8fa42ee30ecf30ae532a4848d
Author: Danny Baumann <dannybaumann@web.de>
Date:   Sun Dec 13 12:50:08 2009 +0100

    Minor whitespace fixes and optimizations.

diff --git a/plugins/resize.c b/plugins/resize.c
index 5aa93b9..32f3a97 100644
--- a/plugins/resize.c
+++ b/plugins/resize.c
@@ -100,7 +100,6 @@ typedef struct _ResizeDisplay {
     int		 pointerDy;
     KeyCode	 key[NUM_KEYS];
 
-    Bool         offWorkAreaConstrained;
     Region       constraintRegion;
     int          inRegionStatus;
     int          lastGoodHotSpotY;
@@ -325,12 +324,10 @@ resizeGetConstraintRegion (CompScreen *s)
     if (!region)
 	return NULL;
 
-    XUnionRegion (&emptyRegion, &emptyRegion, region);
-
     for (i = 0; i < s->nOutputDev; i++)
     {
 	getWorkareaForOutput (s, i, &workArea);
-	XUnionRectWithRegion (&workArea, region, region);
+	XUnionRectWithRegion (&s->outputDev[i].workArea, region, region);
     }
 
     return region;
@@ -518,17 +515,14 @@ resizeInitiate (CompDisplay     *d,
 		warpPointer (w->screen, xRoot - pointerX, yRoot - pointerY);
 	    }
 
-	    /* Update offWorkAreaConstrained and workArea at grab time */
-	    rd->offWorkAreaConstrained = FALSE;
+	    if (rd->constraintRegion)
+		XDestroyRegion (rd->constraintRegion);
+
 	    if (sourceExternalApp)
 	    {
 		/* Prevent resizing beyond work area edges when resize is
 		   initiated externally (e.g. with window frame or menu)
 		   and not with a key (e.g. alt+button) */
-		rd->offWorkAreaConstrained = TRUE;
-
-		if (rd->constraintRegion)
-		    XDestroyRegion (rd->constraintRegion);
 
 		rd->inRegionStatus   = RectangleOut;
 		rd->lastGoodHotSpotY = -1;
@@ -536,6 +530,10 @@ resizeInitiate (CompDisplay     *d,
 		rd->lastGoodHeight   = w->serverHeight;
 		rd->constraintRegion = resizeGetConstraintRegion (w->screen);
 	    }
+	    else
+	    {
+		rd->constraintRegion = NULL;
+	    }
 	}
     }
 
@@ -840,88 +838,85 @@ resizeHandleMotionEvent (CompScreen *s,
 
 	if (rd->mask & ResizeLeftMask)
 	    wX = rd->savedGeometry.x + rd->savedGeometry.width -
-		(w + rd->w->input.left);
+		 (w + rd->w->input.left);
 	else
 	    wX = rd->savedGeometry.x - rd->w->input.left;
 
 	if (rd->mask & ResizeUpMask)
 	    wY = rd->savedGeometry.y + rd->savedGeometry.height -
-		(h + rd->w->input.top);
+		 (h + rd->w->input.top);
 	else
 	    wY = rd->savedGeometry.y - rd->w->input.top;
 
 	/* Check if resized edge(s) are near a work-area boundary */
 	for (i = 0; i < s->nOutputDev; i++)
 	{
-	    XRectangle workArea;
-
-	    getWorkareaForOutput (s, i, &workArea);
+	    const XRectangle *workArea = &s->outputDev[i].workArea;
 
-	    // if window and work-area intersect in x axis
-	    if (wX + wWidth > workArea.x &&
-		wX < workArea.x + workArea.width)
+	    /* if window and work-area intersect in x axis */
+	    if (wX + wWidth > workArea->x &&
+		wX < workArea->x + workArea->width)
 	    {
 		if (rd->mask & ResizeLeftMask)
 		{
-		    int dw = wX - workArea.x;
-    
+		    int dw = wX - workArea->x;
+
 		    if (abs (dw) < workAreaSnapDistance)
 		    {
-			w += dw;
+			w      += dw;
 			wWidth += dw;
-			wX -= dw;
+			wX     -= dw;
 		    }
 		}
 		else if (rd->mask & ResizeRightMask)
 		{
-		    int dw = workArea.x + workArea.width - (wX + wWidth);
+		    int dw = workArea->x + workArea->width - (wX + wWidth);
 
 		    if (abs (dw) < workAreaSnapDistance)
 		    {
-			w += dw;
+			w      += dw;
 			wWidth += dw;
 		    }
 		}
 	    }
 
-	    // if window and work-area intersect in y axis
-	    if (wY + wHeight > workArea.y &&
-		wY < workArea.y + workArea.height)
+	    /* if window and work-area intersect in y axis */
+	    if (wY + wHeight > workArea->y &&
+		wY < workArea->y + workArea->height)
 	    {
 		if (rd->mask & ResizeUpMask)
 		{
-		    int dh = wY - workArea.y;
-    
+		    int dh = wY - workArea->y;
+
 		    if (abs (dh) < workAreaSnapDistance)
 		    {
-			h += dh;
+			h       += dh;
 			wHeight += dh;
-			wY -= dh;
+			wY      -= dh;
 		    }
 		}
 		else if (rd->mask & ResizeDownMask)
 		{
-		    int dh = workArea.y + workArea.height - (wY + wHeight);
+		    int dh = workArea->y + workArea->height - (wY + wHeight);
 
 		    if (abs (dh) < workAreaSnapDistance)
 		    {
-			h += dh;
+			h       += dh;
 			wHeight += dh;
 		    }
 		}
 	    }
 	}
 
-	if (rd->offWorkAreaConstrained &&
-	    rd->constraintRegion)
+	if (rd->constraintRegion)
 	{
-	    int minWidth = 50;
+	    int minWidth  = 50;
 	    int minHeight = 50;
 
 	    /* rect. for a minimal height window + borders
 	       (used for the constraining in X axis) */
 	    int minimalInputHeight = minHeight +
-		rd->w->input.top + rd->w->input.bottom;
+		                     rd->w->input.top + rd->w->input.bottom;
 
 	    /* small hot-spot square (on window's corner or edge) that is to be
 	       constrained to the combined output work-area region */
@@ -1000,7 +995,8 @@ resizeHandleMotionEvent (CompScreen *s,
 		    while ((nw > minWidth) && xStatus != RectangleIn)
 		    {
 			xStatus = XRectInRegion (rd->constraintRegion,
-						 nx, yForXResize, width, height);
+						 nx, yForXResize,
+						 width, height);
 			if (xStatus != RectangleIn)
 			{
 			    nw--;
@@ -1585,8 +1581,7 @@ resizeInitDisplay (CompPlugin  *p,
 	rd->key[i] = XKeysymToKeycode (d->display,
 				       XStringToKeysym (rKeys[i].name));
 
-    rd->offWorkAreaConstrained = TRUE;
-    rd->constraintRegion       = NULL;
+    rd->constraintRegion = NULL;
 
     WRAP (rd, d, handleEvent, resizeHandleEvent);
 

commit 93d8762391d7c2ffedaa31f5fbb03913089e44ac
Author: Erkin Bahceci <erkinbah@gmail.com>
Date:   Sat Dec 12 19:39:10 2009 -0600

    Better resize constraint and snap for combined work area.
    
    Allows resizing across monitors while snapping to work area edges.

diff --git a/plugins/resize.c b/plugins/resize.c
index 59bdc36..5aa93b9 100644
--- a/plugins/resize.c
+++ b/plugins/resize.c
@@ -100,7 +100,12 @@ typedef struct _ResizeDisplay {
     int		 pointerDy;
     KeyCode	 key[NUM_KEYS];
 
-    Bool offWorkAreaConstrained;
+    Bool         offWorkAreaConstrained;
+    Region       constraintRegion;
+    int          inRegionStatus;
+    int          lastGoodHotSpotY;
+    int          lastGoodWidth;
+    int          lastGoodHeight;
 } ResizeDisplay;
 
 typedef struct _ResizeScreen {
@@ -121,8 +126,6 @@ typedef struct _ResizeScreen {
     Cursor downRightCursor;
     Cursor middleCursor;
     Cursor cursor[NUM_KEYS];
-
-    const XRectangle *grabWindowWorkArea;
 } ResizeScreen;
 
 #define GET_RESIZE_DISPLAY(d)					    \
@@ -311,6 +314,28 @@ resizeFinishResizing (CompDisplay *d)
     rd->w = NULL;
 }
 
+static Region
+resizeGetConstraintRegion (CompScreen *s)
+{
+    Region       region;
+    XRectangle   workArea;
+    int          i;
+
+    region = XCreateRegion ();
+    if (!region)
+	return NULL;
+
+    XUnionRegion (&emptyRegion, &emptyRegion, region);
+
+    for (i = 0; i < s->nOutputDev; i++)
+    {
+	getWorkareaForOutput (s, i, &workArea);
+	XUnionRectWithRegion (&workArea, region, region);
+    }
+
+    return region;
+}
+
 static Bool
 resizeInitiate (CompDisplay     *d,
 		CompAction      *action,
@@ -497,14 +522,19 @@ resizeInitiate (CompDisplay     *d,
 	    rd->offWorkAreaConstrained = FALSE;
 	    if (sourceExternalApp)
 	    {
-		int output = outputDeviceForWindow (w);
-
-		rs->grabWindowWorkArea = &w->screen->outputDev[output].workArea;
-
 		/* Prevent resizing beyond work area edges when resize is
 		   initiated externally (e.g. with window frame or menu)
 		   and not with a key (e.g. alt+button) */
 		rd->offWorkAreaConstrained = TRUE;
+
+		if (rd->constraintRegion)
+		    XDestroyRegion (rd->constraintRegion);
+
+		rd->inRegionStatus   = RectangleOut;
+		rd->lastGoodHotSpotY = -1;
+		rd->lastGoodWidth    = w->serverWidth;
+		rd->lastGoodHeight   = w->serverHeight;
+		rd->constraintRegion = resizeGetConstraintRegion (w->screen);
 	    }
 	}
     }
@@ -694,7 +724,10 @@ resizeHandleMotionEvent (CompScreen *s,
     if (rs->grabIndex)
     {
 	BoxRec box;
-	int    w, h;
+	int    w, h;                    /* size of window contents */
+	int    wX, wY, wWidth, wHeight; /* rect. for window contents+borders */
+	int    i;
+	int    workAreaSnapDistance = 10;
 
 	RESIZE_DISPLAY (s->display);
 
@@ -801,42 +834,237 @@ resizeHandleMotionEvent (CompScreen *s,
 
 	constrainNewWindowSize (rd->w, w, h, &w, &h);
 
-	/* constrain to work area */
-	if (rd->offWorkAreaConstrained)
+	/* compute rect. for window + borders */
+	wWidth  = w + rd->w->input.left + rd->w->input.right;
+	wHeight = h + rd->w->input.top + rd->w->input.bottom;
+
+	if (rd->mask & ResizeLeftMask)
+	    wX = rd->savedGeometry.x + rd->savedGeometry.width -
+		(w + rd->w->input.left);
+	else
+	    wX = rd->savedGeometry.x - rd->w->input.left;
+
+	if (rd->mask & ResizeUpMask)
+	    wY = rd->savedGeometry.y + rd->savedGeometry.height -
+		(h + rd->w->input.top);
+	else
+	    wY = rd->savedGeometry.y - rd->w->input.top;
+
+	/* Check if resized edge(s) are near a work-area boundary */
+	for (i = 0; i < s->nOutputDev; i++)
 	{
-	    if (rd->mask & ResizeUpMask)
+	    XRectangle workArea;
+
+	    getWorkareaForOutput (s, i, &workArea);
+
+	    // if window and work-area intersect in x axis
+	    if (wX + wWidth > workArea.x &&
+		wX < workArea.x + workArea.width)
 	    {
-		int decorTop = rd->savedGeometry.y + rd->savedGeometry.height -
-		    (h + rd->w->input.top);
+		if (rd->mask & ResizeLeftMask)
+		{
+		    int dw = wX - workArea.x;
+    
+		    if (abs (dw) < workAreaSnapDistance)
+		    {
+			w += dw;
+			wWidth += dw;
+			wX -= dw;
+		    }
+		}
+		else if (rd->mask & ResizeRightMask)
+		{
+		    int dw = workArea.x + workArea.width - (wX + wWidth);
 
-		if (rs->grabWindowWorkArea->y > decorTop)
-		    h -= rs->grabWindowWorkArea->y - decorTop;
+		    if (abs (dw) < workAreaSnapDistance)
+		    {
+			w += dw;
+			wWidth += dw;
+		    }
+		}
 	    }
-	    if (rd->mask & ResizeDownMask)
+
+	    // if window and work-area intersect in y axis
+	    if (wY + wHeight > workArea.y &&
+		wY < workArea.y + workArea.height)
 	    {
-		int decorBottom = rd->savedGeometry.y + h + rd->w->input.bottom;
+		if (rd->mask & ResizeUpMask)
+		{
+		    int dh = wY - workArea.y;
+    
+		    if (abs (dh) < workAreaSnapDistance)
+		    {
+			h += dh;
+			wHeight += dh;
+			wY -= dh;
+		    }
+		}
+		else if (rd->mask & ResizeDownMask)
+		{
+		    int dh = workArea.y + workArea.height - (wY + wHeight);
 
-		if (decorBottom >
-		    rs->grabWindowWorkArea->y + rs->grabWindowWorkArea->height)
-		    h -= decorBottom - (rs->grabWindowWorkArea->y +
-					rs->grabWindowWorkArea->height);
+		    if (abs (dh) < workAreaSnapDistance)
+		    {
+			h += dh;
+			wHeight += dh;
+		    }
+		}
 	    }
+	}
+
+	if (rd->offWorkAreaConstrained &&
+	    rd->constraintRegion)
+	{
+	    int minWidth = 50;
+	    int minHeight = 50;
+
+	    /* rect. for a minimal height window + borders
+	       (used for the constraining in X axis) */
+	    int minimalInputHeight = minHeight +
+		rd->w->input.top + rd->w->input.bottom;
+
+	    /* small hot-spot square (on window's corner or edge) that is to be
+	       constrained to the combined output work-area region */
+	    int x, y;
+	    int width = rd->w->input.top; /* square size = title bar height */
+	    int height = width;
+	    int status;
+
+	    /* compute x & y for constrained hot-spot rect */
 	    if (rd->mask & ResizeLeftMask)
+		x = wX;
+	    else if (rd->mask & ResizeRightMask)
+		x = wX + wWidth - width;
+	    else
+		x = MIN (MAX (xRoot, wX), wX + wWidth - width);
+
+	    if (rd->mask & ResizeUpMask)
+		y = wY;
+	    else if (rd->mask & ResizeDownMask)
+		y = wY + wHeight - height;
+	    else
+		y = MIN (MAX (yRoot, wY), wY + wHeight - height);
+
+	    status = XRectInRegion (rd->constraintRegion,
+				    x, y, width, height);
+
+	    /* only constrain movement if previous position was valid */
+	    if (rd->inRegionStatus == RectangleIn)
 	    {
-		int decorLeft = rd->savedGeometry.x + rd->savedGeometry.width -
-		    (w + rd->w->input.left);
+		int xStatus, yForXResize;
+		int nx = x;
+		int nw = w;
+		int nh = h;
+
+		if (rd->mask & (ResizeLeftMask | ResizeRightMask))
+		{
+		    xStatus = status;
+
+		    if (rd->mask & ResizeUpMask)
+			yForXResize = wY + wHeight - minimalInputHeight;
+		    else if (rd->mask & ResizeDownMask)
+			yForXResize = wY + minimalInputHeight - height;
+		    else
+			yForXResize = y;
+
+		    if (XRectInRegion (rd->constraintRegion,
+				       x, yForXResize,
+				       width, height) != RectangleIn)
+		    {
+			if (rd->lastGoodHotSpotY >= 0)
+			    yForXResize = rd->lastGoodHotSpotY;
+			else
+			    yForXResize = y;
+		    }
+		}
+		if (rd->mask & ResizeLeftMask)
+		{
+		    while ((nw > minWidth) && xStatus != RectangleIn)
+		    {
+			xStatus = XRectInRegion (rd->constraintRegion,
+						 nx, yForXResize, width, height);
+			if (xStatus != RectangleIn)
+			{
+			    nw--;
+			    nx++;
+			}
+		    }
+		    if (nw > minWidth)
+		    {
+			x = nx;
+			w = nw;
+		    }
+		}
+		else if (rd->mask & ResizeRightMask)
+		{
+		    while ((nw > minWidth) && xStatus != RectangleIn)
+		    {
+			xStatus = XRectInRegion (rd->constraintRegion,
+						 nx, yForXResize, width, height);
+			if (xStatus != RectangleIn)
+			{
+			    nw--;
+			    nx--;
+			}
+		    }
+		    if (nw > minWidth)
+		    {
+			x = nx;
+			w = nw;
+		    }
+		}
+
+		if (rd->mask & ResizeUpMask)
+		{
+		    while ((nh > minHeight) && status != RectangleIn)
+		    {
+			status = XRectInRegion (rd->constraintRegion,
+						x, y, width, height);
+			if (status != RectangleIn)
+			{
+			    nh--;
+			    y++;
+			}
+		    }
+		    if (nh > minHeight)
+			h = nh;
+		}
+		else if (rd->mask & ResizeDownMask)
+		{
+		    while ((nh > minHeight) && status != RectangleIn)
+		    {
+			status = XRectInRegion (rd->constraintRegion,
+						x, y, width, height);
+			if (status != RectangleIn)
+			{
+			    nh--;
+			    y--;
+			}
+		    }
+		    if (nh > minHeight)
+			h = nh;
+		}
 
-		if (rs->grabWindowWorkArea->x > decorLeft)
-		    w -= rs->grabWindowWorkArea->x - decorLeft;
+		if (((rd->mask & (ResizeLeftMask | ResizeRightMask)) &&
+		     xStatus == RectangleIn) ||
+		    ((rd->mask & (ResizeUpMask | ResizeDownMask)) &&
+		     status == RectangleIn))
+		{
+		    /* hot-spot inside work-area region, store good values */
+		    rd->lastGoodHotSpotY = y;
+		    rd->lastGoodWidth    = w;
+		    rd->lastGoodHeight   = h;
+		}
+		else
+		{
+		    /* failed to find a good hot-spot position, restore size */
+		    w = rd->lastGoodWidth;
+		    h = rd->lastGoodHeight;
+		}
 	    }
-	    if (rd->mask & ResizeRightMask)
+	    else
 	    {
-		int decorRight = rd->savedGeometry.x + w + rd->w->input.right;
-
-		if (decorRight >
-		    rs->grabWindowWorkArea->x + rs->grabWindowWorkArea->width)
-		    w -= decorRight - (rs->grabWindowWorkArea->x +
-				       rs->grabWindowWorkArea->width);
+		rd->inRegionStatus = status;
 	    }
 	}
 
@@ -1358,6 +1586,7 @@ resizeInitDisplay (CompPlugin  *p,
 				       XStringToKeysym (rKeys[i].name));
 
     rd->offWorkAreaConstrained = TRUE;
+    rd->constraintRegion       = NULL;
 
     WRAP (rd, d, handleEvent, resizeHandleEvent);
 
@@ -1378,6 +1607,9 @@ resizeFiniDisplay (CompPlugin  *p,
 
     compFiniDisplayOptions (d, rd->opt, RESIZE_DISPLAY_OPTION_NUM);
 
+    if (rd->constraintRegion)
+	XDestroyRegion (rd->constraintRegion);
+
     free (rd);
 }
 
@@ -1416,8 +1648,6 @@ resizeInitScreen (CompPlugin *p,
     rs->cursor[2] = rs->upCursor;
     rs->cursor[3] = rs->downCursor;
 
-    rs->grabWindowWorkArea = NULL;
-
     WRAP (rs, s, windowResizeNotify, resizeWindowResizeNotify);
     WRAP (rs, s, paintOutput, resizePaintOutput);
     WRAP (rs, s, paintWindow, resizePaintWindow);

commit 814db40e62bb2240b1708efba1f15ff65b9d2f0e
Author: Danny Baumann <dannybaumann@web.de>
Date:   Mon Dec 14 15:20:29 2009 +0100

    Fix crash.

diff --git a/plugins/switcher.c b/plugins/switcher.c
index 4c0cea5..ff3f3fb 100644
--- a/plugins/switcher.c
+++ b/plugins/switcher.c
@@ -703,10 +703,6 @@ switchInitiate (CompScreen            *s,
 		else
 		{
 		    XMapWindow (s->display->display, ss->popupWindow);
-		    /* we don't get a MapRequest for internal window
-		       creations, so we need to set the managed state
-		       ourselves */
-		    w->managed = TRUE;
 		}
 	    }
 
@@ -1100,7 +1096,11 @@ switchHandleEvent (CompDisplay *d,
 
 	    if (w->id == ss->popupWindow)
 	    {
-		w->wmType = getWindowType (d, w->id);
+		/* we don't get a MapRequest for internal window
+		   creations, so we need to update the internals
+		   ourselves */
+		w->wmType  = getWindowType (d, w->id);
+		w->managed = TRUE;
 		recalcWindowType (w);
 		recalcWindowActions (w);
 		updateWindowClassHints (w);


Reply to: