summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Kerling <pkerling@casix.org>2017-07-26 14:02:21 +0200
committerQuentin Glidic <sardemff7+git@sardemff7.net>2017-07-26 16:46:13 +0200
commitc623902ecaa191c7eccfcb7c212313407da82c56 (patch)
treeb9f9f1b1a83343cbac6e21232340443503bd1167
parentba8a0d041ed83ebe18b919d8b2c8a02849ca1c7e (diff)
libweston-desktop/xdg-shell: Check window geometry instead of surface size against configured size
Shell surfaces may have a geometry that is different to the size of their main surface, e.g. due to subcompositing. In states where size is strictly enforced (fullscreen and maximized), the size that the compositor wants must be checked against the window geometry and not just the main surface size. Fix by calling weston_desktop_surface_get_geometry and using that size instead of main surface size. Signed-off-by: Philipp Kerling <pkerling@casix.org> Reviewed-by: Quentin Glidic <sardemff7+git@sardemff7.net>
-rw-r--r--libweston-desktop/xdg-shell-v5.c4
-rw-r--r--libweston-desktop/xdg-shell-v6.c7
2 files changed, 9 insertions, 2 deletions
diff --git a/libweston-desktop/xdg-shell-v5.c b/libweston-desktop/xdg-shell-v5.c
index d7c49b15..77d004e1 100644
--- a/libweston-desktop/xdg-shell-v5.c
+++ b/libweston-desktop/xdg-shell-v5.c
@@ -264,6 +264,10 @@ weston_desktop_xdg_surface_committed(struct weston_desktop_surface *dsurface,
weston_desktop_surface_get_surface(surface->surface);
bool reconfigure = false;
+ /* TODO: use the window geometry and not the surface size here
+ * We need to check the next geometry if there is one, but not accept it
+ * until we checked it, maybe.
+ */
if (surface->next.state.maximized || surface->next.state.fullscreen)
reconfigure = surface->next.size.width != wsurface->width ||
surface->next.size.height != wsurface->height;
diff --git a/libweston-desktop/xdg-shell-v6.c b/libweston-desktop/xdg-shell-v6.c
index dda0bf92..1344dda0 100644
--- a/libweston-desktop/xdg-shell-v6.c
+++ b/libweston-desktop/xdg-shell-v6.c
@@ -644,9 +644,12 @@ weston_desktop_xdg_toplevel_committed(struct weston_desktop_xdg_toplevel *toplev
if (!wsurface->buffer_ref.buffer)
return;
+ struct weston_geometry geometry =
+ weston_desktop_surface_get_geometry(toplevel->base.desktop_surface);
+
if ((toplevel->next.state.maximized || toplevel->next.state.fullscreen) &&
- (toplevel->next.size.width != wsurface->width ||
- toplevel->next.size.height != wsurface->height)) {
+ (toplevel->next.size.width != geometry.width ||
+ toplevel->next.size.height != geometry.height)) {
struct weston_desktop_client *client =
weston_desktop_surface_get_client(toplevel->base.desktop_surface);
struct wl_resource *client_resource =