All pastes #612542 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-07-10 13:54 UTC
rendered paste body
diff --git a/plugins/resize.c b/plugins/resize.c
index c9d69c1..ae651d6 100644
--- a/plugins/resize.c
+++ b/plugins/resize.c
@@ -92,6 +92,10 @@ typedef struct _ResizeDisplay {
     int		 mode;
     XRectangle	 savedGeometry;
     XRectangle	 geometry;
+
+    int          minPointerOffsetX;
+    int          minPointerOffsetY;
+
     int		 releaseButton;
     unsigned int mask;
     int		 pointerDx;
@@ -209,6 +213,44 @@ resizeDamageRectangle (CompScreen *s,
     damageScreenRegion (s, &reg);
 }
 
+static Cursor
+resizeCursorFromResizeMask (CompScreen   *s,
+			    unsigned int mask)
+{
+    Cursor cursor;
+
+    RESIZE_SCREEN (s);
+
+    if (mask & ResizeLeftMask)
+    {
+	if (mask & ResizeDownMask)
+	    cursor = rs->downLeftCursor;
+	else if (mask & ResizeUpMask)
+	    cursor = rs->upLeftCursor;
+	else
+	    cursor = rs->leftCursor;
+    }
+    else if (mask & ResizeRightMask)
+    {
+	if (mask & ResizeDownMask)
+	    cursor = rs->downRightCursor;
+	else if (mask & ResizeUpMask)
+	    cursor = rs->upRightCursor;
+	else
+	    cursor = rs->rightCursor;
+    }
+    else if (mask & ResizeUpMask)
+    {
+	cursor = rs->upCursor;
+    }
+    else
+    {
+	cursor = rs->downCursor;
+    }
+
+    return cursor;
+}
+
 static void
 resizeSendResizeNotify (CompDisplay *d)
 {
@@ -354,6 +396,9 @@ resizeInitiate (CompDisplay     *d,
 	rd->pointerDx = x - pointerX;
 	rd->pointerDy = y - pointerY;
 
+	rd->minPointerOffsetX = MIN (20, w->serverWidth / 10);
+	rd->minPointerOffsetY = MIN (20, w->serverHeight / 10);
+
 	rd->mode = rd->opt[RESIZE_DISPLAY_OPTION_MODE].value.i;
 	for (i = 0; i <= RESIZE_MODE_LAST; i++)
 	{
@@ -387,31 +432,9 @@ resizeInitiate (CompDisplay     *d,
 	    {
 		cursor = rs->middleCursor;
 	    }
-	    else if (mask & ResizeLeftMask)
-	    {
-		if (mask & ResizeDownMask)
-		    cursor = rs->downLeftCursor;
-		else if (mask & ResizeUpMask)
-		    cursor = rs->upLeftCursor;
-		else
-		    cursor = rs->leftCursor;
-	    }
-	    else if (mask & ResizeRightMask)
-	    {
-		if (mask & ResizeDownMask)
-		    cursor = rs->downRightCursor;
-		else if (mask & ResizeUpMask)
-		    cursor = rs->upRightCursor;
-		else
-		    cursor = rs->rightCursor;
-	    }
-	    else if (mask & ResizeUpMask)
-	    {
-		cursor = rs->upCursor;
-	    }
 	    else
 	    {
-		cursor = rs->downCursor;
+		cursor = resizeCursorFromResizeMask (w->screen, mask);
 	    }
 
 	    rs->grabIndex = pushScreenGrab (w->screen, cursor, "resize");
@@ -643,6 +666,65 @@ resizeHandleMotionEvent (CompScreen *s,
 	w = rd->savedGeometry.width;
 	h = rd->savedGeometry.height;
 
+	if (!rd->mask)
+	{
+	    int xDist, yDist;
+	    xDist = xRoot - (rd->w->serverX + (rd->w->serverWidth / 2));
+	    yDist = yRoot - (rd->w->serverY + (rd->w->serverHeight / 2));
+
+	    if (abs (xDist) > rd->minPointerOffsetX)
+		rd->minPointerOffsetY /= 2;
+	    else if (abs (yDist) > rd->minPointerOffsetY)
+		rd->minPointerOffsetX /= 2;
+
+	    if (abs (xDist) > rd->minPointerOffsetX)
+	    {
+		if (xDist > 0)
+		    rd->mask |= ResizeRightMask;
+		else
+		    rd->mask |= ResizeLeftMask;
+	    }
+
+	    if (abs (yDist) > rd->minPointerOffsetY)
+	    {
+		if (yDist > 0)
+		    rd->mask |= ResizeDownMask;
+		else
+		    rd->mask |= ResizeUpMask;
+	    }
+
+	    if (rd->mask)
+	    {
+		Cursor     cursor;
+		CompScreen *s = rd->w->screen;
+		CompWindow *w = rd->w;
+		int        pointerAdjustX = 0;
+		int        pointerAdjustY = 0;
+		
+		RESIZE_SCREEN (s);
+
+		rd->pointerDx = 0;
+		rd->pointerDy = 0;
+
+		if (rd->mask & ResizeRightMask)
+			pointerAdjustX = w->serverX + w->serverWidth +
+					 w->input.right - xRoot;
+		else if (rd->mask & ResizeLeftMask)
+			pointerAdjustX = w->serverX - w->input.left - xRoot;
+
+		if (rd->mask & ResizeDownMask)
+			pointerAdjustY = w->serverY + w->serverHeight +
+					 w->input.bottom - yRoot;
+		else if (rd->mask & ResizeUpMask)
+			pointerAdjustY = w->serverY - w->input.top - yRoot;
+
+		warpPointer (s, pointerAdjustX, pointerAdjustY);
+
+		cursor = resizeCursorFromResizeMask (s, rd->mask);
+		updateScreenGrab (s, rs->grabIndex, cursor);
+	    }
+	}
+
 	if (rd->mask & ResizeLeftMask)
 	    w -= rd->pointerDx;
 	else if (rd->mask & ResizeRightMask)
@@ -715,6 +797,19 @@ resizeHandleEvent (CompDisplay *d,
 	break;
     case KeyRelease:
 	break;
+    case ButtonPress: {
+	CompAction *action =
+	    &rd->opt[RESIZE_DISPLAY_OPTION_INITIATE].value.action;
+	s = findScreenAtDisplay(d, event->xbutton.root);
+	if (s)
+	{
+	    RESIZE_SCREEN(s);
+	    if (rs->grabIndex)
+	    {
+		resizeTerminate(d, action, 0, NULL, 0);
+	    }
+	}
+    } break;
     case ButtonRelease: {
 	CompAction *action =
 	    &rd->opt[RESIZE_DISPLAY_OPTION_INITIATE].value.action;