X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fshell.c;h=b5f13b46f00e914bdba595beddbdbacdc7ff1894;hb=refs%2Fheads%2Fsandbox%2Fmvlad%2Fadd-waltham-support;hp=ac41e1fa28213aa10cd5605ca8484d27e175e8da;hpb=168261297ce8d6e17ca69eb1de4d0e98de52eedc;p=src%2Fagl-compositor.git diff --git a/src/shell.c b/src/shell.c index ac41e1f..b5f13b4 100644 --- a/src/shell.c +++ b/src/shell.c @@ -42,18 +42,18 @@ #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); -void -ivi_set_desktop_surface(struct ivi_surface *surface) +static void +agl_shell_desktop_advertise_application_id(struct ivi_compositor *ivi, + struct ivi_surface *surface) { struct desktop_client *dclient; - struct ivi_compositor *ivi = surface->ivi; - assert(surface->role == IVI_SURFACE_ROLE_NONE); - - surface->role = IVI_SURFACE_ROLE_DESKTOP; - wl_list_insert(&surface->ivi->surfaces, &surface->link); /* advertise to all desktop clients the new surface */ wl_list_for_each(dclient, &ivi->desktop_clients, link) { @@ -63,6 +63,18 @@ ivi_set_desktop_surface(struct ivi_surface *surface) } } +void +ivi_set_desktop_surface(struct ivi_surface *surface) +{ + struct ivi_compositor *ivi = surface->ivi; + assert(surface->role == IVI_SURFACE_ROLE_NONE); + + surface->role = IVI_SURFACE_ROLE_DESKTOP; + wl_list_insert(&surface->ivi->surfaces, &surface->link); + + agl_shell_desktop_advertise_application_id(ivi, surface); +} + static void ivi_set_desktop_surface_popup(struct ivi_surface *surface) { @@ -71,6 +83,8 @@ ivi_set_desktop_surface_popup(struct ivi_surface *surface) surface->role = IVI_SURFACE_ROLE_POPUP; wl_list_insert(&ivi->surfaces, &surface->link); + + agl_shell_desktop_advertise_application_id(ivi, surface); } static void @@ -81,6 +95,43 @@ ivi_set_desktop_surface_fullscreen(struct ivi_surface *surface) surface->role = IVI_SURFACE_ROLE_FULLSCREEN; wl_list_insert(&ivi->surfaces, &surface->link); + + 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 @@ -103,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); } @@ -119,11 +173,14 @@ ivi_set_desktop_surface_split(struct ivi_surface *surface) surface->role = IVI_SURFACE_ROLE_SPLIT_H; wl_list_insert(&ivi->surfaces, &surface->link); + + agl_shell_desktop_advertise_application_id(ivi, surface); } static void ivi_set_pending_desktop_surface_popup(struct ivi_output *ioutput, - int x, int y, const char *app_id) + int x, int y, int bx, int by, int width, int height, + const char *app_id) { struct ivi_compositor *ivi = ioutput->ivi; size_t len_app_id = strlen(app_id); @@ -136,6 +193,11 @@ ivi_set_pending_desktop_surface_popup(struct ivi_output *ioutput, p_popup->x = x; p_popup->y = y; + p_popup->bb.x = bx; + p_popup->bb.y = by; + p_popup->bb.width = width; + p_popup->bb.height = height; + wl_list_insert(&ivi->popup_pending_apps, &p_popup->link); } @@ -244,7 +306,7 @@ ivi_check_pending_desktop_surface_popup(struct ivi_surface *surface) const char *_app_id = weston_desktop_surface_get_app_id(surface->dsurface); - if (wl_list_empty(&ivi->popup_pending_apps)) + if (wl_list_empty(&ivi->popup_pending_apps) || !_app_id) return false; wl_list_for_each_safe(p_popup, next_p_popup, @@ -253,6 +315,12 @@ ivi_check_pending_desktop_surface_popup(struct ivi_surface *surface) surface->popup.output = p_popup->ioutput; surface->popup.x = p_popup->x; surface->popup.y = p_popup->y; + + surface->popup.bb.x = p_popup->bb.x; + surface->popup.bb.y = p_popup->bb.y; + surface->popup.bb.width = p_popup->bb.width; + surface->popup.bb.height = p_popup->bb.height; + ivi_remove_pending_desktop_surface_popup(p_popup); return true; } @@ -269,7 +337,7 @@ ivi_check_pending_desktop_surface_split(struct ivi_surface *surface) const char *_app_id = weston_desktop_surface_get_app_id(surface->dsurface); - if (wl_list_empty(&ivi->split_pending_apps)) + if (wl_list_empty(&ivi->split_pending_apps) || !_app_id) return false; wl_list_for_each_safe(split_surf, next_split_surf, @@ -293,7 +361,7 @@ ivi_check_pending_desktop_surface_fullscreen(struct ivi_surface *surface) const char *_app_id = weston_desktop_surface_get_app_id(surface->dsurface); - if (wl_list_empty(&ivi->fullscreen_pending_apps)) + if (wl_list_empty(&ivi->fullscreen_pending_apps) || !_app_id) return false; wl_list_for_each_safe(fs_surf, next_fs_surf, @@ -316,7 +384,7 @@ ivi_check_pending_desktop_surface_remote(struct ivi_surface *surface) const char *_app_id = weston_desktop_surface_get_app_id(surface->dsurface); - if (wl_list_empty(&ivi->remote_pending_apps)) + if (wl_list_empty(&ivi->remote_pending_apps) || !_app_id) return false; wl_list_for_each_safe(remote_surf, next_remote_surf, @@ -340,24 +408,28 @@ ivi_check_pending_desktop_surface(struct ivi_surface *surface) ret = ivi_check_pending_desktop_surface_popup(surface); if (ret) { ivi_set_desktop_surface_popup(surface); + ivi_layout_popup_committed(surface); return; } ret = ivi_check_pending_desktop_surface_split(surface); if (ret) { ivi_set_desktop_surface_split(surface); + ivi_layout_split_committed(surface); return; } ret = ivi_check_pending_desktop_surface_fullscreen(surface); if (ret) { ivi_set_desktop_surface_fullscreen(surface); + ivi_layout_fullscreen_committed(surface); return; } ret = ivi_check_pending_desktop_surface_remote(surface); if (ret) { ivi_set_desktop_surface_remote(surface); + ivi_layout_desktop_committed(surface); return; } @@ -539,6 +611,9 @@ create_black_surface_view(struct ivi_output *output) struct weston_compositor *wc= ivi->compositor; struct weston_output *woutput = output->output; + if (!woutput) + return; + surface = weston_surface_create(wc); view = weston_view_create(surface); @@ -586,9 +661,9 @@ insert_black_surface(struct ivi_output *output) { struct weston_view *view; - if (!output && + if ((!output && !output->fullscreen_view.fs && - !output->fullscreen_view.fs->view) { + !output->fullscreen_view.fs->view) || !output->output) { weston_log("Output %s doesn't have a surface installed!\n", output->name); return; } @@ -763,8 +838,7 @@ shell_set_panel(struct wl_client *client, weston_desktop_surface_set_size(dsurface, width, height); } - -static void +void shell_advertise_app_state(struct ivi_compositor *ivi, const char *app_id, const char *data, uint32_t app_state) { @@ -844,7 +918,9 @@ static void shell_desktop_set_app_property(struct wl_client *client, struct wl_resource *shell_res, const char *app_id, uint32_t role, - int x, int y, struct wl_resource *output_res) + int x, int y, int bx, int by, + int width, int height, + struct wl_resource *output_res) { struct weston_head *head = weston_head_from_resource(output_res); struct weston_output *woutput = weston_head_get_output(head); @@ -852,7 +928,8 @@ shell_desktop_set_app_property(struct wl_client *client, switch (role) { case AGL_SHELL_DESKTOP_APP_ROLE_POPUP: - ivi_set_pending_desktop_surface_popup(output, x, y, app_id); + ivi_set_pending_desktop_surface_popup(output, x, y, bx, by, + width, height, app_id); break; case AGL_SHELL_DESKTOP_APP_ROLE_FULLSCREEN: ivi_set_pending_desktop_surface_fullscreen(output, app_id); @@ -920,6 +997,17 @@ bind_agl_shell(struct wl_client *client, { struct ivi_compositor *ivi = data; struct wl_resource *resource; + struct ivi_policy *policy; + void *interface; + + policy = ivi->policy; + interface = (void *) &agl_shell_interface; + if (policy && policy->api.shell_bind_interface && + !policy->api.shell_bind_interface(client, interface)) { + wl_client_post_implementation_error(client, + "client not authorized to use agl_shell"); + return; + } resource = wl_resource_create(client, &agl_shell_interface, 1, id); @@ -962,8 +1050,20 @@ bind_agl_shell_desktop(struct wl_client *client, { struct ivi_compositor *ivi = data; struct wl_resource *resource; - struct desktop_client *dclient = zalloc(sizeof(*dclient)); + struct ivi_policy *policy; + struct desktop_client *dclient; + void *interface; + + policy = ivi->policy; + interface = (void *) &agl_shell_desktop_interface; + if (policy && policy->api.shell_bind_interface && + !policy->api.shell_bind_interface(client, interface)) { + wl_client_post_implementation_error(client, + "client not authorized to use agl_shell_desktop"); + return; + } + dclient = zalloc(sizeof(*dclient)); if (!dclient) { wl_client_post_no_memory(client); return;