Guard against calling set_size while applying a configure event more explicitly

Depending on code path taken, geometry.size() == m_pendingSize can
produce incorrect results.

If a configure event is applied, it's fine.

If the window is resized by user, m_pendingSize will have outdated value,
and setWindowGeometry() can ignore future size updates that are valid.

In hindsight, we need special hooks in the QWaylandWindow to request and
apply new geometry. Rather than have one function that deals with all cases.
This commit is contained in:
Vlad Zahorodnii 2024-04-03 13:07:55 +03:00
parent c407f9a8c4
commit 127d817aa1
2 changed files with 5 additions and 3 deletions

View File

@ -99,7 +99,7 @@ void QWaylandLayerSurface::zwlr_layer_surface_v1_configure(uint32_t serial, uint
if (!m_configured) { if (!m_configured) {
m_configured = true; m_configured = true;
window()->resizeFromApplyConfigure(m_pendingSize); applyConfigure();
sendExpose(); sendExpose();
} else { } else {
// Later configures are resizes, so we have to queue them up for a time when we // Later configures are resizes, so we have to queue them up for a time when we
@ -121,7 +121,9 @@ void QWaylandLayerSurface::attachPopup(QtWaylandClient::QWaylandShellSurface *po
void QWaylandLayerSurface::applyConfigure() void QWaylandLayerSurface::applyConfigure()
{ {
m_configuring = true;
window()->resizeFromApplyConfigure(m_pendingSize); window()->resizeFromApplyConfigure(m_pendingSize);
m_configuring = false;
} }
void QWaylandLayerSurface::setAnchor(uint anchor) void QWaylandLayerSurface::setAnchor(uint anchor)
@ -160,8 +162,7 @@ void QWaylandLayerSurface::setLayer(uint32_t layer)
void QWaylandLayerSurface::setWindowGeometry(const QRect &geometry) void QWaylandLayerSurface::setWindowGeometry(const QRect &geometry)
{ {
// if we are setting it to the last size we were configured at, we don't need to do anything if (m_configuring) {
if (geometry.size() == m_pendingSize && !m_waitForSyncCallback) {
return; return;
} }

View File

@ -62,6 +62,7 @@ private:
QString m_activationToken; QString m_activationToken;
bool m_configured = false; bool m_configured = false;
bool m_configuring = false;
static const wl_callback_listener syncCallbackListener; static const wl_callback_listener syncCallbackListener;
struct wl_callback *m_waitForSyncCallback = nullptr; struct wl_callback *m_waitForSyncCallback = nullptr;