diff --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)