From 083437d487ab4a5a985ac5ca1f02c7961cb9afb7 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Fri, 27 May 2022 12:34:14 +0200 Subject: [PATCH] Don't use QRect::bottom when applying virtual keyboard geometry Bottom is unreliable because of "historical reasons" in Qt. So don't use bottom, instead calculate the proper height and top manually. --- autotests/integration/move_resize_window_test.cpp | 6 +++--- src/window.cpp | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/autotests/integration/move_resize_window_test.cpp b/autotests/integration/move_resize_window_test.cpp index d702c94b0b..9097dbab7d 100644 --- a/autotests/integration/move_resize_window_test.cpp +++ b/autotests/integration/move_resize_window_test.cpp @@ -906,7 +906,7 @@ void MoveResizeWindowTest::testResizeForVirtualKeyboard() Test::render(surface.data(), toplevelConfigureRequestedSpy.last().first().toSize(), Qt::blue); QVERIFY(frameGeometryChangedSpy.wait()); - QCOMPARE(window->frameGeometry(), QRect(100, 0, 500, 101)); + QCOMPARE(window->frameGeometry(), QRect(100, 0, 500, 100)); window->setVirtualKeyboardGeometry(QRect()); QVERIFY(surfaceConfigureRequestedSpy.wait()); @@ -950,7 +950,7 @@ void MoveResizeWindowTest::testResizeForVirtualKeyboardWithMaximize() // render at the new size Test::render(surface.data(), toplevelConfigureRequestedSpy.last().first().toSize(), Qt::blue); QVERIFY(frameGeometryChangedSpy.wait()); - QCOMPARE(window->frameGeometry(), QRect(100, 0, 500, 101)); + QCOMPARE(window->frameGeometry(), QRect(100, 0, 500, 100)); window->setMaximize(true, true); QVERIFY(surfaceConfigureRequestedSpy.wait()); @@ -1003,7 +1003,7 @@ void MoveResizeWindowTest::testResizeForVirtualKeyboardWithFullScreen() // render at the new size Test::render(surface.data(), toplevelConfigureRequestedSpy.last().first().toSize(), Qt::blue); QVERIFY(frameGeometryChangedSpy.wait()); - QCOMPARE(window->frameGeometry(), QRect(100, 0, 500, 101)); + QCOMPARE(window->frameGeometry(), QRect(100, 0, 500, 100)); window->setFullScreen(true, true); QVERIFY(surfaceConfigureRequestedSpy.wait()); diff --git a/src/window.cpp b/src/window.cpp index d7ed456a60..b3fdb59b6c 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -3264,8 +3264,9 @@ void Window::setVirtualKeyboardGeometry(const QRect &geo) const QRect availableArea = workspace()->clientArea(MaximizeArea, this); QRect newWindowGeometry = (maximizeMode() & MaximizeHorizontal) ? availableArea : m_keyboardGeometryRestore; - newWindowGeometry.moveBottom(geo.top()); - newWindowGeometry.setTop(qMax(newWindowGeometry.top(), availableArea.top())); + newWindowGeometry.setHeight(std::min(newWindowGeometry.height(), geo.top() - availableArea.top())); + newWindowGeometry.moveTop(std::max(geo.top() - newWindowGeometry.height(), availableArea.top())); + newWindowGeometry = newWindowGeometry.intersected(availableArea); moveResize(newWindowGeometry); }