X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fdesktop.c;h=8554b069602f2dd7f37b31cf238fa8e0b0e854d8;hb=6d2720303d8441525ba2e37c9d87daef568f8cdc;hp=eb0dc8a2395be5ec186636c036a171a71c4b885c;hpb=28ec0cff16d62260fb1a5900f57353f48446e199;p=src%2Fagl-compositor.git diff --git a/src/desktop.c b/src/desktop.c index eb0dc8a..8554b06 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -29,7 +29,10 @@ #include "shared/helpers.h" #include -#include +#include +#ifdef BUILD_XWAYLAND +#include +#endif #include "agl-shell-desktop-server-protocol.h" @@ -211,8 +214,10 @@ 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))) { ivi_set_pending_desktop_surface_remote(active_output, app_id); + shell_send_app_on_output(ivi, app_id, active_output->output->name); + } /* reset any caps to make sure we apply the new caps */ ivi_seat_reset_caps_sent(ivi); @@ -241,8 +246,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; @@ -306,6 +312,7 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) output->area = output->area_saved; } + /* reset the active surface as well */ if (output && output->active && output->active == surface) { output->active->view->is_mapped = false; @@ -322,15 +329,11 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) if (ivi_seat && ivi_seat->focused_surface == wsurface) ivi_seat->focused_surface = NULL; - if (surface->role == IVI_SURFACE_ROLE_REMOTE && - output->type == OUTPUT_REMOTE) - ivi_destroy_waltham_destroy(surface); - /* 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); @@ -340,6 +343,14 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) weston_view_destroy(surface->view); } + if (surface->role == IVI_SURFACE_ROLE_TILE) { + ivi_layout_reset_split_surfaces(surface->ivi); + // activate previous when resizing back to give input set + // output active for allowing to resizing again if needed + if (output->previous_active) + ivi_layout_activate_by_surf(output, output->previous_active); + } + /* invalidate agl-shell surfaces so we can re-use them when * binding again */ if (surface->role == IVI_SURFACE_ROLE_PANEL) { @@ -381,7 +392,7 @@ skip_output_asignment: static void desktop_committed(struct weston_desktop_surface *dsurface, - int32_t sx, int32_t sy, void *userdata) + struct weston_coord_surface buf_offset, void *userdata) { struct ivi_compositor *ivi = userdata; struct ivi_surface *surface = @@ -393,11 +404,19 @@ desktop_committed(struct weston_desktop_surface *dsurface, return; if (ivi->shell_client.ready && !surface->checked_pending) { - const char * app_id = weston_desktop_surface_get_app_id(dsurface); + struct ivi_output *remote_output = NULL; + const char *app_id = weston_desktop_surface_get_app_id(dsurface); weston_log("Checking pending surface %p, app_id %s\n", surface, app_id); wl_list_remove(&surface->link); wl_list_init(&surface->link); + + if ((remote_output = ivi_layout_find_with_app_id(app_id, ivi))) { + ivi_set_pending_desktop_surface_remote(remote_output, app_id); + shell_send_app_on_output(ivi, app_id, remote_output->output->name); + } + + ivi_check_pending_desktop_surface(surface); surface->checked_pending = true; @@ -426,9 +445,11 @@ desktop_committed(struct weston_desktop_surface *dsurface, switch (surface->role) { case IVI_SURFACE_ROLE_DESKTOP: - case IVI_SURFACE_ROLE_REMOTE: ivi_layout_desktop_committed(surface); break; + case IVI_SURFACE_ROLE_REMOTE: + ivi_layout_remote_committed(surface); + break; case IVI_SURFACE_ROLE_POPUP: ivi_layout_popup_committed(surface); break; @@ -449,7 +470,7 @@ desktop_committed(struct weston_desktop_surface *dsurface, static void desktop_show_window_menu(struct weston_desktop_surface *dsurface, - struct weston_seat *seat, int32_t x, int32_t y, + struct weston_seat *seat, struct weston_coord_surface offset, void *userdata) { /* not supported */ @@ -501,9 +522,14 @@ desktop_minimized_requested(struct weston_desktop_surface *dsurface, static void desktop_set_xwayland_position(struct weston_desktop_surface *dsurface, - int32_t x, int32_t y, void *userdata) + struct weston_coord_global pos, void *userdata) { - /* not supported */ + struct ivi_surface *ivisurf = + weston_desktop_surface_get_user_data(dsurface); + + ivisurf->xwayland.x = pos.c.x; + ivisurf->xwayland.y = pos.c.y; + ivisurf->xwayland.is_set = true; } static const struct weston_desktop_api desktop_api = { @@ -534,9 +560,61 @@ 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) +{ +#ifdef BUILD_XWAYLAND + 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); +#endif +} + +bool +is_shell_surface_xwayland(struct ivi_surface *surf) +{ +#ifdef BUILD_XWAYLAND + const struct weston_xwayland_surface_api *api; + struct ivi_compositor *ivi = surf->ivi; + struct weston_surface *surface; + + api = ivi->xwayland_surface_api; + + if (!api) + return false; + + surface = weston_desktop_surface_get_surface(surf->dsurface); + return api->is_xwayland_surface(surface); +#else + return false; +#endif +} + int ivi_desktop_init(struct ivi_compositor *ivi) { @@ -551,5 +629,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; }