X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Flayout.c;h=082c36ed7175a48bfb350d2c3ec506d2fd3d3ce7;hb=ffdbb335ee72a5b5cba198800c5537b89d7755a0;hp=028ff4a58737243028784d296d7e7d8fd20445bb;hpb=53a039ff1c4b05aaacce118a04563620e676d7c6;p=src%2Fagl-compositor.git diff --git a/src/layout.c b/src/layout.c index 028ff4a..082c36e 100644 --- a/src/layout.c +++ b/src/layout.c @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -49,6 +50,9 @@ static const char *ivi_roles_as_string[] = { [IVI_SURFACE_ROLE_REMOTE] = "REMOTE", }; +bool +ivi_surf_in_hidden_layer(struct ivi_compositor *ivi, struct ivi_surface *surface); + const char * ivi_layout_get_surface_role_name(struct ivi_surface *surf) { @@ -152,6 +156,29 @@ void ivi_layout_init(struct ivi_compositor *ivi, struct ivi_output *output) { bool use_default_area = true; + struct weston_config_section *section = output->config; + char *t; + + weston_config_section_get_string(section, "activation-area", &t, NULL); + if (t) { + if (output->area_activation.width == 0 && + output->area_activation.height == 0 && + output->area_activation.x == 0 && + output->area_activation.y == 0) { + weston_log("WARNING: activation-area set in " + "configuration file, but yet applied!\n"); + if (parse_activation_area(t, output) < 0) + weston_log("Invalid activation-area \"%s\" for output %s\n", + t, output->name); + } else { + weston_log("WARNING: activation-area detected in ini file, " + "but agl_shell override detected!\n"); + if (parse_activation_area(t, output) < 0) + weston_log("Invalid activation-area \"%s\" for output %s\n", + t, output->name); + } + } + free(t); ivi_background_init(ivi, output); @@ -218,6 +245,7 @@ ivi_layout_activate_complete(struct ivi_output *output, struct weston_seat *wseat = get_ivi_shell_weston_first_seat(ivi); struct ivi_shell_seat *ivi_seat = get_ivi_shell_seat(wseat); const char *app_id = weston_desktop_surface_get_app_id(surf->dsurface); + bool update_previous = true; if (weston_view_is_mapped(view)) { weston_layer_entry_remove(&view->layer_link); @@ -248,6 +276,8 @@ ivi_layout_activate_complete(struct ivi_output *output, weston_view_set_output(view, woutput); + /* drop any previous masks set on this view */ + weston_view_set_mask_infinite(view); if (surf->role != IVI_SURFACE_ROLE_BACKGROUND) weston_view_set_position(view, @@ -286,7 +316,22 @@ ivi_layout_activate_complete(struct ivi_output *output, weston_layer_entry_remove(&output->active->view->layer_link); } } - output->previous_active = output->active; + + if (output->previous_active && output->active) { + const char *c_app_id = + weston_desktop_surface_get_app_id(output->active->dsurface); + + /* if the currently activated app_id is the same as the one + * we're trying to complete activation with means we're + * operating on the same app_id so do update previous_active as + * it will overwrite it with the same value */ + if (!strcmp(c_app_id, app_id)) { + update_previous = false; + } + } + + if (update_previous) + output->previous_active = output->active; output->active = surf; surf->current_completed_output = output; @@ -409,8 +454,10 @@ ivi_layout_add_to_hidden_layer(struct ivi_surface *surf, if (surf->hidden_layer_output && surf->hidden_layer_output != ivi_output) { weston_layer_entry_remove(&ev->layer_link); + weston_view_geometry_dirty(ev); + weston_surface_damage(ev->surface); - if (ivi_output->area.width != surf->hidden_layer_output->area.width && + if (ivi_output->area.width != surf->hidden_layer_output->area.width || ivi_output->area.height != surf->hidden_layer_output->area.height) { weston_desktop_surface_set_maximized(dsurf, true); weston_desktop_surface_set_size(dsurf, @@ -433,6 +480,53 @@ ivi_layout_add_to_hidden_layer(struct ivi_surface *surf, weston_compositor_schedule_repaint(ivi->compositor); } +void +ivi_layout_remote_committed(struct ivi_surface *surf) +{ + struct weston_desktop_surface *dsurf = surf->dsurface; + struct weston_geometry geom = weston_desktop_surface_get_geometry(dsurf); + struct ivi_policy *policy = surf->ivi->policy; + struct ivi_output *output; + const char *app_id = weston_desktop_surface_get_app_id(dsurf); + + assert(surf->role == IVI_SURFACE_ROLE_REMOTE); + + output = surf->remote.output; + + if (policy && policy->api.surface_activate_by_default && + !policy->api.surface_activate_by_default(surf, surf->ivi)) + return; + + /* we can only activate it again by using the protocol, but + * additionally the output is not reset when + * ivi_layout_activate_complete() terminates so we use the + * current active surface to avoid hitting this again and again + * */ + if (surf->mapped && output->active == surf) + return; + + if (!surf->ivi->activate_by_default && + !ivi_surf_in_hidden_layer(surf->ivi, surf)) { + weston_log("Refusing to activate surface role %d, " + "app_id %s\n", surf->role, app_id); + + if (!weston_desktop_surface_get_maximized(dsurf) || + geom.width != output->area.width || + geom.height != output->area.height) { + ivi_layout_add_to_hidden_layer(surf, output); + } + + return; + } + + if (!weston_desktop_surface_get_maximized(dsurf) || + geom.width != output->area.width || + geom.height != output->area.height) + return; + + ivi_layout_activate_complete(output, surf); +} + void ivi_layout_desktop_committed(struct ivi_surface *surf) { @@ -442,8 +536,7 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) struct ivi_output *output; const char *app_id = weston_desktop_surface_get_app_id(dsurf); - assert(surf->role == IVI_SURFACE_ROLE_DESKTOP || - surf->role == IVI_SURFACE_ROLE_REMOTE); + assert(surf->role == IVI_SURFACE_ROLE_DESKTOP); /* * we can't make use here of the ivi_layout_get_output_from_surface() @@ -452,12 +545,9 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) * with 'mapped' at this point to avoid tripping over * to a surface that continuously updates its content */ - if (surf->role == IVI_SURFACE_ROLE_DESKTOP) - output = surf->desktop.pending_output; - else - output = surf->remote.output; + output = surf->desktop.pending_output; - if (surf->role == IVI_SURFACE_ROLE_DESKTOP && !output) { + if (!output) { struct ivi_output *r_output; if (policy && policy->api.surface_activate_by_default && @@ -528,30 +618,6 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) return; } - if (surf->role == IVI_SURFACE_ROLE_REMOTE && output) { - if (policy && policy->api.surface_activate_by_default && - !policy->api.surface_activate_by_default(surf, surf->ivi)) - return; - - /* we can only activate it again by using the protocol, but - * additionally the output is not reset when - * ivi_layout_activate_complete() terminates so we use the - * current active surface to avoid hitting this again and again - * */ - if (surf->mapped && output->active == surf) - return; - - if (app_id) { - weston_log("Surface with app_id %s, role %s activating " - "by default on output %s\n", - weston_desktop_surface_get_app_id(surf->dsurface), - ivi_layout_get_surface_role_name(surf), - output->output->name); - ivi_layout_activate(output, app_id); - } - return; - } - if (!weston_desktop_surface_get_maximized(dsurf) || geom.width != output->area.width || geom.height != output->area.height) @@ -594,7 +660,8 @@ ivi_layout_fullscreen_committed(struct ivi_surface *surface) assert(surface->role == IVI_SURFACE_ROLE_FULLSCREEN); - if (weston_view_is_mapped(view)) + + if (surface->state == FULLSCREEN && weston_view_is_mapped(view)) return; /* if we still get here but we haven't resized so far, send configure @@ -630,7 +697,7 @@ ivi_layout_fullscreen_committed(struct ivi_surface *surface) } /* this implies we resized correctly */ - if (!weston_view_is_mapped(view)) { + if (!weston_view_is_mapped(view) || surface->state != FULLSCREEN) { weston_layer_entry_remove(&view->layer_link); weston_view_set_output(view, woutput); @@ -788,6 +855,24 @@ ivi_compute_popup_position(const struct weston_output *output, struct weston_vie } +bool +ivi_surf_in_hidden_layer(struct ivi_compositor *ivi, struct ivi_surface *surface) +{ + struct weston_view *ev; + + wl_list_for_each(ev, &ivi->hidden.view_list.link, layer_link.link) { + if (ev == surface->view) + return true; + } + + wl_list_for_each(ev, &ivi->fullscreen.view_list.link, layer_link.link) { + if (ev == surface->view) + return true; + } + + return false; +} + void ivi_layout_popup_committed(struct ivi_surface *surface) { @@ -819,6 +904,10 @@ ivi_layout_popup_committed(struct ivi_surface *surface) assert(surface->role == IVI_SURFACE_ROLE_POPUP); + /* remove it from hidden layer if present */ + if (ivi_surf_in_hidden_layer(ivi, surface)) + weston_layer_entry_remove(&view->layer_link); + weston_view_set_output(view, woutput); ivi_compute_popup_position(woutput, view, @@ -1051,7 +1140,8 @@ ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id) weston_log("Deactiving %s, role %s\n", app_id, ivi_layout_get_surface_role_name(surf)); - if (surf->role == IVI_SURFACE_ROLE_DESKTOP) { + if (surf->role == IVI_SURFACE_ROLE_DESKTOP || + surf->role == IVI_SURFACE_ROLE_REMOTE) { struct ivi_surface *previous_active; previous_active = ivi_output->previous_active;