From 3b34e9309b166072f73898017b88208a2f04b947 Mon Sep 17 00:00:00 2001 From: Alik Aslanyan Date: Sun, 30 Jun 2024 16:54:44 -0400 Subject: [PATCH] tiling: Don't put maximized windows in tile After !5532 existing behavior in public scripting API was changed for maximized Windows. Maximized Windows didn't have a tile on purpose. This behaviour was changed, as after refactoring separate members for storing QuickTileMode in Window and tile itself were unified Previously QuickTileMode::Maximize was only set in the Window itself in m_quickTileMode, while tile itself was removed (by setTile(nullptr)). Current QuickTileMod for current Window isn't part of public scripting API, so it's okay to break it. This restores compatability with scripts created for KWin 6.0.5 and earlier BUG: 489463 Signed-off-by: Alik Aslanyan --- .../integration/move_resize_window_test.cpp | 18 ++++- autotests/integration/quick_tiling_test.cpp | 66 +++++++++++++------ src/x11window.cpp | 6 +- src/xdgshellwindow.cpp | 10 +-- 4 files changed, 64 insertions(+), 36 deletions(-) diff --git a/autotests/integration/move_resize_window_test.cpp b/autotests/integration/move_resize_window_test.cpp index 305b56e39c..55694cbd5f 100644 --- a/autotests/integration/move_resize_window_test.cpp +++ b/autotests/integration/move_resize_window_test.cpp @@ -821,14 +821,22 @@ void MoveResizeWindowTest::testCancelInteractiveMoveResize() } else { window->setQuickTileMode(quickTileMode, true); } - QCOMPARE(window->requestedQuickTileMode(), quickTileMode); + if (quickTileMode == QuickTileFlag::Maximize) { + QCOMPARE(window->requestedQuickTileMode(), QuickTileFlag::None); + } else { + QCOMPARE(window->requestedQuickTileMode(), quickTileMode); + } QCOMPARE(window->requestedMaximizeMode(), maximizeMode); QVERIFY(surfaceConfigureRequestedSpy.wait()); shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value()); Test::render(surface.get(), toplevelConfigureRequestedSpy.last().first().toSize(), Qt::blue); QVERIFY(frameGeomtryChangedSpy.wait()); - QCOMPARE(window->quickTileMode(), quickTileMode); + if (quickTileMode == QuickTileFlag::Maximize) { + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); + } else { + QCOMPARE(window->quickTileMode(), quickTileMode); + } const QRectF geometry = window->moveResizeGeometry(); const QRectF geometryRestore = window->geometryRestore(); @@ -861,7 +869,11 @@ void MoveResizeWindowTest::testCancelInteractiveMoveResize() Test::render(surface.get(), toplevelConfigureRequestedSpy.last().first().toSize(), Qt::blue); QVERIFY(frameGeomtryChangedSpy.wait()); QCOMPARE(window->moveResizeGeometry(), geometry); - QCOMPARE(window->quickTileMode(), quickTileMode); + if (quickTileMode == QuickTileFlag::Maximize) { + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); + } else { + QCOMPARE(window->quickTileMode(), quickTileMode); + } QCOMPARE(window->requestedMaximizeMode(), maximizeMode); QCOMPARE(window->geometryRestore(), geometryRestore); } diff --git a/autotests/integration/quick_tiling_test.cpp b/autotests/integration/quick_tiling_test.cpp index 330c6e052b..ecf4c30970 100644 --- a/autotests/integration/quick_tiling_test.cpp +++ b/autotests/integration/quick_tiling_test.cpp @@ -6,7 +6,6 @@ SPDX-License-Identifier: GPL-2.0-or-later */ -#include "effect/globals.h" #include "kwin_wayland_test.h" #include "core/output.h" @@ -179,8 +178,12 @@ void QuickTilingTest::testQuickTiling() // at this point the geometry did not yet change QCOMPARE(window->frameGeometry(), QRect(0, 0, 100, 50)); - // but requested quick tile mode already changed, proper quickTileMode not yet - QCOMPARE(window->requestedQuickTileMode(), mode); + // Manually maximized window is always without a tile + if (mode == QuickTileFlag::Maximize) { + QCOMPARE(window->requestedQuickTileMode(), QuickTileFlag::None); + } else { + QCOMPARE(window->requestedQuickTileMode(), mode); + } // Actual quickTileMOde didn't change yet QCOMPARE(window->quickTileMode(), oldQuickTileMode); @@ -196,19 +199,28 @@ void QuickTilingTest::testQuickTiling() QVERIFY(frameGeometryChangedSpy.wait()); QCOMPARE(frameGeometryChangedSpy.count(), 1); QCOMPARE(window->frameGeometry(), expectedGeometry); - QCOMPARE(quickTileChangedSpy.count(), 1); - QCOMPARE(window->quickTileMode(), mode); + if (mode == QuickTileFlag::Maximize) { + QCOMPARE(quickTileChangedSpy.count(), 0); + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); + } else { + QCOMPARE(quickTileChangedSpy.count(), 1); + QCOMPARE(window->quickTileMode(), mode); + } // send window to other screen QList outputs = workspace()->outputs(); QCOMPARE(window->output(), outputs[0]); window->sendToOutput(outputs[1]); QCOMPARE(window->output(), outputs[1]); - // quick tile should not be changed - QCOMPARE(window->quickTileMode(), mode); + if (mode == QuickTileFlag::Maximize) { + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); + } else { + // quick tile should not be changed + QCOMPARE(window->quickTileMode(), mode); + } QTEST(window->frameGeometry(), "secondScreen"); Tile *tile = workspace()->tileManager(outputs[1])->quickTile(mode); - QCOMPARE(window->tile(), tile); + QCOMPARE(window->tile(), mode == QuickTileFlag::Maximize ? nullptr : tile); // now try to toggle again window->setQuickTileMode(mode, true); @@ -218,8 +230,13 @@ void QuickTilingTest::testQuickTiling() shellSurface->xdgSurface()->ack_configure(surfaceConfigureRequestedSpy.last().at(0).value()); Test::render(surface.get(), toplevelConfigureRequestedSpy.last().at(0).toSize(), Qt::red); - QVERIFY(quickTileChangedSpy.wait()); - QCOMPARE(quickTileChangedSpy.count(), 2); + if (mode == QuickTileFlag::Maximize) { + QVERIFY(!quickTileChangedSpy.wait()); + QCOMPARE(quickTileChangedSpy.count(), 0); + } else { + QVERIFY(quickTileChangedSpy.wait()); + QCOMPARE(quickTileChangedSpy.count(), 2); + } QTEST(window->quickTileMode(), "expectedModeAfterToggle"); } @@ -265,8 +282,8 @@ void QuickTilingTest::testQuickMaximizing() // at this point the geometry did not yet change QCOMPARE(window->frameGeometry(), QRect(0, 0, 100, 50)); - // but requested quick tile mode already changed - QCOMPARE(window->requestedQuickTileMode(), QuickTileFlag::Maximize); + // Manually maximized window is always without a tile + QCOMPARE(window->requestedQuickTileMode(), QuickTileFlag::None); QCOMPARE(window->quickTileMode(), oldQuickTileMode); QCOMPARE(window->geometryRestore(), QRect(0, 0, 100, 50)); @@ -281,14 +298,15 @@ void QuickTilingTest::testQuickMaximizing() QVERIFY(frameGeometryChangedSpy.wait()); QCOMPARE(frameGeometryChangedSpy.count(), 1); - QCOMPARE(quickTileChangedSpy.count(), 1); - QCOMPARE(window->quickTileMode(), QuickTileFlag::Maximize); + QCOMPARE(quickTileChangedSpy.count(), 0); + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); QCOMPARE(window->frameGeometry(), QRect(0, 0, 1280, 1024)); QCOMPARE(window->geometryRestore(), QRect(0, 0, 100, 50)); // window is now set to maximised QCOMPARE(maximizeChangedSpy.count(), 1); QCOMPARE(window->maximizeMode(), MaximizeFull); + QCOMPARE(window->tile(), nullptr); // go back to quick tile none QFETCH(QuickTileMode, mode); @@ -308,7 +326,7 @@ void QuickTilingTest::testQuickMaximizing() QVERIFY(frameGeometryChangedSpy.wait()); QCOMPARE(frameGeometryChangedSpy.count(), 2); - QCOMPARE(quickTileChangedSpy.count(), 2); + QCOMPARE(quickTileChangedSpy.count(), 0); QCOMPARE(window->quickTileMode(), QuickTileMode(QuickTileFlag::None)); QCOMPARE(window->frameGeometry(), QRect(0, 0, 100, 50)); QCOMPARE(window->geometryRestore(), QRect(0, 0, 100, 50)); @@ -620,10 +638,15 @@ void QuickTilingTest::testX11QuickTiling() const QRectF origGeo = window->frameGeometry(); QFETCH(QuickTileMode, mode); window->setQuickTileMode(mode, true); - QCOMPARE(window->quickTileMode(), mode); + if (mode == QuickTileFlag::Maximize) { + QCOMPARE(quickTileChangedSpy.count(), 0); + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); + } else { + QCOMPARE(quickTileChangedSpy.count(), 1); + QCOMPARE(window->quickTileMode(), mode); + } QTEST(window->frameGeometry(), "expectedGeometry"); QCOMPARE(window->geometryRestore(), origGeo); - QCOMPARE(quickTileChangedSpy.count(), 1); // quick tile to same edge again should also act like send to screen // if screen is on the same edge @@ -706,9 +729,14 @@ void QuickTilingTest::testX11QuickTilingAfterVertMaximize() QSignalSpy quickTileChangedSpy(window, &Window::quickTileModeChanged); QFETCH(QuickTileMode, mode); window->setQuickTileMode(mode, true); - QCOMPARE(window->quickTileMode(), mode); + if (mode == QuickTileFlag::Maximize) { + QCOMPARE(window->quickTileMode(), QuickTileFlag::None); + QCOMPARE(quickTileChangedSpy.count(), 0); + } else { + QCOMPARE(window->quickTileMode(), mode); + QCOMPARE(quickTileChangedSpy.count(), 1); + } QTEST(window->frameGeometry(), "expectedGeometry"); - QCOMPARE(quickTileChangedSpy.count(), 1); // and destroy the window again xcb_unmap_window(c.get(), windowId); diff --git a/src/x11window.cpp b/src/x11window.cpp index 10a9a875a3..79641b703f 100644 --- a/src/x11window.cpp +++ b/src/x11window.cpp @@ -4645,11 +4645,7 @@ void X11Window::maximize(MaximizeMode mode) case MaximizeFull: { moveResize(clientArea); - if (options->electricBorderMaximize()) { - updateQuickTileMode(QuickTileFlag::Maximize); - } else { - updateQuickTileMode(QuickTileFlag::None); - } + updateQuickTileMode(QuickTileFlag::None); info->setState(NET::Max, NET::Max); break; } diff --git a/src/xdgshellwindow.cpp b/src/xdgshellwindow.cpp index b846c509ca..b64abc5936 100644 --- a/src/xdgshellwindow.cpp +++ b/src/xdgshellwindow.cpp @@ -1642,15 +1642,7 @@ void XdgToplevelWindow::maximize(MaximizeMode mode) } } - if (m_requestedMaximizeMode == MaximizeFull) { - if (options->electricBorderMaximize()) { - updateQuickTileMode(QuickTileFlag::Maximize); - } else { - updateQuickTileMode(QuickTileFlag::None); - } - } else { - updateQuickTileMode(QuickTileFlag::None); - } + updateQuickTileMode(QuickTileFlag::None); moveResize(geometry);