X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fshell.c;h=5a8cc42215f7d257c1ed00f7971ef2288387b8a0;hb=bdd8dd718496dc8e4330209c46c196442bcf7d3e;hp=4f70dfc8d3e258e46ed58a51faecde1783bf68ce;hpb=dce67758ac776ccf71faf31f8236fa3b10c31a2c;p=src%2Fagl-compositor.git diff --git a/src/shell.c b/src/shell.c index 4f70dfc..5a8cc42 100644 --- a/src/shell.c +++ b/src/shell.c @@ -42,6 +42,10 @@ #include "agl-shell-server-protocol.h" #include "agl-shell-desktop-server-protocol.h" +#ifdef HAVE_WALTHAM +#include +#endif + static void create_black_surface_view(struct ivi_output *output); @@ -50,6 +54,7 @@ agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi, struct ivi_surface *surface) { struct desktop_client *dclient; + static bool display_adv = false; if (surface->advertised_on_launch) return; @@ -59,7 +64,10 @@ agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi, const char *app_id = weston_desktop_surface_get_app_id(surface->dsurface); if (app_id == NULL) { - weston_log("WARNING app_is is null, unable to advertise\n"); + if (!display_adv) { + weston_log("WARNING app_is is null, unable to advertise\n"); + display_adv = true; + } return; } agl_shell_desktop_send_application(dclient->resource, app_id); @@ -103,6 +111,88 @@ ivi_set_desktop_surface_fullscreen(struct ivi_surface *surface) agl_shell_desktop_advertise_application_id(ivi, surface); } +#ifdef HAVE_WALTHAM +void +ivi_destroy_waltham_destroy(struct ivi_surface *surface) +{ + struct ivi_compositor *ivi = surface->ivi; + const struct weston_transmitter_api *api = + ivi->waltham_transmitter_api; + + if (!api) + return; + + if (surface->waltham_surface.transmitter_surface) + api->surface_destroy(surface->waltham_surface.transmitter_surface); +} + +static void +ivi_output_notify_waltham_plugin(struct ivi_surface *surface) +{ + struct ivi_compositor *ivi = surface->ivi; + const struct weston_transmitter_api *api = ivi->waltham_transmitter_api; + struct weston_transmitter *transmitter; + struct weston_transmitter_remote *trans_remote; + struct weston_surface *weston_surface; + struct weston_output *woutput = surface->remote.output->output; + const char *app_id; + + if (!api) + return; + + transmitter = api->transmitter_get(ivi->compositor); + if (!transmitter) + return; + + trans_remote = api->get_transmitter_remote(woutput->name, transmitter); + if (!trans_remote) { + weston_log("Could not find a valie weston_transmitter_remote " + "that matches the output %s\n", woutput->name); + return; + } + + app_id = weston_desktop_surface_get_app_id(surface->dsurface); + weston_surface = + weston_desktop_surface_get_surface(surface->dsurface); + + weston_log("Forwarding app_id %s to remote %s\n", app_id, woutput->name); + + /* this will have the effect of informing the remote side to create a + * surface with the name app_id. W/ xdg-shell the following happens: + * + * compositor (server): + * surface_push_to_remote(): + * waltham-transmitter plug-in + * -> wthp_ivi_app_id_surface_create() + * + * client -- on the receiver side: + * -> wthp_ivi_app_id_surface_create() + * -> wth_receiver_weston_main() + * -> wl_compositor_create_surface() + * -> xdg_wm_base_get_xdg_surface + * -> xdg_toplevel_set_app_id() + * -> gst_init() + * -> gst_parse_launch() + * + * wth_receiver_weston_main() will be invoked from the handler of + * wthp_ivi_app_id_surface_create() and is responsible for setting-up + * the gstreamer pipeline as well. + */ + surface->waltham_surface.transmitter_surface = + api->surface_push_to_remote(weston_surface, app_id, trans_remote, NULL); +} + +#else +void +ivi_destroy_waltham_destroy(struct ivi_surface *surface) +{ +} +static void +ivi_output_notify_waltham_plugin(struct ivi_surface *surface) +{ +} +#endif + static void ivi_set_desktop_surface_remote(struct ivi_surface *surface) { @@ -123,6 +213,9 @@ ivi_set_desktop_surface_remote(struct ivi_surface *surface) if (view->is_mapped || view->surface->is_mapped) remove_black_surface(output); + if (output->type == OUTPUT_WALTHAM) + ivi_output_notify_waltham_plugin(surface); + wl_list_insert(&ivi->surfaces, &surface->link); } @@ -669,7 +762,9 @@ shell_ready(struct wl_client *client, struct wl_resource *shell_res) wl_list_for_each_safe(surface, tmp, &ivi->pending_surfaces, link) { wl_list_remove(&surface->link); + wl_list_init(&surface->link); ivi_check_pending_desktop_surface(surface); + surface->checked_pending = true; } } @@ -709,6 +804,7 @@ shell_set_background(struct wl_client *client, return; } + surface->checked_pending = true; surface->role = IVI_SURFACE_ROLE_BACKGROUND; surface->bg.output = output; wl_list_remove(&surface->link); @@ -781,6 +877,7 @@ shell_set_panel(struct wl_client *client, return; } + surface->checked_pending = true; surface->role = IVI_SURFACE_ROLE_PANEL; surface->panel.output = output; surface->panel.edge = edge;