protocol: Advertise the applications to regular clients 89/24189/2
authorMarius Vlad <marius.vlad@collabora.com>
Mon, 17 Feb 2020 14:48:27 +0000 (16:48 +0200)
committerMarius Vlad <marius.vlad@collabora.com>
Fri, 6 Mar 2020 16:16:08 +0000 (18:16 +0200)
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 <marius.vlad@collabora.com>
Change-Id: Ia196e7d3b34694d7cb169228429a0e940eae8b3b

protocol/agl-shell-desktop.xml
src/shell.c

index 076b4f2..1347063 100644 (file)
       no mechanism to place to restrict or limit that.
     </description>
 
+    <event name="application">
+      <description summary="advertise application id">
+        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).
+      </description>
+      <arg name="app_id" type="string"/>
+    </event>
+
     <request name="activate_app">
       <description summary="make client current window">
         Ask the compositor to make a toplevel to become the current/focused
index 9100ad7..cc7b33b 100644 (file)
@@ -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