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, ®); } +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;