diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2021-11-04 17:32:28 +0200 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2021-11-12 18:49:34 +0200 |
commit | 10d2c1d637e9ef8759e1756ef626ab24aed7c668 (patch) | |
tree | b2a33ebe3d89ff3f581b68d801e7981db2f2136f | |
parent | bd4c81d5f90d466df8019d19dca4856aa7a5fa80 (diff) |
shell: Fix passing maximized state from the start
We've added an optimization where we where sending to regular (desktop)
surfaces from the beginning the maximized state, together with the size
whenever the client signaled that it is ready to present.
That optimization failed to take into account other potential roles,
more importanly, the pop-op role which should not be getting any window
state, and implicitly shouldn't be getting any surface dimensions,
leaving it to the client to decide that. Patch checks all pending lists
to make sure we're not skipping any on purpose.
Bug-AGL: SPEC-4119
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: I4f8c62af545c5955e7fa41c3fd73f52d6c73b600
-rw-r--r-- | src/desktop.c | 14 | ||||
-rw-r--r-- | src/ivi-compositor.h | 4 | ||||
-rw-r--r-- | src/shell.c | 47 |
3 files changed, 60 insertions, 5 deletions
diff --git a/src/desktop.c b/src/desktop.c index 9c1dfae..ac68b78 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -169,11 +169,15 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata) if (output && ivi->shell_client.ready) { struct ivi_output *ivi_output = to_ivi_output(output); - weston_log("Setting surface to initial size of surface to %dx%d\n", - ivi_output->area.width, ivi_output->area.height); - weston_desktop_surface_set_maximized(dsurface, true); - weston_desktop_surface_set_size(dsurface, - ivi_output->area.width, ivi_output->area.height); + /* verify if by any chance this surfaces hasn't been assigned a + * different role before sending the maximized state */ + if (!ivi_check_pending_surface(surface)) { + weston_log("Setting surface to initial size of surface to %dx%d\n", + ivi_output->area.width, ivi_output->area.height); + weston_desktop_surface_set_maximized(dsurface, true); + weston_desktop_surface_set_size(dsurface, + ivi_output->area.width, ivi_output->area.height); + } } /* * We delay creating "normal" desktop surfaces until later, to diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index b2342eb..cdea455 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -419,4 +419,8 @@ agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi, struct ivi_surface *surface); void ivi_destroy_waltham_destroy(struct ivi_surface *surface); + +bool +ivi_check_pending_surface(struct ivi_surface *surface); + #endif diff --git a/src/shell.c b/src/shell.c index 9e7693e..301110a 100644 --- a/src/shell.c +++ b/src/shell.c @@ -458,6 +458,53 @@ ivi_check_pending_desktop_surface_remote(struct ivi_surface *surface) return false; } +bool +ivi_check_pending_surface(struct ivi_surface *surface) +{ + struct ivi_compositor *ivi = surface->ivi; + struct wl_list *role_pending_list; + struct pending_popup *p_popup; + struct pending_split *p_split; + struct pending_fullscreen *p_fullscreen; + struct pending_remote *p_remote; + const char *app_id = + weston_desktop_surface_get_app_id(surface->dsurface); + + if (!app_id) + return false; + + role_pending_list = &ivi->popup_pending_apps; + wl_list_for_each(p_popup, role_pending_list, link) { + if (!strcmp(app_id, p_popup->app_id)) { + return true; + } + } + + role_pending_list = &ivi->split_pending_apps; + wl_list_for_each(p_split, role_pending_list, link) { + if (!strcmp(app_id, p_split->app_id)) { + return true; + } + } + + role_pending_list = &ivi->fullscreen_pending_apps; + wl_list_for_each(p_fullscreen, role_pending_list, link) { + if (!strcmp(app_id, p_fullscreen->app_id)) { + return true; + } + } + + role_pending_list = &ivi->remote_pending_apps; + wl_list_for_each(p_remote, role_pending_list, link) { + if (!strcmp(app_id, p_remote->app_id)) { + return true; + } + } + + /* else, we are a regular desktop surface */ + return false; +} + void ivi_check_pending_desktop_surface(struct ivi_surface *surface) |