+
+ /* 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
+ivi_set_desktop_surface_popup(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+ assert(surface->role == IVI_SURFACE_ROLE_NONE);
+
+ surface->role = IVI_SURFACE_ROLE_POPUP;
+ wl_list_insert(&ivi->surfaces, &surface->link);
+}
+
+static void
+ivi_set_pending_desktop_surface_popup(struct ivi_output *ioutput,
+ int x, int y, const char *app_id)
+{
+ struct ivi_compositor *ivi = ioutput->ivi;
+ size_t len_app_id = strlen(app_id);
+
+ struct pending_popup *p_popup = zalloc(sizeof(*p_popup));
+
+ 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;
+
+ wl_list_insert(&ivi->popup_pending_apps, &p_popup->link);
+}
+
+static void
+ivi_remove_pending_desktop_surface_popup(struct pending_popup *p_popup)
+{
+ free(p_popup->app_id);
+ wl_list_remove(&p_popup->link);
+ free(p_popup);
+}
+
+bool
+ivi_check_pending_desktop_surface_popup(struct ivi_surface *surface)
+{
+ struct ivi_compositor *ivi = surface->ivi;
+ struct pending_popup *p_popup, *next_p_popup;
+ const char *_app_id =
+ weston_desktop_surface_get_app_id(surface->dsurface);
+
+ wl_list_for_each_safe(p_popup, next_p_popup,
+ &ivi->popup_pending_apps, link) {
+ if (!strcmp(_app_id, p_popup->app_id)) {
+ surface->popup.output = p_popup->ioutput;
+ surface->popup.x = p_popup->x;
+ surface->popup.y = p_popup->y;
+
+ ivi_remove_pending_desktop_surface_popup(p_popup);
+ return true;
+ }
+ }
+
+ return false;