diff options
-rw-r--r-- | src/desktop.c | 4 | ||||
-rw-r--r-- | src/ivi-compositor.h | 2 | ||||
-rw-r--r-- | src/layout.c | 86 | ||||
-rw-r--r-- | src/shell.c | 2 |
4 files changed, 60 insertions, 34 deletions
diff --git a/src/desktop.c b/src/desktop.c index eb0dc8a..361c5b4 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -426,9 +426,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; diff --git a/src/ivi-compositor.h b/src/ivi-compositor.h index f755e67..49d38de 100644 --- a/src/ivi-compositor.h +++ b/src/ivi-compositor.h @@ -416,6 +416,8 @@ ivi_layout_activate_by_surf(struct ivi_output *output, struct ivi_surface *surf) void ivi_layout_desktop_committed(struct ivi_surface *surf); +void +ivi_layout_remote_committed(struct ivi_surface *surf); void ivi_layout_popup_committed(struct ivi_surface *surface); diff --git a/src/layout.c b/src/layout.c index 9981ebb..a5e3b36 100644 --- a/src/layout.c +++ b/src/layout.c @@ -49,6 +49,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) { @@ -452,6 +455,53 @@ ivi_layout_add_to_hidden_layer(struct ivi_surface *surf, } 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) { struct weston_desktop_surface *dsurf = surf->dsurface; @@ -460,8 +510,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() @@ -470,12 +519,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 && @@ -546,30 +592,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) @@ -807,7 +829,7 @@ ivi_compute_popup_position(const struct weston_output *output, struct weston_vie } -static bool +bool ivi_surf_in_hidden_layer(struct ivi_compositor *ivi, struct ivi_surface *surface) { struct weston_view *ev; diff --git a/src/shell.c b/src/shell.c index c3459e7..c18017b 100644 --- a/src/shell.c +++ b/src/shell.c @@ -706,7 +706,7 @@ ivi_check_pending_desktop_surface(struct ivi_surface *surface) ret = ivi_check_pending_desktop_surface_remote(surface); if (ret) { ivi_set_desktop_surface_remote(surface); - ivi_layout_desktop_committed(surface); + ivi_layout_remote_committed(surface); return; } |