From e0110aa587acfa5b011162ea86873675c2fc96d9 Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Thu, 8 Oct 2020 17:46:24 +0300 Subject: [PATCH 1/1] 'Push' or foward depending on the remote output the app_id to the receiver side. Signed-off-by: Marius Vlad Change-Id: I8b40057b56bc234e907cf321cc1c5094674f5d93 --- src/desktop.c | 5 ++++- src/ivi-compositor.h | 7 +++++++ src/layout.c | 4 +++- src/main.c | 7 +++++-- src/shell.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) diff --git a/src/desktop.c b/src/desktop.c index 58d2887..236724b 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -96,8 +96,11 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata) app_id = weston_desktop_surface_get_app_id(dsurface); - if ((active_output = ivi_layout_find_with_app_id(app_id, ivi))) + if ((active_output = ivi_layout_find_with_app_id(app_id, ivi))) { + weston_log("Found active_output %s for app_id %s\n", + active_output->output->name, app_id); ivi_set_pending_desktop_surface_remote(active_output, app_id); + } /* reset any caps to make sure we apply the new caps */ ivi_seat_reset_caps_sent(ivi); diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index ea80b1a..5b08acd 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -107,6 +107,12 @@ struct ivi_compositor { struct ivi_surface; +enum ivi_output_type { + OUTPUT_LOCAL, + OUTPUT_REMOTING, + OUTPUT_WALTHAM, +}; + struct ivi_output { struct wl_list link; /* ivi_compositor.outputs */ struct ivi_compositor *ivi; @@ -145,6 +151,7 @@ struct ivi_output { struct weston_head *add[8]; char *app_id; + enum ivi_output_type type; }; enum ivi_surface_role { diff --git a/src/layout.c b/src/layout.c index 0345807..c58b39b 100644 --- a/src/layout.c +++ b/src/layout.c @@ -241,8 +241,10 @@ ivi_layout_find_with_app_id(const char *app_id, struct ivi_compositor *ivi) { struct ivi_output *out; - if (!app_id) + if (!app_id) { + weston_log("ivi_layout_find_with_app_id() failed w/ no app_id\n"); return NULL; + } wl_list_for_each(out, &ivi->outputs, link) { if (!out->app_id) diff --git a/src/main.c b/src/main.c index d3d6306..082cf1f 100644 --- a/src/main.c +++ b/src/main.c @@ -652,7 +652,7 @@ ivi_enable_waltham_outputs(struct ivi_compositor *ivi, struct weston_config *con ivi_output = zalloc(sizeof(*ivi_output)); ivi_output->ivi = ivi; - ivi_output->name = _name; + ivi_output->name = transmitter_output_name; ivi_output->config = transmitter_section; /* waltham creates the output */ ivi_output->output = @@ -664,10 +664,13 @@ ivi_enable_waltham_outputs(struct ivi_compositor *ivi, struct weston_config *con weston_output_add_destroy_listener(ivi_output->output, &ivi_output->output_destroy); + ivi_output->type = OUTPUT_WALTHAM; + wl_list_insert(&ivi->outputs, &ivi_output->link); ivi_output_configure_app_id(ivi_output); - free(transmitter_output_name); + /* FIXME: handle it correctly? */ + /* free(transmitter_output_name); */ } } #else diff --git a/src/shell.c b/src/shell.c index 21f321d..b5f13b4 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); @@ -95,6 +99,41 @@ ivi_set_desktop_surface_fullscreen(struct ivi_surface *surface) agl_shell_desktop_advertise_application_id(ivi, 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); + api->surface_push_to_remote(weston_surface, app_id, trans_remote, NULL); +} + static void ivi_set_desktop_surface_remote(struct ivi_surface *surface) { @@ -115,6 +154,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); } -- 2.16.6