summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/desktop.c23
-rw-r--r--src/ivi-compositor.h7
-rw-r--r--src/main.c1
-rw-r--r--src/shell.c6
4 files changed, 35 insertions, 2 deletions
diff --git a/src/desktop.c b/src/desktop.c
index 58d2887..87ba7e1 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -43,6 +43,16 @@ get_default_output(struct weston_compositor *compositor)
#endif
static void
+desktop_advertise_app(struct wl_listener *listener, void *data)
+{
+ struct ivi_surface *surface;
+
+ surface = wl_container_of(listener, surface, listener_advertise_app);
+
+ agl_shell_desktop_advertise_application_id(surface->ivi, surface);
+}
+
+static void
desktop_ping_timeout(struct weston_desktop_client *dclient, void *userdata)
{
/* not supported */
@@ -84,6 +94,13 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata)
surface->dsurface = dsurface;
surface->role = IVI_SURFACE_ROLE_NONE;
surface->activated_by_default = false;
+ surface->advertised_on_launch = false;
+
+ wl_signal_init(&surface->signal_advertise_app);
+
+ surface->listener_advertise_app.notify = desktop_advertise_app;
+ wl_signal_add(&surface->signal_advertise_app,
+ &surface->listener_advertise_app);
weston_desktop_surface_set_user_data(dsurface, surface);
@@ -141,6 +158,9 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata)
struct ivi_output *output = ivi_layout_get_output_from_surface(surface);
+ wl_list_remove(&surface->listener_advertise_app.link);
+ surface->listener_advertise_app.notify = NULL;
+
/* special corner-case, pending_surfaces which are never activated or
* being assigned an output might land here so just remove the surface;
*
@@ -237,6 +257,9 @@ desktop_committed(struct weston_desktop_surface *dsurface,
!policy->api.surface_commited(surface, surface->ivi))
return;
+ if (!surface->advertised_on_launch)
+ wl_signal_emit(&surface->signal_advertise_app, surface);
+
weston_compositor_schedule_repaint(surface->ivi->compositor);
switch (surface->role) {
diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h
index 4708b5d..0c9d604 100644
--- a/src/ivi-compositor.h
+++ b/src/ivi-compositor.h
@@ -243,6 +243,7 @@ struct ivi_surface {
int32_t width, height;
} pending;
bool activated_by_default;
+ bool advertised_on_launch;
enum ivi_surface_role role;
union {
@@ -254,6 +255,9 @@ struct ivi_surface {
struct ivi_split_surface split;
struct ivi_remote_surface remote;
};
+
+ struct wl_listener listener_advertise_app;
+ struct wl_signal signal_advertise_app;
};
struct ivi_shell_client {
@@ -389,4 +393,7 @@ ivi_seat_init(struct ivi_compositor *ivi);
void
ivi_seat_reset_caps_sent(struct ivi_compositor *ivi);
+void
+agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi,
+ struct ivi_surface *surface);
#endif
diff --git a/src/main.c b/src/main.c
index 2cefcd6..e85d788 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1392,7 +1392,6 @@ int main(int argc, char *argv[])
wl_list_init(&ivi.remote_pending_apps);
wl_list_init(&ivi.desktop_clients);
-
/* Prevent any clients we spawn getting our stdin */
os_fd_set_cloexec(STDIN_FILENO);
diff --git a/src/shell.c b/src/shell.c
index 94fdb66..e6fb332 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -45,12 +45,15 @@
static void
create_black_surface_view(struct ivi_output *output);
-static void
+void
agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi,
struct ivi_surface *surface)
{
struct desktop_client *dclient;
+ if (surface->advertised_on_launch)
+ return;
+
/* advertise to all desktop clients the new surface */
wl_list_for_each(dclient, &ivi->desktop_clients, link) {
const char *app_id =
@@ -60,6 +63,7 @@ agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi,
return;
}
agl_shell_desktop_send_application(dclient->resource, app_id);
+ surface->advertised_on_launch = true;
}
}