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:
parent
b15681fd9c
commit
907c440e22
8 changed files with 152 additions and 149 deletions
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue