Avoid mixing current and next state
Mixing of current and next state can create all sorts of undefined behavior, e.g. windows not moving to the desired location or experiencing issues when tiling a maximized window. BUG: 449541
This commit is contained in:
parent
3fb6901646
commit
c54937b2ad
1 changed files with 5 additions and 6 deletions
|
@ -2302,8 +2302,7 @@ void AbstractClient::setDecoration(QSharedPointer<KDecoration2::Decoration> deco
|
||||||
this, &AbstractClient::updateDecorationInputShape);
|
this, &AbstractClient::updateDecorationInputShape);
|
||||||
connect(decoration.data(), &KDecoration2::Decoration::bordersChanged, this, [this]() {
|
connect(decoration.data(), &KDecoration2::Decoration::bordersChanged, this, [this]() {
|
||||||
GeometryUpdatesBlocker blocker(this);
|
GeometryUpdatesBlocker blocker(this);
|
||||||
const QRect oldGeometry = frameGeometry();
|
const QRect oldGeometry = moveResizeGeometry();
|
||||||
resize(implicitSize());
|
|
||||||
if (!isShade()) {
|
if (!isShade()) {
|
||||||
checkWorkspacePosition(oldGeometry);
|
checkWorkspacePosition(oldGeometry);
|
||||||
}
|
}
|
||||||
|
@ -3096,7 +3095,7 @@ void AbstractClient::setQuickTileMode(QuickTileMode mode, bool keyboard)
|
||||||
GeometryUpdatesBlocker blocker(this);
|
GeometryUpdatesBlocker blocker(this);
|
||||||
|
|
||||||
if (mode == QuickTileMode(QuickTileFlag::Maximize)) {
|
if (mode == QuickTileMode(QuickTileFlag::Maximize)) {
|
||||||
if (maximizeMode() == MaximizeFull) {
|
if (requestedMaximizeMode() == MaximizeFull) {
|
||||||
m_quickTileMode = int(QuickTileFlag::None);
|
m_quickTileMode = int(QuickTileFlag::None);
|
||||||
setMaximize(false, false);
|
setMaximize(false, false);
|
||||||
} else {
|
} else {
|
||||||
|
@ -3117,7 +3116,7 @@ void AbstractClient::setQuickTileMode(QuickTileMode mode, bool keyboard)
|
||||||
mode &= ~QuickTileMode(QuickTileFlag::Vertical);
|
mode &= ~QuickTileMode(QuickTileFlag::Vertical);
|
||||||
|
|
||||||
// restore from maximized so that it is possible to tile maximized windows with one hit or by dragging
|
// restore from maximized so that it is possible to tile maximized windows with one hit or by dragging
|
||||||
if (maximizeMode() != MaximizeRestore) {
|
if (requestedMaximizeMode() != MaximizeRestore) {
|
||||||
|
|
||||||
if (mode != QuickTileMode(QuickTileFlag::None)) {
|
if (mode != QuickTileMode(QuickTileFlag::None)) {
|
||||||
m_quickTileMode = int(QuickTileFlag::None); // Temporary, so the maximize code doesn't get all confused
|
m_quickTileMode = int(QuickTileFlag::None); // Temporary, so the maximize code doesn't get all confused
|
||||||
|
@ -3327,13 +3326,13 @@ void AbstractClient::checkWorkspacePosition(QRect oldGeometry, const VirtualDesk
|
||||||
if (!oldGeometry.isValid()) {
|
if (!oldGeometry.isValid()) {
|
||||||
oldGeometry = newGeom;
|
oldGeometry = newGeom;
|
||||||
}
|
}
|
||||||
if (isFullScreen()) {
|
if (isRequestedFullScreen()) {
|
||||||
moveResize(workspace()->clientArea(FullScreenArea, this, newGeom.center()));
|
moveResize(workspace()->clientArea(FullScreenArea, this, newGeom.center()));
|
||||||
updateGeometryRestoresForFullscreen(kwinApp()->platform()->outputAt(newGeom.center()));
|
updateGeometryRestoresForFullscreen(kwinApp()->platform()->outputAt(newGeom.center()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maximizeMode() != MaximizeRestore) {
|
if (requestedMaximizeMode() != MaximizeRestore) {
|
||||||
changeMaximize(false, false, true); // adjust size
|
changeMaximize(false, false, true); // adjust size
|
||||||
QRect geom = moveResizeGeometry();
|
QRect geom = moveResizeGeometry();
|
||||||
const QRect screenArea = workspace()->clientArea(ScreenArea, this, geom.center());
|
const QRect screenArea = workspace()->clientArea(ScreenArea, this, geom.center());
|
||||||
|
|
Loading…
Reference in a new issue