X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Flayout.c;h=be65c6cc730e928e979e35f0119f0af79f0f8770;hb=89440e0ffdfea2568d49e95465464cfc5c1d92ff;hp=c98ae762ff626547bbfa9a0e27179fb7664efe7d;hpb=b13e185e7214218ca00025a480695392aa5cdee2;p=src%2Fagl-compositor.git diff --git a/src/layout.c b/src/layout.c index c98ae76..be65c6c 100644 --- a/src/layout.c +++ b/src/layout.c @@ -192,9 +192,13 @@ ivi_layout_activate_complete(struct ivi_output *output, struct ivi_compositor *ivi = output->ivi; struct weston_output *woutput = output->output; struct weston_view *view = surf->view; + struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi); + struct ivi_shell_seat *ivi_seat = get_ivi_shell_seat(wseat); if (weston_view_is_mapped(view)) { weston_layer_entry_remove(&view->layer_link); + } else { + weston_view_update_transform(view); } weston_view_set_output(view, woutput); @@ -219,6 +223,9 @@ ivi_layout_activate_complete(struct ivi_output *output, weston_view_geometry_dirty(view); weston_surface_damage(view->surface); + if (ivi_seat) + ivi_shell_activate_surface(surf, ivi_seat, WESTON_ACTIVATE_FLAG_NONE); + /* * the 'remote' role now makes use of this part so make sure we don't * trip the enum such that we might end up with a modified output for @@ -254,8 +261,7 @@ ivi_layout_find_with_app_id(const char *app_id, struct ivi_compositor *ivi) return NULL; } - -static struct ivi_output * +struct ivi_output * ivi_layout_find_bg_output(struct ivi_compositor *ivi) { struct ivi_output *out; @@ -401,41 +407,89 @@ ivi_layout_fullscreen_committed(struct ivi_surface *surface) struct ivi_output *output = surface->split.output; struct weston_output *woutput = output->output; + struct ivi_output *bg_output = ivi_layout_find_bg_output(ivi); struct weston_view *view = surface->view; - struct weston_geometry geom; + struct weston_geometry geom = + weston_desktop_surface_get_geometry(dsurface); + + struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi); + struct ivi_shell_seat *ivi_seat = get_ivi_shell_seat(wseat); + + bool is_fullscreen = weston_desktop_surface_get_fullscreen(dsurface); + bool is_dim_same = + geom.width == bg_output->output->width && + geom.height == bg_output->output->height; if (policy && policy->api.surface_activate_by_default && !policy->api.surface_activate_by_default(surface, surface->ivi) && !surface->mapped) return; - if (surface->view->is_mapped) + assert(surface->role == IVI_SURFACE_ROLE_FULLSCREEN); + + if (weston_view_is_mapped(view)) return; - geom = weston_desktop_surface_get_geometry(dsurface); - weston_log("(fs) geom x %d, y %d, width %d, height %d\n", geom.x, geom.y, - geom.width, geom.height); + /* if we still get here but we haven't resized so far, send configure + * events to do so */ + if (surface->state != RESIZING && (!is_fullscreen || !is_dim_same)) { + struct ivi_output *bg_output = + ivi_layout_find_bg_output(surface->ivi); - assert(surface->role == IVI_SURFACE_ROLE_FULLSCREEN); + weston_log("Placing fullscreen app_id %s, type %s in hidden layer\n", + app_id, ivi_layout_get_surface_role_name(surface)); + weston_desktop_surface_set_fullscreen(dsurface, true); + weston_desktop_surface_set_size(dsurface, + bg_output->output->width, + bg_output->output->height); - weston_desktop_surface_set_fullscreen(dsurface, true); + surface->state = RESIZING; + weston_view_set_output(view, output->output); + weston_layer_entry_insert(&ivi->hidden.view_list, &view->layer_link); + return; + } - weston_view_set_output(view, woutput); - weston_view_set_position(view, woutput->x, woutput->y); - weston_layer_entry_insert(&ivi->fullscreen.view_list, &view->layer_link); + /* eventually, we would set the surface fullscreen, but the client + * hasn't resized correctly by this point, so terminate connection */ + if (surface->state == RESIZING && is_fullscreen && !is_dim_same) { + struct weston_desktop_client *desktop_client = + weston_desktop_surface_get_client(dsurface); + struct wl_client *client = + weston_desktop_client_get_client(desktop_client); + wl_client_post_implementation_error(client, + "can not display surface due to invalid geometry." + " Client should perform a geometry resize!"); + return; + } - weston_view_geometry_dirty(view); - weston_surface_damage(view->surface); + /* this implies we resized correctly */ + if (!weston_view_is_mapped(view)) { + weston_layer_entry_remove(&view->layer_link); - wsurface->is_mapped = true; - surface->view->is_mapped = true; + weston_view_set_output(view, woutput); + weston_view_set_position(view, woutput->x, woutput->y); + weston_layer_entry_insert(&ivi->fullscreen.view_list, &view->layer_link); - shell_advertise_app_state(ivi, app_id, - NULL, AGL_SHELL_DESKTOP_APP_STATE_ACTIVATED); + wsurface->is_mapped = true; + surface->view->is_mapped = true; + surface->state = FULLSCREEN; - weston_log("Activation completed for app_id %s, role %s, output %s\n", - app_id, ivi_layout_get_surface_role_name(surface), output->name); + weston_view_geometry_dirty(view); + weston_surface_damage(view->surface); + + if (ivi_seat) + ivi_shell_activate_surface(surface, ivi_seat, WESTON_ACTIVATE_FLAG_NONE); + + shell_advertise_app_state(ivi, app_id, + NULL, AGL_SHELL_DESKTOP_APP_STATE_ACTIVATED); + + weston_log("Activation completed for app_id %s, role %s, " + "output %s\n", app_id, + ivi_layout_get_surface_role_name(surface), + output->name); + + } } void @@ -473,6 +527,9 @@ ivi_layout_split_committed(struct ivi_surface *surface) struct ivi_output *output = surface->split.output; struct weston_output *woutput = output->output; + struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi); + struct ivi_shell_seat *ivi_seat = get_ivi_shell_seat(wseat); + struct weston_view *view = surface->view; struct weston_geometry geom; @@ -543,6 +600,9 @@ ivi_layout_split_committed(struct ivi_surface *surface) weston_view_geometry_dirty(view); weston_surface_damage(view->surface); + if (ivi_seat) + ivi_shell_activate_surface(surface, ivi_seat, WESTON_ACTIVATE_FLAG_NONE); + wsurface->is_mapped = true; surface->view->is_mapped = true; @@ -578,6 +638,9 @@ ivi_layout_popup_committed(struct ivi_surface *surface) struct ivi_output *output = surface->popup.output; struct weston_output *woutput = output->output; + struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi); + struct ivi_shell_seat *ivi_seat = get_ivi_shell_seat(wseat); + struct weston_view *view = surface->view; if (policy && policy->api.surface_activate_by_default && @@ -585,7 +648,7 @@ ivi_layout_popup_committed(struct ivi_surface *surface) !surface->mapped) return; - if (surface->view->is_mapped) + if (surface->view->is_mapped || surface->state == HIDDEN) return; assert(surface->role == IVI_SURFACE_ROLE_POPUP); @@ -595,6 +658,7 @@ ivi_layout_popup_committed(struct ivi_surface *surface) ivi_compute_popup_position(woutput, view, surface->popup.x, surface->popup.y, &new_x, &new_y); weston_view_set_position(view, new_x, new_y); + weston_view_update_transform(view); /* only clip the pop-up dialog window if we have a valid * width and height being passed on. Users might not want to have one @@ -608,6 +672,9 @@ ivi_layout_popup_committed(struct ivi_surface *surface) weston_view_geometry_dirty(view); weston_surface_damage(view->surface); + if (ivi_seat) + ivi_shell_activate_surface(surface, ivi_seat, WESTON_ACTIVATE_FLAG_NONE); + wsurface->is_mapped = true; surface->view->is_mapped = true; @@ -640,6 +707,7 @@ ivi_layout_popup_re_add(struct ivi_surface *surface) if (!surface->mapped) surface->mapped = true; + surface->state = NORMAL; ivi_layout_popup_committed(surface); } @@ -858,6 +926,9 @@ ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id) } else if (surf->role == IVI_SURFACE_ROLE_POPUP) { struct weston_view *view = surf->view; + weston_view_unmap(view); + surf->state = HIDDEN; + weston_layer_entry_remove(&view->layer_link); weston_view_geometry_dirty(view); weston_surface_damage(view->surface);