summaryrefslogtreecommitdiffstats
path: root/src/client/qwaylandwindow.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/qwaylandwindow.cpp')
-rw-r--r--src/client/qwaylandwindow.cpp31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp
index 73fb331eb..1f9e99914 100644
--- a/src/client/qwaylandwindow.cpp
+++ b/src/client/qwaylandwindow.cpp
@@ -60,8 +60,6 @@ QWaylandWindow::QWaylandWindow(QWindow *window, QWaylandDisplay *display)
mFrameCallbackTimeout = frameCallbackTimeout;
}
- mScale = waylandScreen() ? waylandScreen()->scale() : 1; // fallback to 1 if we don't have a real screen
-
static WId id = 1;
mWindowId = id++;
initializeWlSurface();
@@ -327,6 +325,7 @@ void QWaylandWindow::reset()
mWaitingToApplyConfigure = false;
mCanResize = true;
mResizeDirty = false;
+ mScale = std::nullopt;
mOpaqueArea = QRegion();
mMask = QRegion();
@@ -463,7 +462,7 @@ void QWaylandWindow::setGeometry(const QRect &r)
if (mShellSurface) {
mShellSurface->setWindowGeometry(windowContentGeometry());
- if (!qt_window_private(window())->positionAutomatic)
+ if (!qt_window_private(window())->positionAutomatic && !mInResizeFromApplyConfigure)
mShellSurface->setWindowPosition(windowGeometry().topLeft());
}
@@ -558,7 +557,6 @@ QPlatformScreen *QWaylandWindow::calculateScreenFromSurfaceEvents() const
if (auto *screen = mSurface->oldestEnteredScreen())
return screen;
}
-
return QPlatformWindow::screen();
}
@@ -891,6 +889,7 @@ QMargins QWaylandWindow::clientSideMargins() const
void QWaylandWindow::setCustomMargins(const QMargins &margins) {
const QMargins oldMargins = mCustomMargins;
mCustomMargins = margins;
+ propagateSizeHints();
setGeometry(geometry().marginsRemoved(oldMargins).marginsAdded(margins));
}
@@ -1185,8 +1184,15 @@ QWaylandWindow *QWaylandWindow::guessTransientParent() const
if (auto transientParent = closestShellSurfaceWindow(window()->transientParent()))
return transientParent;
- if (QGuiApplication::focusWindow() && (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup))
- return closestShellSurfaceWindow(QGuiApplication::focusWindow());
+ if (window()->type() == Qt::Popup) {
+ if (mTopPopup)
+ return mTopPopup;
+ }
+
+ if (window()->type() == Qt::ToolTip || window()->type() == Qt::Popup) {
+ if (auto lastInputWindow = display()->lastInputWindow())
+ return closestShellSurfaceWindow(lastInputWindow->window());
+ }
return nullptr;
}
@@ -1433,14 +1439,11 @@ void QWaylandWindow::handleScreensChanged()
{
QPlatformScreen *newScreen = calculateScreenFromSurfaceEvents();
- if (newScreen == mLastReportedScreen)
+ if (newScreen->screen() == window()->screen())
return;
- if (!newScreen->isPlaceholder() && !newScreen->QPlatformScreen::screen())
- mDisplay->forceRoundTrip();
QWindowSystemInterface::handleWindowScreenChanged(window(), newScreen->QPlatformScreen::screen());
- mLastReportedScreen = newScreen;
if (fixedToplevelPositions && !QPlatformWindow::parent() && window()->type() != Qt::Popup
&& window()->type() != Qt::ToolTip
&& geometry().topLeft() != newScreen->geometry().topLeft()) {
@@ -1470,13 +1473,13 @@ void QWaylandWindow::updateScale()
return;
}
- int scale = mLastReportedScreen->isPlaceholder() ? 1 : static_cast<QWaylandScreen *>(mLastReportedScreen)->scale();
+ int scale = screen()->isPlaceholder() ? 1 : static_cast<QWaylandScreen *>(screen())->scale();
setScale(scale);
}
void QWaylandWindow::setScale(qreal newScale)
{
- if (qFuzzyCompare(mScale, newScale))
+ if (mScale.has_value() && qFuzzyCompare(mScale.value(), newScale))
return;
mScale = newScale;
@@ -1485,7 +1488,7 @@ void QWaylandWindow::setScale(qreal newScale)
if (mViewport)
updateViewport();
else if (mSurface->version() >= 3)
- mSurface->set_buffer_scale(std::ceil(mScale));
+ mSurface->set_buffer_scale(std::ceil(newScale));
}
ensureSize();
@@ -1547,7 +1550,7 @@ qreal QWaylandWindow::scale() const
qreal QWaylandWindow::devicePixelRatio() const
{
- return qreal(mScale);
+ return mScale.value_or(waylandScreen() ? waylandScreen()->scale() : 1);
}
bool QWaylandWindow::setMouseGrabEnabled(bool grab)