rendered paste bodydiff --git a/plugins/resize.c b/plugins/resize.c
index c9d69c1..4e15b83 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, ®);
}
+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 = w->serverWidth / 10;
+ rd->minPointerOffsetY = 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,45 @@ 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;
+
+ RESIZE_SCREEN (s);
+
+ cursor = resizeCursorFromResizeMask (s, rd->mask);
+ updateScreenGrab (s, rs->grabIndex, cursor);
+ }
+ }
+
if (rd->mask & ResizeLeftMask)
w -= rd->pointerDx;
else if (rd->mask & ResizeRightMask)