desktop-shell: Unset fullscreen/maximized state on commit
This only stores the current state, as libweston-desktop is still in
charge of double-buffering it.
Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
Reviewed-by: Jonas Ã…dahl <jadahl@gmail.com>
diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
index 653e85b..35dbbaa 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -129,6 +129,8 @@
struct weston_output *output;
struct surface_state {
+ bool fullscreen;
+ bool maximized;
bool lowered;
} state;
@@ -2404,10 +2406,10 @@
struct weston_seat *seat;
/* initial positioning, see also configure() */
- if (weston_desktop_surface_get_fullscreen(shsurf->desktop_surface)) {
+ if (shsurf->state.fullscreen) {
center_on_output(shsurf->view, shsurf->fullscreen_output);
shell_map_fullscreen(shsurf);
- } else if (weston_desktop_surface_get_maximized(shsurf->desktop_surface)) {
+ } else if (shsurf->state.maximized) {
set_maximized_position(shell, shsurf);
} else {
weston_view_set_initial_position(shsurf->view, shell);
@@ -2418,7 +2420,7 @@
weston_view_update_transform(shsurf->view);
shsurf->view->is_mapped = true;
- if (weston_desktop_surface_get_maximized(shsurf->desktop_surface)) {
+ if (shsurf->state.maximized) {
surface->output = shsurf->output;
shsurf->view->output = shsurf->output;
}
@@ -2429,8 +2431,7 @@
WESTON_ACTIVATE_FLAG_CONFIGURE);
}
- if (!weston_desktop_surface_get_maximized(shsurf->desktop_surface) &&
- !weston_desktop_surface_get_fullscreen(shsurf->desktop_surface)) {
+ if (!shsurf->state.fullscreen && !shsurf->state.maximized) {
switch (shell->win_animation_type) {
case ANIMATION_FADE:
weston_fade_run(shsurf->view, 0.0, 1.0, 300.0, NULL, NULL);
@@ -2455,10 +2456,20 @@
weston_desktop_surface_get_surface(desktop_surface);
struct weston_view *view = shsurf->view;
struct desktop_shell *shell = data;
+ bool was_fullscreen;
+ bool was_maximized;
if (surface->width == 0)
return;
+ was_fullscreen = shsurf->state.fullscreen;
+ was_maximized = shsurf->state.maximized;
+
+ shsurf->state.fullscreen =
+ weston_desktop_surface_get_fullscreen(desktop_surface);
+ shsurf->state.maximized =
+ weston_desktop_surface_get_maximized(desktop_surface);
+
if (!weston_surface_is_mapped(surface)) {
map(shell, shsurf, sx, sy);
surface->is_mapped = true;
@@ -2469,12 +2480,19 @@
if (sx == 0 && sy == 0 &&
shsurf->last_width == surface->width &&
- shsurf->last_height == surface->height)
+ shsurf->last_height == surface->height &&
+ was_fullscreen == shsurf->state.fullscreen &&
+ was_maximized == shsurf->state.maximized)
return;
- if (weston_desktop_surface_get_fullscreen(desktop_surface))
+ if (was_fullscreen)
+ unset_fullscreen(shsurf);
+ if (was_maximized)
+ unset_maximized(shsurf);
+
+ if (shsurf->state.fullscreen) {
shell_configure_fullscreen(shsurf);
- else if (weston_desktop_surface_get_maximized(desktop_surface)) {
+ } else if (shsurf->state.maximized) {
set_maximized_position(shell, shsurf);
surface->output = shsurf->output;
} else {
@@ -2531,8 +2549,6 @@
width = shsurf->output->width;
height = shsurf->output->height;
- } else {
- unset_fullscreen(shsurf);
}
weston_desktop_surface_set_fullscreen(desktop_surface, fullscreen);
weston_desktop_surface_set_size(desktop_surface, width, height);
@@ -2632,8 +2648,6 @@
width = area.width;
height = area.height;
- } else {
- unset_maximized(shsurf);
}
weston_desktop_surface_set_maximized(desktop_surface, maximized);
weston_desktop_surface_set_size(desktop_surface, width, height);