Client (xdg-shell): Only restore normal size when not maximized

kwin and perhaps other compositors sometimes send questionable configure events
with state set to maximized and size == {0,0}.

Previously, we would then restore the m_normalSize, which would give us a
maximized window with the size of a windowed (normal) one.

A size of zero usually means that it's up to the client to decide, which makes
sense for non-maximized windows, but not so much for maximized ones. This is
what the protocol spec says about the maximized state:

    The surface is maximized. The window geometry specified in the configure
    event must be obeyed by the client.

It's fixed in the dev version of kwin, but until then, let's be on the safe
side and only resize the window if things make sense.

[ChangeLog][QPA plugin] Fixed a bug where maximized windows would resize to
their unmaximized size if the compositor sent an invalid configure event.

Change-Id: I2371b29c82426ac48cd1c18c14c3dd0fe4f2250e
Reviewed-by: David Edmundson <davidedmundson@kde.org>
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
This commit is contained in:
Johan Klokkhammer Helsing 2018-06-19 15:00:20 +02:00 committed by Johan Helsing
parent e71099c07e
commit 6f183c7db7
2 changed files with 22 additions and 8 deletions

View File

@ -72,9 +72,6 @@ void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
if (!(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
m_normalSize = m_xdgSurface->m_window->window()->frameGeometry().size();
if (m_pending.size.isEmpty() && !m_normalSize.isEmpty())
m_pending.size = m_normalSize;
if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive))
m_xdgSurface->m_window->display()->handleWindowActivated(m_xdgSurface->m_window);
@ -85,10 +82,20 @@ void QWaylandXdgSurfaceV6::Toplevel::applyConfigure()
Qt::WindowStates statesWithoutActive = m_pending.states & ~Qt::WindowActive;
m_xdgSurface->m_window->handleWindowStatesChanged(statesWithoutActive);
m_xdgSurface->m_window->resizeFromApplyConfigure(m_pending.size);
if (m_pending.size.isEmpty()) {
// An empty size in the configure means it's up to the client to choose the size
bool normalPending = !(m_pending.states & (Qt::WindowMaximized|Qt::WindowFullScreen));
if (normalPending && !m_normalSize.isEmpty())
m_xdgSurface->m_window->resizeFromApplyConfigure(m_normalSize);
} else {
m_xdgSurface->m_window->resizeFromApplyConfigure(m_pending.size);
}
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
m_applied = m_pending;
qCDebug(lcQpaWayland) << "Applied pending zxdg_toplevel_v6 configure event:" << m_applied.size << m_applied.states;
}
void QWaylandXdgSurfaceV6::Toplevel::zxdg_toplevel_v6_configure(int32_t width, int32_t height, wl_array *states)

View File

@ -82,9 +82,6 @@ void QWaylandXdgSurface::Toplevel::applyConfigure()
if (!(m_applied.states & (Qt::WindowMaximized|Qt::WindowFullScreen)))
m_normalSize = m_xdgSurface->m_window->window()->frameGeometry().size();
if (m_pending.size.isEmpty() && !m_normalSize.isEmpty())
m_pending.size = m_normalSize;
if ((m_pending.states & Qt::WindowActive) && !(m_applied.states & Qt::WindowActive))
m_xdgSurface->m_window->display()->handleWindowActivated(m_xdgSurface->m_window);
@ -95,10 +92,20 @@ void QWaylandXdgSurface::Toplevel::applyConfigure()
Qt::WindowStates statesWithoutActive = m_pending.states & ~Qt::WindowActive;
m_xdgSurface->m_window->handleWindowStatesChanged(statesWithoutActive);
m_xdgSurface->m_window->resizeFromApplyConfigure(m_pending.size);
if (m_pending.size.isEmpty()) {
// An empty size in the configure means it's up to the client to choose the size
bool normalPending = !(m_pending.states & (Qt::WindowMaximized|Qt::WindowFullScreen));
if (normalPending && !m_normalSize.isEmpty())
m_xdgSurface->m_window->resizeFromApplyConfigure(m_normalSize);
} else {
m_xdgSurface->m_window->resizeFromApplyConfigure(m_pending.size);
}
QSize windowGeometrySize = m_xdgSurface->m_window->window()->frameGeometry().size();
m_xdgSurface->set_window_geometry(0, 0, windowGeometrySize.width(), windowGeometrySize.height());
m_applied = m_pending;
qCDebug(lcQpaWayland) << "Applied pending xdg_toplevel configure event:" << m_applied.size << m_applied.states;
}
bool QWaylandXdgSurface::Toplevel::wantsDecorations()