From 9e9c768ad6360ef5616f6aa87064975899802f9f Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Fri, 26 Nov 2021 00:07:09 +0200 Subject: shell: Refactor pending surfaces for existing pending ones This patch refactors a bit the way we add pending surface roles, such that it updates to an existing surface, rather than create a new one with the same app_id. Bug-AGL: SPEC-4133 Signed-off-by: Marius Vlad Change-Id: Ifd7477ea0f0840d6fd82bbc21216a7694d0efa8b --- src/shell.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 128 insertions(+), 18 deletions(-) diff --git a/src/shell.c b/src/shell.c index 6fcdfe8..0ecdb5e 100644 --- a/src/shell.c +++ b/src/shell.c @@ -236,18 +236,42 @@ ivi_set_desktop_surface_split(struct ivi_surface *surface) agl_shell_desktop_advertise_application_id(ivi, surface); } +static struct pending_popup * +ivi_ensure_popup(struct ivi_output *ioutput, int x, int y, int bx, int by, + int width, int height, const char *app_id) +{ + struct pending_popup *p_popup = zalloc(sizeof(*p_popup)); + size_t len_app_id = strlen(app_id); + + p_popup->app_id = zalloc(sizeof(char) * (len_app_id + 1)); + memcpy(p_popup->app_id, app_id, len_app_id); + p_popup->ioutput = ioutput; + p_popup->x = x; + p_popup->y = y; + + p_popup->bb.x = bx; + p_popup->bb.y = by; + p_popup->bb.width = width; + p_popup->bb.height = height; + + return p_popup; +} + static void -ivi_set_pending_desktop_surface_popup(struct ivi_output *ioutput, - int x, int y, int bx, int by, int width, int height, - const char *app_id) +ivi_update_popup(struct ivi_output *ioutput, int x, int y, int bx, int by, + int width, int height, const char *app_id, struct pending_popup *p_popup) { - struct ivi_compositor *ivi = ioutput->ivi; size_t len_app_id = strlen(app_id); - struct pending_popup *p_popup = zalloc(sizeof(*p_popup)); + wl_list_remove(&p_popup->link); + wl_list_init(&p_popup->link); + + memset(p_popup->app_id, 0, strlen(app_id) + 1); + free(p_popup->app_id); p_popup->app_id = zalloc(sizeof(char) * (len_app_id + 1)); memcpy(p_popup->app_id, app_id, len_app_id); + p_popup->ioutput = ioutput; p_popup->x = x; p_popup->y = y; @@ -256,6 +280,86 @@ ivi_set_pending_desktop_surface_popup(struct ivi_output *ioutput, p_popup->bb.y = by; p_popup->bb.width = width; p_popup->bb.height = height; +} + +static struct pending_fullscreen * +ivi_ensure_fullscreen(struct ivi_output *ioutput, const char *app_id) +{ + struct pending_fullscreen *p_fullscreen = zalloc(sizeof(*p_fullscreen)); + size_t len_app_id = strlen(app_id); + + p_fullscreen->app_id = zalloc(sizeof(char) * (len_app_id + 1)); + memcpy(p_fullscreen->app_id, app_id, len_app_id); + + p_fullscreen->ioutput = ioutput; + return p_fullscreen; +} + +static void +ivi_update_fullscreen(struct ivi_output *ioutput, const char *app_id, + struct pending_fullscreen *p_fullscreen) +{ + size_t len_app_id = strlen(app_id); + + wl_list_remove(&p_fullscreen->link); + wl_list_init(&p_fullscreen->link); + + memset(p_fullscreen->app_id, 0, strlen(app_id) + 1); + free(p_fullscreen->app_id); + + p_fullscreen->app_id = zalloc(sizeof(char) * (len_app_id + 1)); + memcpy(p_fullscreen->app_id, app_id, len_app_id); + + p_fullscreen->ioutput = ioutput; +} + +static struct pending_remote * +ivi_ensure_remote(struct ivi_output *ioutput, const char *app_id) +{ + struct pending_remote *p_remote = zalloc(sizeof(*p_remote)); + size_t len_app_id = strlen(app_id); + + p_remote->app_id = zalloc(sizeof(char) * (len_app_id + 1)); + memcpy(p_remote->app_id, app_id, len_app_id); + + p_remote->ioutput = ioutput; + return p_remote; +} + +static void +ivi_update_remote(struct ivi_output *ioutput, const char *app_id, + struct pending_remote *p_remote) +{ + size_t len_app_id = strlen(app_id); + + wl_list_remove(&p_remote->link); + wl_list_init(&p_remote->link); + + memset(p_remote->app_id, 0, strlen(app_id) + 1); + free(p_remote->app_id); + + p_remote->app_id = zalloc(sizeof(char) * (len_app_id + 1)); + memcpy(p_remote->app_id, app_id, len_app_id); + + p_remote->ioutput = ioutput; +} + +static void +ivi_set_pending_desktop_surface_popup(struct ivi_output *ioutput, int x, int y, int bx, + int by, int width, int height, const char *app_id) +{ + struct ivi_compositor *ivi = ioutput->ivi; + struct pending_popup *p_popup = NULL; + struct pending_popup *popup; + + wl_list_for_each(popup, &ivi->popup_pending_apps, link) + if (!strcmp(app_id, popup->app_id)) + p_popup = popup; + + if (!p_popup) + p_popup = ivi_ensure_popup(ioutput, x, y, bx, by, width, height, app_id); + else + ivi_update_popup(ioutput, x, y, bx, by, width, height, app_id, p_popup); wl_list_insert(&ivi->popup_pending_apps, &p_popup->link); } @@ -265,16 +369,19 @@ ivi_set_pending_desktop_surface_fullscreen(struct ivi_output *ioutput, const char *app_id) { struct ivi_compositor *ivi = ioutput->ivi; - size_t len_app_id = strlen(app_id); - - struct pending_fullscreen *fs = zalloc(sizeof(*fs)); + struct pending_fullscreen *p_fullscreen = NULL; + struct pending_fullscreen *fullscreen; - fs->app_id = zalloc(sizeof(char) * (len_app_id + 1)); - memcpy(fs->app_id, app_id, len_app_id); + wl_list_for_each(fullscreen, &ivi->fullscreen_pending_apps, link) + if (!strcmp(app_id, fullscreen->app_id)) + p_fullscreen = fullscreen; - fs->ioutput = ioutput; + if (!p_fullscreen) + p_fullscreen = ivi_ensure_fullscreen(ioutput, app_id); + else + ivi_update_fullscreen(ioutput, app_id, p_fullscreen); - wl_list_insert(&ivi->fullscreen_pending_apps, &fs->link); + wl_list_insert(&ivi->fullscreen_pending_apps, &p_fullscreen->link); } static void @@ -312,14 +419,17 @@ ivi_set_pending_desktop_surface_remote(struct ivi_output *ioutput, const char *app_id) { struct ivi_compositor *ivi = ioutput->ivi; - size_t len_app_id = strlen(app_id); + struct pending_remote *remote; + struct pending_remote *p_remote = NULL; - struct pending_remote *remote = zalloc(sizeof(*remote)); + wl_list_for_each(remote, &ivi->remote_pending_apps, link) + if (!strcmp(app_id, remote->app_id)) + p_remote = remote; - remote->app_id = zalloc(sizeof(char) * (len_app_id + 1)); - memcpy(remote->app_id, app_id, len_app_id); - - remote->ioutput = ioutput; + if (!p_remote) + p_remote = ivi_ensure_remote(ioutput, app_id); + else + ivi_update_remote(ioutput, app_id, p_remote); wl_list_insert(&ivi->remote_pending_apps, &remote->link); } -- cgit 1.2.3-korg