X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fdesktop.c;h=c938f4a3c9efcba90b9d373e848e20b614c1ca71;hb=2551d6f12194a07955dca2a21f3af33bab39c11e;hp=a8e61716243fdf6c721d666e7bc7aceaf388d653;hpb=d5d2af73456fbaac69084bbd04838fcc1aed71a9;p=src%2Fagl-compositor.git diff --git a/src/desktop.c b/src/desktop.c index a8e6171..c938f4a 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -30,6 +30,7 @@ #include "shared/helpers.h" #include #include +#include #include "agl-shell-desktop-server-protocol.h" @@ -243,8 +244,9 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata) } -static bool -desktop_surface_check_last_surfaces(struct ivi_output *ivi_output, enum ivi_surface_role role) +bool +ivi_surface_count_one(struct ivi_output *ivi_output, + enum ivi_surface_role role) { int count = 0; struct ivi_surface *surf; @@ -331,8 +333,8 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) /* check if there's a last 'remote' surface and insert a black * surface view if there's no background set for that output */ - if (desktop_surface_check_last_surfaces(output, IVI_SURFACE_ROLE_REMOTE) || - desktop_surface_check_last_surfaces(output, IVI_SURFACE_ROLE_DESKTOP)) + if (ivi_surface_count_one(output, IVI_SURFACE_ROLE_REMOTE) || + ivi_surface_count_one(output, IVI_SURFACE_ROLE_DESKTOP)) if (!output->background) insert_black_curtain(output); @@ -515,7 +517,12 @@ static void desktop_set_xwayland_position(struct weston_desktop_surface *dsurface, int32_t x, int32_t y, void *userdata) { - /* not supported */ + struct ivi_surface *ivisurf = + weston_desktop_surface_get_user_data(dsurface); + + ivisurf->xwayland.x = x; + ivisurf->xwayland.y = y; + ivisurf->xwayland.is_set = true; } static const struct weston_desktop_api desktop_api = { @@ -546,9 +553,39 @@ ivi_shell_destroy(struct wl_listener *listener, void *data) ivi_layout_destroy_saved_outputs(ivi); weston_desktop_destroy(ivi->desktop); + wl_list_remove(&ivi->transform_listener.link); wl_list_remove(&listener->link); } +static void +transform_handler(struct wl_listener *listener, void *data) +{ + struct weston_surface *surface = data; + struct ivi_surface *ivisurf = get_ivi_shell_surface(surface); + const struct weston_xwayland_surface_api *api; + int x, y; + + if (!ivisurf) + return; + + api = ivisurf->ivi->xwayland_surface_api; + if (!api) { + api = weston_xwayland_surface_get_api(ivisurf->ivi->compositor); + ivisurf->ivi->xwayland_surface_api = api; + } + + if (!api || !api->is_xwayland_surface(surface)) + return; + + if (!weston_view_is_mapped(ivisurf->view)) + return; + + x = ivisurf->view->geometry.x; + y = ivisurf->view->geometry.y; + + api->send_position(surface, x, y); +} + int ivi_desktop_init(struct ivi_compositor *ivi) { @@ -563,5 +600,10 @@ ivi_desktop_init(struct ivi_compositor *ivi) return -1; } + ivi->transform_listener.notify = transform_handler; + wl_signal_add(&ivi->compositor->transform_signal, + &ivi->transform_listener); + + return 0; }