diff options
author | Marius Vlad <marius.vlad@collabora.com> | 2020-10-14 15:18:08 +0300 |
---|---|---|
committer | Marius Vlad <marius.vlad@collabora.com> | 2020-11-05 10:41:32 +0200 |
commit | 456fe3dd3b2813adb84d97eba51314a39a0657fe (patch) | |
tree | d363ba9ed9d470f9c908a03446f739990ee6764e | |
parent | 3f05a28017b2e04cff63c96225adf5a4fc322cc1 (diff) |
shell: Push the surface to the remote side
The receiver expects that the sender/transmitter will inform it when it
can create a surface and it can start the gstreamer pipeline.
The transmitter plug-in exposes a way to call that using 'push_surface'
callback. So, whenever we detect that the remote surface is to be
assigned to a waltham-type of output, we would need to call into this
'push_surface' callback. This acts as notification mechanism for the
remote side.
Bug-AGL: 3611
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
Change-Id: Ia5db0d8f2356708eaee3fbaabed2b3ba3ac97eb6
-rw-r--r-- | src/shell.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/shell.c b/src/shell.c index 4f70dfc..87d8ce9 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 <waltham-transmitter/transmitter_api.h> +#endif + static void create_black_surface_view(struct ivi_output *output); @@ -104,6 +108,61 @@ ivi_set_desktop_surface_fullscreen(struct ivi_surface *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. + */ + api->surface_push_to_remote(weston_surface, app_id, trans_remote, NULL); +} + +static void ivi_set_desktop_surface_remote(struct ivi_surface *surface) { struct ivi_compositor *ivi = surface->ivi; @@ -123,6 +182,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); } |