From: Marius Vlad Date: Mon, 17 Feb 2020 14:48:27 +0000 (+0200) Subject: protocol: Advertise the applications to regular clients X-Git-Tag: 9.99.1~75 X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=commitdiff_plain;h=786f91bd280b83049e5f60b3e8e88f81ab80e94c;p=src%2Fagl-compositor.git protocol: Advertise the applications to regular clients The application ids will be advertised when binding the protocol interface but also when the regular clients will create their surface. Client are responsible for filtering their own name. Bug-AGL: SPEC-3252 Signed-off-by: Marius Vlad Change-Id: Ia196e7d3b34694d7cb169228429a0e940eae8b3b --- diff --git a/protocol/agl-shell-desktop.xml b/protocol/agl-shell-desktop.xml index 076b4f2..1347063 100644 --- a/protocol/agl-shell-desktop.xml +++ b/protocol/agl-shell-desktop.xml @@ -32,6 +32,18 @@ no mechanism to place to restrict or limit that. + + + The compositor may choose to advertise one or more application ids which + can be used to activate/switch to. + + When this global is bound, the compositor will send all application ids + available for activation, but may send additional application id at any + time (when they've been mapped in the compositor). + + + + Ask the compositor to make a toplevel to become the current/focused diff --git a/src/shell.c b/src/shell.c index 9100ad7..cc7b33b 100644 --- a/src/shell.c +++ b/src/shell.c @@ -50,10 +50,19 @@ insert_black_surface(struct ivi_output *output); void ivi_set_desktop_surface(struct ivi_surface *surface) { + struct desktop_client *dclient; + struct ivi_compositor *ivi = surface->ivi; assert(surface->role == IVI_SURFACE_ROLE_NONE); surface->role = IVI_SURFACE_ROLE_DESKTOP; wl_list_insert(&surface->ivi->surfaces, &surface->link); + + /* advertise to all desktop clients the new surface */ + wl_list_for_each(dclient, &ivi->desktop_clients, link) { + const char *app_id = + weston_desktop_surface_get_app_id(surface->dsurface); + agl_shell_desktop_send_application(dclient->resource, app_id); + } } void @@ -90,6 +99,18 @@ ivi_shell_init(struct ivi_compositor *ivi) return 0; } +static void +ivi_shell_advertise_xdg_surfaces(struct ivi_compositor *ivi, struct wl_resource *resource) +{ + struct ivi_surface *surface; + + wl_list_for_each(surface, &ivi->surfaces, link) { + const char *app_id = + weston_desktop_surface_get_app_id(surface->dsurface); + agl_shell_desktop_send_application(resource, app_id); + } +} + static void client_exec(const char *command, int fd) { @@ -565,6 +586,9 @@ bind_agl_shell_desktop(struct wl_client *client, dclient->resource = resource; wl_list_insert(&ivi->desktop_clients, &dclient->link); + + /* advertise xdg surfaces */ + ivi_shell_advertise_xdg_surfaces(ivi, resource); } int