Introduce concept of interactive resize gravity

The gravity concept is a generic way to describe how a window must be
positioned during interactive resize. It works both when resizing the
window using a pointer or touch.
This commit is contained in:
Vlad Zahorodnii 2021-12-24 14:05:41 +02:00
parent b15681fd9c
commit 907c440e22
8 changed files with 152 additions and 149 deletions

View file

@ -944,9 +944,9 @@ bool AbstractClient::startInteractiveMoveResize()
workspace()->setMoveResizeClient(this);
if (maximizeMode() != MaximizeRestore) {
switch (interactiveMoveResizePointerMode()) {
case PositionLeft:
case PositionRight:
switch (interactiveMoveResizeGravity()) {
case Gravity::Left:
case Gravity::Right:
// Quit maximized horizontally state if the window is resized horizontally.
if (maximizeMode() & MaximizeHorizontal) {
QRect originalGeometry = geometryRestore();
@ -956,8 +956,8 @@ bool AbstractClient::startInteractiveMoveResize()
maximize(maximizeMode() ^ MaximizeHorizontal);
}
break;
case PositionTop:
case PositionBottom:
case Gravity::Top:
case Gravity::Bottom:
// Quit maximized vertically state if the window is resized vertically.
if (maximizeMode() & MaximizeVertical) {
QRect originalGeometry = geometryRestore();
@ -967,10 +967,10 @@ bool AbstractClient::startInteractiveMoveResize()
maximize(maximizeMode() ^ MaximizeVertical);
}
break;
case PositionTopLeft:
case PositionBottomLeft:
case PositionTopRight:
case PositionBottomRight:
case Gravity::TopLeft:
case Gravity::BottomLeft:
case Gravity::TopRight:
case Gravity::BottomRight:
// Quit the maximized mode if the window is resized by dragging one of its corners.
setGeometryRestore(moveResizeGeometry());
maximize(MaximizeRestore);
@ -981,7 +981,7 @@ bool AbstractClient::startInteractiveMoveResize()
}
if (quickTileMode() != QuickTileMode(QuickTileFlag::None)) {
if (interactiveMoveResizePointerMode() != PositionCenter) { // Cannot use isResize() yet
if (interactiveMoveResizeGravity() != Gravity::None) { // Cannot use isResize() yet
// Exit quick tile mode when the user attempts to resize a tiled window
updateQuickTileMode(QuickTileFlag::None); // Do so without restoring original geometry
setGeometryRestore(moveResizeGeometry());
@ -1140,10 +1140,11 @@ void AbstractClient::handleInteractiveMoveResize(int x, int y, int x_root, int y
if (isWaitingForInteractiveMoveResizeSync())
return; // we're still waiting for the client or the timeout
const Position mode = interactiveMoveResizePointerMode();
if ((mode == PositionCenter && !isMovableAcrossScreens())
|| (mode != PositionCenter && (isShade() || !isResizable())))
const Gravity gravity = interactiveMoveResizeGravity();
if ((gravity == Gravity::None && !isMovableAcrossScreens())
|| (gravity != Gravity::None && (isShade() || !isResizable()))) {
return;
}
if (!isInteractiveMoveResize()) {
QPoint p(QPoint(x/* - padding_left*/, y/* - padding_top*/) - interactiveMoveOffset());
@ -1159,8 +1160,9 @@ void AbstractClient::handleInteractiveMoveResize(int x, int y, int x_root, int y
}
// ShadeHover or ShadeActive, ShadeNormal was already avoided above
if (mode != PositionCenter && shadeMode() != ShadeNone)
if (gravity != Gravity::None && shadeMode() != ShadeNone) {
setShade(ShadeNone);
}
QPoint globalPos(x_root, y_root);
// these two points limit the geometry rectangle, i.e. if bottomleft resizing is done,
@ -1203,38 +1205,37 @@ void AbstractClient::handleInteractiveMoveResize(int x, int y, int x_root, int y
if (isInteractiveResize()) {
QRect orig = initialInteractiveMoveResizeGeometry();
SizeMode sizeMode = SizeModeAny;
auto calculateMoveResizeGeom = [this, &topleft, &bottomright, &orig, &sizeMode, &mode]() {
switch(mode) {
case PositionTopLeft:
auto calculateMoveResizeGeom = [this, &topleft, &bottomright, &orig, &sizeMode, &gravity]() {
switch (gravity) {
case Gravity::TopLeft:
setMoveResizeGeometry(QRect(topleft, orig.bottomRight()));
break;
case PositionBottomRight:
case Gravity::BottomRight:
setMoveResizeGeometry(QRect(orig.topLeft(), bottomright));
break;
case PositionBottomLeft:
case Gravity::BottomLeft:
setMoveResizeGeometry(QRect(QPoint(topleft.x(), orig.y()), QPoint(orig.right(), bottomright.y())));
break;
case PositionTopRight:
case Gravity::TopRight:
setMoveResizeGeometry(QRect(QPoint(orig.x(), topleft.y()), QPoint(bottomright.x(), orig.bottom())));
break;
case PositionTop:
case Gravity::Top:
setMoveResizeGeometry(QRect(QPoint(orig.left(), topleft.y()), orig.bottomRight()));
sizeMode = SizeModeFixedH; // try not to affect height
break;
case PositionBottom:
case Gravity::Bottom:
setMoveResizeGeometry(QRect(orig.topLeft(), QPoint(orig.right(), bottomright.y())));
sizeMode = SizeModeFixedH;
break;
case PositionLeft:
case Gravity::Left:
setMoveResizeGeometry(QRect(QPoint(topleft.x(), orig.top()), orig.bottomRight()));
sizeMode = SizeModeFixedW;
break;
case PositionRight:
case Gravity::Right:
setMoveResizeGeometry(QRect(orig.topLeft(), QPoint(bottomright.x(), orig.bottom())));
sizeMode = SizeModeFixedW;
break;
case PositionCenter:
default:
case Gravity::None:
Q_UNREACHABLE();
break;
}
@ -1243,7 +1244,7 @@ void AbstractClient::handleInteractiveMoveResize(int x, int y, int x_root, int y
// first resize (without checking constrains), then snap, then check bounds, then check constrains
calculateMoveResizeGeom();
// adjust new size to snap to other windows/borders
setMoveResizeGeometry(workspace()->adjustClientSize(this, moveResizeGeometry(), mode));
setMoveResizeGeometry(workspace()->adjustClientSize(this, moveResizeGeometry(), gravity));
if (!isUnrestrictedInteractiveMoveResize()) {
// Make sure the titlebar isn't behind a restricted area. We don't need to restrict
@ -1351,7 +1352,7 @@ void AbstractClient::handleInteractiveMoveResize(int x, int y, int x_root, int y
if (moveResizeGeometry().size() != previousMoveResizeGeom.size())
update = true;
} else if (isInteractiveMove()) {
Q_ASSERT(mode == PositionCenter);
Q_ASSERT(gravity == Gravity::None);
if (!isMovable()) { // isMovableAcrossScreens() must have been true to get here
// Special moving of maximized windows on Xinerama screens
AbstractOutput *output = kwinApp()->platform()->outputAt(globalPos);
@ -1858,7 +1859,7 @@ bool AbstractClient::performMouseCommand(Options::MouseCommand cmd, const QPoint
break;
if (isInteractiveMoveResize())
finishInteractiveMoveResize(false);
setInteractiveMoveResizePointerMode(PositionCenter);
setInteractiveMoveResizeGravity(Gravity::None);
setInteractiveMoveResizePointerButtonDown(true);
setInteractiveMoveOffset(QPoint(globalPos.x() - x(), globalPos.y() - y())); // map from global
setInvertedInteractiveMoveOffset(rect().bottomRight() - interactiveMoveOffset());
@ -1883,14 +1884,15 @@ bool AbstractClient::performMouseCommand(Options::MouseCommand cmd, const QPoint
bool right = x >= 2 * width() / 3;
bool top = y < height() / 3;
bool bot = y >= 2 * height() / 3;
Position mode;
if (top)
mode = left ? PositionTopLeft : (right ? PositionTopRight : PositionTop);
else if (bot)
mode = left ? PositionBottomLeft : (right ? PositionBottomRight : PositionBottom);
else
mode = (x < width() / 2) ? PositionLeft : PositionRight;
setInteractiveMoveResizePointerMode(mode);
Gravity gravity;
if (top) {
gravity = left ? Gravity::TopLeft : (right ? Gravity::TopRight : Gravity::Top);
} else if (bot) {
gravity = left ? Gravity::BottomLeft : (right ? Gravity::BottomRight : Gravity::Bottom);
} else {
gravity = (x < width() / 2) ? Gravity::Left : Gravity::Right;
}
setInteractiveMoveResizeGravity(gravity);
setInvertedInteractiveMoveOffset(rect().bottomRight() - moveOffset);
setUnrestrictedInteractiveMoveResize((cmd == Options::MouseUnrestrictedResize));
if (!startInteractiveMoveResize())
@ -2072,33 +2074,33 @@ void AbstractClient::updateInitialMoveResizeGeometry()
void AbstractClient::updateCursor()
{
Position m = interactiveMoveResizePointerMode();
Gravity gravity = interactiveMoveResizeGravity();
if (!isResizable() || isShade())
m = PositionCenter;
gravity = Gravity::None;
CursorShape c = Qt::ArrowCursor;
switch(m) {
case PositionTopLeft:
switch (gravity) {
case Gravity::TopLeft:
c = KWin::ExtendedCursor::SizeNorthWest;
break;
case PositionBottomRight:
case Gravity::BottomRight:
c = KWin::ExtendedCursor::SizeSouthEast;
break;
case PositionBottomLeft:
case Gravity::BottomLeft:
c = KWin::ExtendedCursor::SizeSouthWest;
break;
case PositionTopRight:
case Gravity::TopRight:
c = KWin::ExtendedCursor::SizeNorthEast;
break;
case PositionTop:
case Gravity::Top:
c = KWin::ExtendedCursor::SizeNorth;
break;
case PositionBottom:
case Gravity::Bottom:
c = KWin::ExtendedCursor::SizeSouth;
break;
case PositionLeft:
case Gravity::Left:
c = KWin::ExtendedCursor::SizeWest;
break;
case PositionRight:
case Gravity::Right:
c = KWin::ExtendedCursor::SizeEast;
break;
default:
@ -2261,31 +2263,31 @@ void AbstractClient::dontInteractiveMoveResize()
finishInteractiveMoveResize(false);
}
AbstractClient::Position AbstractClient::mousePosition() const
Gravity AbstractClient::mouseGravity() const
{
if (isDecorated()) {
switch (decoration()->sectionUnderMouse()) {
case Qt::BottomLeftSection:
return PositionBottomLeft;
return Gravity::BottomLeft;
case Qt::BottomRightSection:
return PositionBottomRight;
return Gravity::BottomRight;
case Qt::BottomSection:
return PositionBottom;
return Gravity::Bottom;
case Qt::LeftSection:
return PositionLeft;
return Gravity::Left;
case Qt::RightSection:
return PositionRight;
return Gravity::Right;
case Qt::TopSection:
return PositionTop;
return Gravity::Top;
case Qt::TopLeftSection:
return PositionTopLeft;
return Gravity::TopLeft;
case Qt::TopRightSection:
return PositionTopRight;
return Gravity::TopRight;
default:
return PositionCenter;
return Gravity::None;
}
}
return PositionCenter;
return Gravity::None;
}
void AbstractClient::endInteractiveMoveResize()
@ -2294,7 +2296,7 @@ void AbstractClient::endInteractiveMoveResize()
stopDelayedInteractiveMoveResize();
if (isInteractiveMoveResize()) {
finishInteractiveMoveResize(false);
setInteractiveMoveResizePointerMode(mousePosition());
setInteractiveMoveResizeGravity(mouseGravity());
}
updateCursor();
}
@ -2383,9 +2385,9 @@ void AbstractClient::processDecorationMove(const QPoint &localPos, const QPoint
return;
}
// TODO: handle modifiers
Position newmode = mousePosition();
if (newmode != interactiveMoveResizePointerMode()) {
setInteractiveMoveResizePointerMode(newmode);
Gravity newGravity = mouseGravity();
if (newGravity != interactiveMoveResizeGravity()) {
setInteractiveMoveResizeGravity(newGravity);
updateCursor();
}
}
@ -2425,7 +2427,7 @@ bool AbstractClient::processDecorationButtonPress(QMouseEvent *event, bool ignor
&& com != Options::MouseOperationsMenu // actions where it's not possible to get the matching
&& com != Options::MouseMinimize) // mouse release event
{
setInteractiveMoveResizePointerMode(mousePosition());
setInteractiveMoveResizeGravity(mouseGravity());
setInteractiveMoveResizePointerButtonDown(true);
setInteractiveMoveOffset(event->pos());
setInvertedInteractiveMoveOffset(rect().bottomRight() - interactiveMoveOffset());
@ -2460,7 +2462,7 @@ void AbstractClient::processDecorationButtonRelease(QMouseEvent *event)
stopDelayedInteractiveMoveResize();
if (isInteractiveMoveResize()) {
finishInteractiveMoveResize(false);
setInteractiveMoveResizePointerMode(mousePosition());
setInteractiveMoveResizeGravity(mouseGravity());
}
updateCursor();
}

View file

@ -601,21 +601,6 @@ public:
virtual void pointerEnterEvent(const QPoint &globalPos);
virtual void pointerLeaveEvent();
/**
* These values represent positions inside an area
*/
enum Position {
// without prefix, they'd conflict with Qt::TopLeftCorner etc. :(
PositionCenter = 0x00,
PositionLeft = 0x01,
PositionRight = 0x02,
PositionTop = 0x04,
PositionBottom = 0x08,
PositionTopLeft = PositionLeft | PositionTop,
PositionTopRight = PositionRight | PositionTop,
PositionBottomLeft = PositionLeft | PositionBottom,
PositionBottomRight = PositionRight | PositionBottom
};
Qt::Edge titlebarPosition() const;
bool titlebarPositionUnderMouse() const;
@ -710,13 +695,13 @@ public:
* Returns @c true if the Client is being interactively moved; otherwise @c false.
*/
bool isInteractiveMove() const {
return isInteractiveMoveResize() && interactiveMoveResizePointerMode() == PositionCenter;
return isInteractiveMoveResize() && interactiveMoveResizeGravity() == Gravity::None;
}
/**
* Returns @c true if the Client is being interactively resized; otherwise @c false.
*/
bool isInteractiveResize() const {
return isInteractiveMoveResize() && interactiveMoveResizePointerMode() != PositionCenter;
return isInteractiveMoveResize() && interactiveMoveResizeGravity() != Gravity::None;
}
/**
* Cursor shape for move/resize mode.
@ -1117,11 +1102,11 @@ protected:
*/
void updateInitialMoveResizeGeometry();
void setMoveResizeGeometry(const QRect &geo);
Position interactiveMoveResizePointerMode() const {
return m_interactiveMoveResize.pointer;
Gravity interactiveMoveResizeGravity() const {
return m_interactiveMoveResize.gravity;
}
void setInteractiveMoveResizePointerMode(Position mode) {
m_interactiveMoveResize.pointer = mode;
void setInteractiveMoveResizeGravity(Gravity gravity) {
m_interactiveMoveResize.gravity = gravity;
}
bool isInteractiveMoveResizePointerButtonDown() const {
return m_interactiveMoveResize.buttonDown;
@ -1182,10 +1167,10 @@ protected:
virtual QSize resizeIncrements() const;
/**
* Returns the position depending on the Decoration's section under mouse.
* If no decoration it returns PositionCenter.
* Returns the interactive move resize gravity depending on the Decoration's section
* under mouse. If no decoration it returns Gravity::None.
*/
Position mousePosition() const;
Gravity mouseGravity() const;
void setDecoration(QSharedPointer<KDecoration2::Decoration> decoration);
void startDecorationDoubleClickTimer();
@ -1294,7 +1279,7 @@ private:
QPoint offset;
QPoint invertedOffset;
QRect initialGeometry;
Position pointer = PositionCenter;
Gravity gravity = Gravity::None;
bool buttonDown = false;
CursorShape cursor = Qt::ArrowCursor;
AbstractOutput *startOutput = nullptr;

View file

@ -694,7 +694,7 @@ void X11Client::leaveNotifyEvent(xcb_leave_notify_event_t *e)
return; // care only about leaving the whole frame
if (e->mode == XCB_NOTIFY_MODE_NORMAL) {
if (!isInteractiveMoveResizePointerButtonDown()) {
setInteractiveMoveResizePointerMode(PositionCenter);
setInteractiveMoveResizeGravity(Gravity::None);
updateCursor();
}
bool lostMouse = !rect().contains(QPoint(e->event_x, e->event_y));
@ -1034,9 +1034,9 @@ bool X11Client::motionNotifyEvent(xcb_window_t w, int state, int x, int y, int x
QCoreApplication::instance()->sendEvent(decoration(), &event);
}
}
Position newmode = modKeyDown(state) ? PositionCenter : mousePosition();
if (newmode != interactiveMoveResizePointerMode()) {
setInteractiveMoveResizePointerMode(newmode);
Gravity newGravity = modKeyDown(state) ? Gravity::None : mouseGravity();
if (newGravity != interactiveMoveResizeGravity()) {
setInteractiveMoveResizeGravity(newGravity);
updateCursor();
}
return false;
@ -1137,15 +1137,15 @@ void X11Client::NETMoveResize(int x_root, int y_root, NET::Direction direction)
setInteractiveMoveResizePointerButtonDown(false);
updateCursor();
} else if (direction >= NET::TopLeft && direction <= NET::Left) {
static const Position convert[] = {
PositionTopLeft,
PositionTop,
PositionTopRight,
PositionRight,
PositionBottomRight,
PositionBottom,
PositionBottomLeft,
PositionLeft
static const Gravity convert[] = {
Gravity::TopLeft,
Gravity::Top,
Gravity::TopRight,
Gravity::Right,
Gravity::BottomRight,
Gravity::Bottom,
Gravity::BottomLeft,
Gravity::Left
};
if (!isResizable() || isShade())
return;
@ -1155,7 +1155,7 @@ void X11Client::NETMoveResize(int x_root, int y_root, NET::Direction direction)
setInteractiveMoveOffset(QPoint(x_root - x(), y_root - y())); // map from global
setInvertedInteractiveMoveOffset(rect().bottomRight() - interactiveMoveOffset());
setUnrestrictedInteractiveMoveResize(false);
setInteractiveMoveResizePointerMode(convert[ direction ]);
setInteractiveMoveResizeGravity(convert[direction]);
if (!startInteractiveMoveResize())
setInteractiveMoveResizePointerButtonDown(false);
updateCursor();

View file

@ -145,6 +145,21 @@ enum class LED {
Q_DECLARE_FLAGS(LEDs, LED)
Q_FLAG_NS(LEDs)
/**
* The Gravity enum is used to specify the direction in which geometry changes during resize.
*/
enum class Gravity {
None,
Left,
Right,
Top,
Bottom,
TopLeft,
TopRight,
BottomLeft,
BottomRight,
};
inline
KWIN_EXPORT xcb_connection_t *connection()
{

View file

@ -2628,7 +2628,7 @@ QPoint Workspace::adjustClientPosition(AbstractClient* c, QPoint pos, bool unres
return pos;
}
QRect Workspace::adjustClientSize(AbstractClient* c, QRect moveResizeGeom, int mode)
QRect Workspace::adjustClientSize(AbstractClient* c, QRect moveResizeGeom, Gravity gravity)
{
//adapted from adjustClientPosition on 29May2004
//this function is called when resizing a window and will modify
@ -2687,32 +2687,32 @@ QRect Workspace::adjustClientSize(AbstractClient* c, QRect moveResizeGeom, int m
deltaX = qAbs(xmax-newrx); \
newrx = xmax; \
}
switch(mode) {
case AbstractClient::PositionBottomRight:
switch (gravity) {
case Gravity::BottomRight:
SNAP_BORDER_BOTTOM
SNAP_BORDER_RIGHT
break;
case AbstractClient::PositionRight:
case Gravity::Right:
SNAP_BORDER_RIGHT
break;
case AbstractClient::PositionBottom:
case Gravity::Bottom:
SNAP_BORDER_BOTTOM
break;
case AbstractClient::PositionTopLeft:
case Gravity::TopLeft:
SNAP_BORDER_TOP
SNAP_BORDER_LEFT
break;
case AbstractClient::PositionLeft:
case Gravity::Left:
SNAP_BORDER_LEFT
break;
case AbstractClient::PositionTop:
case Gravity::Top:
SNAP_BORDER_TOP
break;
case AbstractClient::PositionTopRight:
case Gravity::TopRight:
SNAP_BORDER_TOP
SNAP_BORDER_RIGHT
break;
case AbstractClient::PositionBottomLeft:
case Gravity::BottomLeft:
SNAP_BORDER_BOTTOM
SNAP_BORDER_LEFT
break;
@ -2803,42 +2803,42 @@ QRect Workspace::adjustClientSize(AbstractClient* c, QRect moveResizeGeom, int m
newrx = lrx - 1; \
}
switch(mode) {
case AbstractClient::PositionBottomRight:
switch (gravity) {
case Gravity::BottomRight:
SNAP_WINDOW_BOTTOM
SNAP_WINDOW_RIGHT
SNAP_WINDOW_C_BOTTOM
SNAP_WINDOW_C_RIGHT
break;
case AbstractClient::PositionRight:
case Gravity::Right:
SNAP_WINDOW_RIGHT
SNAP_WINDOW_C_RIGHT
break;
case AbstractClient::PositionBottom:
case Gravity::Bottom:
SNAP_WINDOW_BOTTOM
SNAP_WINDOW_C_BOTTOM
break;
case AbstractClient::PositionTopLeft:
case Gravity::TopLeft:
SNAP_WINDOW_TOP
SNAP_WINDOW_LEFT
SNAP_WINDOW_C_TOP
SNAP_WINDOW_C_LEFT
break;
case AbstractClient::PositionLeft:
case Gravity::Left:
SNAP_WINDOW_LEFT
SNAP_WINDOW_C_LEFT
break;
case AbstractClient::PositionTop:
case Gravity::Top:
SNAP_WINDOW_TOP
SNAP_WINDOW_C_TOP
break;
case AbstractClient::PositionTopRight:
case Gravity::TopRight:
SNAP_WINDOW_TOP
SNAP_WINDOW_RIGHT
SNAP_WINDOW_C_TOP
SNAP_WINDOW_C_RIGHT
break;
case AbstractClient::PositionBottomLeft:
case Gravity::BottomLeft:
SNAP_WINDOW_BOTTOM
SNAP_WINDOW_LEFT
SNAP_WINDOW_C_BOTTOM

View file

@ -198,7 +198,7 @@ public:
QRect adjustClientArea(AbstractClient *client, const QRect &area) const;
QPoint adjustClientPosition(AbstractClient* c, QPoint pos, bool unrestricted, double snapAdjust = 1.0);
QRect adjustClientSize(AbstractClient* c, QRect moveResizeGeom, int mode);
QRect adjustClientSize(AbstractClient* c, QRect moveResizeGeom, Gravity gravity);
void raiseClient(AbstractClient* c, bool nogroup = false);
void lowerClient(AbstractClient* c, bool nogroup = false);
void raiseClientRequest(AbstractClient* c, NET::RequestSource src = NET::FromApplication, xcb_timestamp_t timestamp = 0);

View file

@ -3998,10 +3998,11 @@ bool X11Client::isResizable() const
return false;
if (rules()->checkSize(QSize()).isValid()) // forced size
return false;
const Position mode = interactiveMoveResizePointerMode();
if ((mode == PositionTop || mode == PositionTopLeft || mode == PositionTopRight ||
mode == PositionLeft || mode == PositionBottomLeft) && rules()->checkPosition(invalidPoint) != invalidPoint)
const Gravity gravity = interactiveMoveResizeGravity();
if ((gravity == Gravity::Top || gravity == Gravity::TopLeft || gravity == Gravity::TopRight ||
gravity == Gravity::Left || gravity == Gravity::BottomLeft) && rules()->checkPosition(invalidPoint) != invalidPoint) {
return false;
}
QSize min = minSize();
QSize max = maxSize();

View file

@ -264,25 +264,25 @@ QRect XdgSurfaceClient::adjustMoveResizeGeometry(const QRect &rect) const
{
QRect geometry = rect;
switch (interactiveMoveResizePointerMode()) {
case PositionTopLeft:
switch (interactiveMoveResizeGravity()) {
case Gravity::TopLeft:
geometry.moveRight(moveResizeGeometry().right());
geometry.moveBottom(moveResizeGeometry().bottom());
break;
case PositionTop:
case PositionTopRight:
case Gravity::Top:
case Gravity::TopRight:
geometry.moveLeft(moveResizeGeometry().left());
geometry.moveBottom(moveResizeGeometry().bottom());
break;
case PositionRight:
case PositionBottomRight:
case PositionBottom:
case PositionCenter:
case Gravity::Right:
case Gravity::BottomRight:
case Gravity::Bottom:
case Gravity::None:
geometry.moveLeft(moveResizeGeometry().left());
geometry.moveTop(moveResizeGeometry().top());
break;
case PositionBottomLeft:
case PositionLeft:
case Gravity::BottomLeft:
case Gravity::Left:
geometry.moveRight(moveResizeGeometry().right());
geometry.moveTop(moveResizeGeometry().top());
break;
@ -1005,7 +1005,7 @@ void XdgToplevelClient::doSetQuickTileMode()
bool XdgToplevelClient::doStartInteractiveMoveResize()
{
if (interactiveMoveResizePointerMode() != PositionCenter) {
if (interactiveMoveResizeGravity() != Gravity::None) {
m_nextStates |= XdgToplevelInterface::State::Resizing;
scheduleConfigure();
}
@ -1143,37 +1143,37 @@ void XdgToplevelClient::handleResizeRequested(SeatInterface *seat, XdgToplevelIn
setInteractiveMoveOffset(cursorPos - pos()); // map from global
setInvertedInteractiveMoveOffset(rect().bottomRight() - interactiveMoveOffset());
setUnrestrictedInteractiveMoveResize(false);
Position position;
Gravity gravity;
switch (anchor) {
case XdgToplevelInterface::ResizeAnchor::TopLeft:
position = PositionTopLeft;
gravity = Gravity::TopLeft;
break;
case XdgToplevelInterface::ResizeAnchor::Top:
position = PositionTop;
gravity = Gravity::Top;
break;
case XdgToplevelInterface::ResizeAnchor::TopRight:
position = PositionTopRight;
gravity = Gravity::TopRight;
break;
case XdgToplevelInterface::ResizeAnchor::Right:
position = PositionRight;
gravity = Gravity::Right;
break;
case XdgToplevelInterface::ResizeAnchor::BottomRight:
position = PositionBottomRight;
gravity = Gravity::BottomRight;
break;
case XdgToplevelInterface::ResizeAnchor::Bottom:
position = PositionBottom;
gravity = Gravity::Bottom;
break;
case XdgToplevelInterface::ResizeAnchor::BottomLeft:
position = PositionBottomLeft;
gravity = Gravity::BottomLeft;
break;
case XdgToplevelInterface::ResizeAnchor::Left:
position = PositionLeft;
gravity = Gravity::Left;
break;
default:
position = PositionCenter;
gravity = Gravity::None;
break;
}
setInteractiveMoveResizePointerMode(position);
setInteractiveMoveResizeGravity(gravity);
if (!startInteractiveMoveResize()) {
setInteractiveMoveResizePointerButtonDown(false);
}