X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fdesktop.c;h=1351508ea7ba8e53a166c8c60fc8c1a6a4e00b4b;hb=0acbca5d1a9ca5aad361dfc2807f3822223c739d;hp=255b182f3bbb20dbf3fff19fbad2268069a3a6c5;hpb=13ac8bab43fffd002196d3a6760eefaa8944def2;p=src%2Fagl-compositor.git diff --git a/src/desktop.c b/src/desktop.c index 255b182..1351508 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -33,18 +33,6 @@ #include "agl-shell-desktop-server-protocol.h" -#if 0 -static struct weston_output * -get_default_output(struct weston_compositor *compositor) -{ - if (wl_list_empty(&compositor->output_list)) - return NULL; - - return wl_container_of(compositor->output_list.next, - struct weston_output, link); -} -#endif - static void desktop_advertise_app(struct wl_listener *listener, void *data) { @@ -103,6 +91,34 @@ get_focused_output(struct weston_compositor *compositor) return output; } +void +ivi_shell_activate_surface(struct ivi_surface *ivi_surf, + struct ivi_shell_seat *ivi_seat, + uint32_t flags) +{ + struct weston_desktop_surface *dsurface = ivi_surf->dsurface; + struct weston_surface *surface = + weston_desktop_surface_get_surface(dsurface); + + weston_view_activate_input(ivi_surf->view, ivi_seat->seat, flags); + + if (ivi_seat->focused_surface) { + struct ivi_surface *current_focus = + get_ivi_shell_surface(ivi_seat->focused_surface); + struct weston_desktop_surface *dsurface_focus; + assert(current_focus); + + dsurface_focus = current_focus->dsurface; + if (--current_focus->focus_count == 0) + weston_desktop_surface_set_activated(dsurface_focus, false); + } + + ivi_seat->focused_surface = surface; + if (ivi_surf->focus_count++ == 0) + weston_desktop_surface_set_activated(dsurface, true); +} + + static void desktop_surface_added_configure(struct ivi_surface *surface, struct ivi_output *ivi_output) @@ -148,6 +164,14 @@ desktop_surface_added(struct weston_desktop_surface *dsurface, void *userdata) dclient = weston_desktop_surface_get_client(dsurface); client = weston_desktop_client_get_client(dclient); + if (ivi->shell_client.resource && + ivi->shell_client.status == BOUND_FAILED) { + wl_client_post_implementation_error(client, + "agl_shell has already been bound. " + "Check out bound_fail event"); + return; + } + surface = zalloc(sizeof *surface); if (!surface) { wl_client_post_no_memory(client); @@ -234,8 +258,20 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) struct weston_surface *wsurface = weston_desktop_surface_get_surface(dsurface); const char *app_id = NULL; + struct weston_seat *wseat = NULL; + struct ivi_shell_seat *ivi_seat = NULL; + struct ivi_output *output = NULL; + + /* we might not have a valid ivi_surface if _added failed due to + * protocol errors */ + if (!surface) + return; + + wseat = get_ivi_shell_weston_first_seat(surface->ivi); + if (wseat) + ivi_seat = get_ivi_shell_seat(wseat); - struct ivi_output *output = ivi_layout_get_output_from_surface(surface); + output = ivi_layout_get_output_from_surface(surface); wl_list_remove(&surface->listener_advertise_app.link); surface->listener_advertise_app.notify = NULL; @@ -273,6 +309,13 @@ desktop_surface_removed(struct weston_desktop_surface *dsurface, void *userdata) output->active = NULL; } + /* clear out focused_surface to avoid a stale focused_surface. the + * client shell is responsible for keeping track and switch back to the + * last active surface so we don't get do anything at removal, just + * reset it */ + 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); @@ -356,6 +399,17 @@ desktop_committed(struct weston_desktop_surface *dsurface, !wl_list_empty(&surface->ivi->desktop_clients)) wl_signal_emit(&surface->signal_advertise_app, surface); + /* this repaint schedule is needed to allow resizing to work with the + * help of the hidden layer: + * + * 1. add the view in the hidden layer and send out correct dimensions + * 2. clients changes its dimensions + * 3. client commits with the new dimensions + * + * For desktop and fullscreen, desktop_surface_added() sends the + * dimensions from the beginning so applications no need to resize, but + * if that weren't the case we still need this in. + */ weston_compositor_schedule_repaint(surface->ivi->compositor); switch (surface->role) { @@ -463,8 +517,10 @@ ivi_shell_destroy(struct wl_listener *listener, void *data) struct ivi_compositor *ivi = container_of(listener, struct ivi_compositor, destroy_listener); - weston_desktop_destroy(ivi->desktop); + ivi_shell_finalize(ivi); ivi_compositor_destroy_pending_surfaces(ivi); + + weston_desktop_destroy(ivi->desktop); wl_list_remove(&listener->link); }