X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Flayout.c;h=89c2097f99dcdcd4ff854b9aabeebe0a45912fb5;hb=8033c46081b93f19843d140e58b527af7abf7a4f;hp=1773fc82ddb264d6599cdeaad8afc24fe0a10bd3;hpb=adf173ea334eafd233d168815078c4d199b08619;p=src%2Fagl-compositor.git diff --git a/src/layout.c b/src/layout.c index 1773fc8..89c2097 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; @@ -312,10 +357,26 @@ ivi_layout_activate_complete(struct ivi_output *output, app_id, ivi_layout_get_surface_role_name(surf), output->name); - if (wl_resource_get_version(ivi->shell_client.resource) >= AGL_SHELL_APP_STATE_SINCE_VERSION) - agl_shell_send_app_state(ivi->shell_client.resource, - app_id, AGL_SHELL_APP_STATE_ACTIVATED); + shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_ACTIVATED); +} +static bool +ivi_layout_find_output_with_app_id(const char *app_id, struct ivi_output *output) +{ + char *cur; + size_t app_id_len; + + cur = output->app_ids; + app_id_len = strlen(app_id); + + while ((cur = strstr(cur, app_id))) { + if ((cur[app_id_len] == ',' || cur[app_id_len] == '\0') && + (cur == output->app_ids || cur[-1] == ',')) + return true; + cur++; + } + + return false; } struct ivi_output * @@ -327,13 +388,12 @@ ivi_layout_find_with_app_id(const char *app_id, struct ivi_compositor *ivi) return NULL; wl_list_for_each(out, &ivi->outputs, link) { - if (!out->app_id) + if (!out->app_ids) continue; - if (!strcmp(app_id, out->app_id)) + if (ivi_layout_find_output_with_app_id(app_id, out)) return out; } - return NULL; } @@ -394,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, @@ -418,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) { @@ -427,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() @@ -437,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 && @@ -476,7 +581,7 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) return; } - if (!surf->ivi->activate_by_default) { + if (!surf->ivi->activate_by_default && !surf->xwayland.is_set) { weston_log("Refusing to activate surface role %d, app_id %s\n", surf->role, app_id); @@ -506,37 +611,18 @@ ivi_layout_desktop_committed(struct ivi_surface *surf) */ weston_log("Surface no app_id, role %s activating by default\n", ivi_layout_get_surface_role_name(surf)); - ivi_layout_activate_by_surf(r_output, surf); + if (surf->xwayland.is_set) { + ivi_layout_activate_by_surf(r_output, surf); + ivi_layout_activate_complete(r_output, surf); + } else { + ivi_layout_activate_by_surf(r_output, 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) @@ -579,7 +665,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 @@ -615,7 +702,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); @@ -773,6 +860,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) { @@ -804,6 +909,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, @@ -927,6 +1036,9 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf) struct ivi_output *remote_output = ivi_layout_find_with_app_id(app_id, ivi); + weston_log("Changed activation for app_id %s, type %s, on output %s\n", app_id, + ivi_layout_get_surface_role_name(surf), output->output->name); + /* if already active on a remote output do not * attempt to activate it again */ if (remote_output && remote_output->active == surf) @@ -1033,7 +1145,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; @@ -1072,7 +1185,5 @@ ivi_layout_deactivate(struct ivi_compositor *ivi, const char *app_id) weston_surface_damage(view->surface); } - if (wl_resource_get_version(ivi->shell_client.resource) >= AGL_SHELL_APP_STATE_SINCE_VERSION) - agl_shell_send_app_state(ivi->shell_client.resource, app_id, - AGL_SHELL_APP_STATE_DEACTIVATED); + shell_send_app_state(ivi, app_id, AGL_SHELL_APP_STATE_DEACTIVATED); }