From c3f14521c101ce237b8520d03b5be5ab5c35b1e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Gr=C3=A4=C3=9Flin?= Date: Fri, 16 Oct 2015 11:13:41 +0200 Subject: [PATCH] Move moveResizeGeom to AbstractClient Biggest impact on Client::handleMoveResize which directly manipulated the variable in various parts. I tried to keep the impact low. --- abstract_client.cpp | 1 + abstract_client.h | 7 ++++++ client.h | 1 - geometry.cpp | 60 +++++++++++++++++++++++++++------------------ 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/abstract_client.cpp b/abstract_client.cpp index 095d6fc3d9..10ed5c9fc8 100644 --- a/abstract_client.cpp +++ b/abstract_client.cpp @@ -1062,6 +1062,7 @@ void AbstractClient::doMove(int, int) void AbstractClient::updateInitialMoveResizeGeometry() { m_moveResize.initialGeometry = geometry(); + m_moveResize.geometry = m_moveResize.initialGeometry; } } diff --git a/abstract_client.h b/abstract_client.h index 01989280f2..4a80e3989c 100644 --- a/abstract_client.h +++ b/abstract_client.h @@ -642,6 +642,12 @@ protected: * Sets the initial move resize geometry to the current geometry. **/ void updateInitialMoveResizeGeometry(); + QRect moveResizeGeometry() const { + return m_moveResize.geometry; + } + void setMoveResizeGeometry(const QRect &geo) { + m_moveResize.geometry = geo; + } private: void handlePaletteChange(); @@ -695,6 +701,7 @@ private: QPoint offset; QPoint invertedOffset; QRect initialGeometry; + QRect geometry; } m_moveResize; }; diff --git a/client.h b/client.h index dea468ab31..6cef41a17f 100644 --- a/client.h +++ b/client.h @@ -637,7 +637,6 @@ private: bool m_managed; Position mode; - QRect moveResizeGeom; Xcb::GeometryHints m_geometryHints; void sendSyntheticConfigureNotify(); enum MappingState { diff --git a/geometry.cpp b/geometry.cpp index adcb417cb6..6d275d32e4 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -2592,7 +2592,7 @@ void Client::positionGeometryTip() if (!geometryTip) { geometryTip = new GeometryTip(&m_geometryHints); } - QRect wgeom(moveResizeGeom); // position of the frame, size of the window itself + QRect wgeom(moveResizeGeometry()); // position of the frame, size of the window itself wgeom.setWidth(wgeom.width() - (width() - clientSize().width())); wgeom.setHeight(wgeom.height() - (height() - clientSize().height())); if (isShade()) @@ -2658,7 +2658,6 @@ bool Client::startMoveResize() s_haveResizeEffect = effects && static_cast(effects)->provides(Effect::Resize); moveResizeStartScreen = screen(); updateInitialMoveResizeGeometry(); - moveResizeGeom = geometry(); checkUnrestrictedMoveResize(); emit clientStartUserMovedResized(this); if (ScreenEdges::self()->isDesktopSwitchingMovingClients()) @@ -2674,6 +2673,7 @@ void Client::finishMoveResize(bool cancel) if (cancel) setGeometry(initialMoveResizeGeometry()); else { + const QRect &moveResizeGeom = moveResizeGeometry(); if (wasResize) { const bool restoreH = maximizeMode() == MaximizeHorizontal && moveResizeGeom.width() != initialMoveResizeGeometry().width(); @@ -2751,6 +2751,7 @@ void Client::checkUnrestrictedMoveResize() { if (isUnrestrictedMoveResize()) return; + const QRect &moveResizeGeom = moveResizeGeometry(); QRect desktopArea = workspace()->clientArea(WorkArea, moveResizeGeom.center(), desktop()); int left_marge, right_marge, top_marge, bottom_marge, titlebar_marge; // restricted move/resize - keep at least part of the titlebar always visible @@ -2829,7 +2830,7 @@ void Client::handleMoveResize(const QPoint &local, const QPoint &global) setMoveOffset(QPoint(double(moveOffset().x()) / double(oldGeo.width()) * double(geom_restore.width()), double(moveOffset().y()) / double(oldGeo.height()) * double(geom_restore.height()))); if (rules()->checkMaximize(MaximizeRestore) == MaximizeRestore) - moveResizeGeom = geom_restore; + setMoveResizeGeometry(geom_restore); handleMoveResize(local.x(), local.y(), global.x(), global.y()); // fix position } else if (quickTileMode() == QuickTileNone && isResizable()) { checkQuickTilingMaximizationZones(global.x(), global.y()); @@ -2868,11 +2869,12 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) // the bottomleft corner should be at is at (topleft.x(), bottomright().y()) QPoint topleft = globalPos - moveOffset(); QPoint bottomright = globalPos + invertedMoveOffset(); - QRect previousMoveResizeGeom = moveResizeGeom; + QRect previousMoveResizeGeom = moveResizeGeometry(); // TODO move whole group when moving its leader or when the leader is not mapped? auto titleBarRect = [this](bool &transposed, int &requiredPixels) -> QRect { + const QRect &moveResizeGeom = moveResizeGeometry(); QRect r(moveResizeGeom); r.moveTopLeft(QPoint(0,0)); switch (titlebarPosition()) { @@ -2906,31 +2908,31 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) auto calculateMoveResizeGeom = [this, &topleft, &bottomright, &orig, &sizemode]() { switch(mode) { case PositionTopLeft: - moveResizeGeom = QRect(topleft, orig.bottomRight()) ; + setMoveResizeGeometry(QRect(topleft, orig.bottomRight())); break; case PositionBottomRight: - moveResizeGeom = QRect(orig.topLeft(), bottomright) ; + setMoveResizeGeometry(QRect(orig.topLeft(), bottomright)); break; case PositionBottomLeft: - moveResizeGeom = QRect(QPoint(topleft.x(), orig.y()), QPoint(orig.right(), bottomright.y())) ; + setMoveResizeGeometry(QRect(QPoint(topleft.x(), orig.y()), QPoint(orig.right(), bottomright.y()))); break; case PositionTopRight: - moveResizeGeom = QRect(QPoint(orig.x(), topleft.y()), QPoint(bottomright.x(), orig.bottom())) ; + setMoveResizeGeometry(QRect(QPoint(orig.x(), topleft.y()), QPoint(bottomright.x(), orig.bottom()))); break; case PositionTop: - moveResizeGeom = QRect(QPoint(orig.left(), topleft.y()), orig.bottomRight()) ; + setMoveResizeGeometry(QRect(QPoint(orig.left(), topleft.y()), orig.bottomRight())); sizemode = SizemodeFixedH; // try not to affect height break; case PositionBottom: - moveResizeGeom = QRect(orig.topLeft(), QPoint(orig.right(), bottomright.y())) ; + setMoveResizeGeometry(QRect(orig.topLeft(), QPoint(orig.right(), bottomright.y()))); sizemode = SizemodeFixedH; break; case PositionLeft: - moveResizeGeom = QRect(QPoint(topleft.x(), orig.top()), orig.bottomRight()) ; + setMoveResizeGeometry(QRect(QPoint(topleft.x(), orig.top()), orig.bottomRight())); sizemode = SizemodeFixedW; break; case PositionRight: - moveResizeGeom = QRect(orig.topLeft(), QPoint(bottomright.x(), orig.bottom())) ; + setMoveResizeGeometry(QRect(orig.topLeft(), QPoint(bottomright.x(), orig.bottom()))); sizemode = SizemodeFixedW; break; case PositionCenter: @@ -2943,7 +2945,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) // first resize (without checking constrains), then snap, then check bounds, then check constrains calculateMoveResizeGeom(); // adjust new size to snap to other windows/borders - moveResizeGeom = workspace()->adjustClientSize(this, moveResizeGeom, mode); + setMoveResizeGeometry(workspace()->adjustClientSize(this, moveResizeGeometry(), mode)); if (!isUnrestrictedMoveResize()) { // Make sure the titlebar isn't behind a restricted area. We don't need to restrict @@ -2955,10 +2957,10 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) int requiredPixels; QRect bTitleRect = titleBarRect(transposed, requiredPixels); int lastVisiblePixels = -1; - QRect lastTry = moveResizeGeom; + QRect lastTry = moveResizeGeometry(); bool titleFailed = false; for (;;) { - const QRect titleRect(bTitleRect.translated(moveResizeGeom.topLeft())); + const QRect titleRect(bTitleRect.translated(moveResizeGeometry().topLeft())); int visiblePixels = 0; int realVisiblePixels = 0; foreach (const QRect &rect, availableArea.rects()) { @@ -2977,11 +2979,12 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) break; // we won't become better else { if (!titleFailed) - moveResizeGeom = lastTry; + setMoveResizeGeometry(lastTry); titleFailed = true; } } lastVisiblePixels = realVisiblePixels; + QRect moveResizeGeom = moveResizeGeometry(); lastTry = moveResizeGeom; // Not visible enough, move the window to the closest valid point. We bruteforce @@ -3026,15 +3029,16 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) moveResizeGeom.setRight(moveResizeGeom.right() + sign(previousMoveResizeGeom.right() - moveResizeGeom.right())); else break; // no position changed - that's certainly not good + setMoveResizeGeometry(moveResizeGeom); } } // Always obey size hints, even when in "unrestricted" mode - QSize size = adjustedSize(moveResizeGeom.size(), sizemode); + QSize size = adjustedSize(moveResizeGeometry().size(), sizemode); // the new topleft and bottomright corners (after checking size constrains), if they'll be needed - topleft = QPoint(moveResizeGeom.right() - size.width() + 1, moveResizeGeom.bottom() - size.height() + 1); - bottomright = QPoint(moveResizeGeom.left() + size.width() - 1, moveResizeGeom.top() + size.height() - 1); - orig = moveResizeGeom; + topleft = QPoint(moveResizeGeometry().right() - size.width() + 1, moveResizeGeometry().bottom() - size.height() + 1); + bottomright = QPoint(moveResizeGeometry().left() + size.width() - 1, moveResizeGeometry().top() + size.height() - 1); + orig = moveResizeGeometry(); // if aspect ratios are specified, both dimensions may change. // Therefore grow to the right/bottom if needed. @@ -3046,7 +3050,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) calculateMoveResizeGeom(); - if (moveResizeGeom.size() != previousMoveResizeGeom.size()) + if (moveResizeGeometry().size() != previousMoveResizeGeom.size()) update = true; } else if (isMove()) { assert(mode == PositionCenter); @@ -3054,21 +3058,24 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) // Special moving of maximized windows on Xinerama screens int screen = screens()->number(globalPos); if (isFullScreen()) - moveResizeGeom = workspace()->clientArea(FullScreenArea, screen, 0); + setMoveResizeGeometry(workspace()->clientArea(FullScreenArea, screen, 0)); else { - moveResizeGeom = workspace()->clientArea(MaximizeArea, screen, 0); + QRect moveResizeGeom = workspace()->clientArea(MaximizeArea, screen, 0); QSize adjSize = adjustedSize(moveResizeGeom.size(), SizemodeMax); if (adjSize != moveResizeGeom.size()) { QRect r(moveResizeGeom); moveResizeGeom.setSize(adjSize); moveResizeGeom.moveCenter(r.center()); } + setMoveResizeGeometry(moveResizeGeom); } } else { // first move, then snap, then check bounds + QRect moveResizeGeom = moveResizeGeometry(); moveResizeGeom.moveTopLeft(topleft); moveResizeGeom.moveTopLeft(workspace()->adjustClientPosition(this, moveResizeGeom.topLeft(), isUnrestrictedMoveResize())); + setMoveResizeGeometry(moveResizeGeom); if (!isUnrestrictedMoveResize()) { const QRegion strut = workspace()->restrictedMoveArea(desktop()); // Strut areas @@ -3078,6 +3085,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) int requiredPixels; QRect bTitleRect = titleBarRect(transposed, requiredPixels); for (;;) { + QRect moveResizeGeom = moveResizeGeometry(); const QRect titleRect(bTitleRect.translated(moveResizeGeom.topLeft())); int visiblePixels = 0; foreach (const QRect &rect, availableArea.rects()) { @@ -3110,6 +3118,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) } if (newTitleTop > -1) { moveResizeGeom.moveTop(newTitleTop); // invalid position, possibly on screen change + setMoveResizeGeometry(moveResizeGeom); break; } } @@ -3123,6 +3132,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) // Move it back moveResizeGeom.translate(dx, dy); + setMoveResizeGeometry(moveResizeGeom); if (moveResizeGeom == previousMoveResizeGeom) { break; // Prevent lockup @@ -3130,7 +3140,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) } } } - if (moveResizeGeom.topLeft() != previousMoveResizeGeom.topLeft()) + if (moveResizeGeometry().topLeft() != previousMoveResizeGeom.topLeft()) update = true; } else abort(); @@ -3151,6 +3161,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) syncRequest.isPending = true; // limit the resizes to 30Hz to take pointless load from X11 syncRequest.timeout->start(33); // and the client, the mouse is still moved at full speed } // and no human can control faster resizes anyway + const QRect &moveResizeGeom = moveResizeGeometry(); m_client.setGeometry(0, 0, moveResizeGeom.width() - (borderLeft() + borderRight()), moveResizeGeom.height() - (borderTop() + borderBottom())); } else performMoveResize(); @@ -3162,6 +3173,7 @@ void Client::handleMoveResize(int x, int y, int x_root, int y_root) void Client::performMoveResize() { + const QRect &moveResizeGeom = moveResizeGeometry(); if (isMove() || (isResize() && !s_haveResizeEffect)) { setGeometry(moveResizeGeom); }