On 02/04/15 12:10 AM, Mario Kleiner wrote: > Desktop shell demoted all fullscreen shell surfaces on all active > outputs of a multi-display setup whenever any shell surface was > activated anywhere. This made it impossible to have multiple > fullscreen windows on separate outputs active at the same > time, as creating or activating any shell surface would disable > fullscreen status for all existing fullscreen surfaces. > > Make lower_fullscreen_layer() more selective, so on request it > only demotes fullscreen surfaces on a specified weston_output. > > The activate() method for a specific surface will now only request > demotion of fullscreen surfaces on the target output of the activated > surface, but leave fullscreen surfaces on unrelated outputs alone. > > Desktop wide acting functions like the window switcher or exposay > will still demote all fullscreen surfaces on all outputs to > implement their effect as before. > > Signed-off-by: Mario Kleiner <mario.kleiner...@gmail.com> > ---
Looks sensible to me Reviewed-By: Derek Foreman <der...@osg.samsung.com> > desktop-shell/exposay.c | 2 +- > desktop-shell/shell.c | 47 +++++++++++++++++++++++++++++++++++------------ > desktop-shell/shell.h | 3 ++- > 3 files changed, 38 insertions(+), 14 deletions(-) > > diff --git a/desktop-shell/exposay.c b/desktop-shell/exposay.c > index 4b65cbd..a15fc7a 100644 > --- a/desktop-shell/exposay.c > +++ b/desktop-shell/exposay.c > @@ -563,7 +563,7 @@ exposay_transition_active(struct desktop_shell *shell) > shell->exposay.clicked = NULL; > wl_list_init(&shell->exposay.surface_list); > > - lower_fullscreen_layer(shell); > + lower_fullscreen_layer(shell, NULL); > shell->exposay.grab_kbd.interface = &exposay_kbd_grab; > weston_keyboard_start_grab(seat->keyboard, > &shell->exposay.grab_kbd); > diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c > index f7c928e..7d0e403 100644 > --- a/desktop-shell/shell.c > +++ b/desktop-shell/shell.c > @@ -303,17 +303,29 @@ static bool > shell_surface_is_top_fullscreen(struct shell_surface *shsurf) > { > struct desktop_shell *shell; > - struct weston_view *top_fs_ev; > + struct weston_view *view; > + struct shell_surface *top_fs_shsurf = NULL; > > shell = shell_surface_get_shell(shsurf); > > if (wl_list_empty(&shell->fullscreen_layer.view_list.link)) > return false; > > - top_fs_ev = container_of(shell->fullscreen_layer.view_list.link.next, > - struct weston_view, > - layer_link.link); > - return (shsurf == get_shell_surface(top_fs_ev->surface)); > + /* Find topmost shsurf on the same fullscreen output on which shsurf > + * is displaying. We don't care about other outputs. > + */ > + wl_list_for_each(view, &shell->fullscreen_layer.view_list.link, > + layer_link.link) { > + struct shell_surface *cand_shsurf = > get_shell_surface(view->surface); > + > + if (cand_shsurf && > + (cand_shsurf->fullscreen_output == > shsurf->fullscreen_output)) { > + top_fs_shsurf = cand_shsurf; > + break; > + } > + } > + > + return (shsurf == top_fs_shsurf); > } > > static void > @@ -5000,10 +5012,14 @@ rotate_binding(struct weston_seat *seat, uint32_t > time, uint32_t button, > * and this is reversed when such a surface is re-configured, see > * shell_configure_fullscreen() and shell_ensure_fullscreen_black_view(). > * > + * lowering_output = NULL - Lower on all outputs, else only lower on the > + * specified output. > + * > * This should be used when implementing shell-wide overlays, such as > * the alt-tab switcher, which need to de-promote fullscreen layers. */ > void > -lower_fullscreen_layer(struct desktop_shell *shell) > +lower_fullscreen_layer(struct desktop_shell *shell, > + struct weston_output > *lowering_output) > { > struct workspace *ws; > struct weston_view *view, *prev; > @@ -5017,6 +5033,12 @@ lower_fullscreen_layer(struct desktop_shell *shell) > if (!shsurf) > continue; > > + /* Only lower surfaces which have lowering_output as their > fullscreen > + * output, unless a NULL output asks for lowering on all > outputs. > + */ > + if (lowering_output && (shsurf->fullscreen_output != > lowering_output)) > + continue; > + > /* We can have a non-fullscreen popup for a fullscreen surface > * in the fullscreen layer. */ > if (shsurf->state.fullscreen) { > @@ -5047,9 +5069,13 @@ activate(struct desktop_shell *shell, struct > weston_surface *es, > struct weston_surface *old_es; > struct shell_surface *shsurf; > > - lower_fullscreen_layer(shell); > - > main_surface = weston_surface_get_main_surface(es); > + shsurf = get_shell_surface(main_surface); > + assert(shsurf); > + > + /* Only demote fullscreen surfaces on the output of activated shsurf. > + * Leave fullscreen surfaces on unrelated outputs alone. */ > + lower_fullscreen_layer(shell, shsurf->output); > > weston_surface_activate(es, seat); > > @@ -5060,9 +5086,6 @@ activate(struct desktop_shell *shell, struct > weston_surface *es, > old_es = state->keyboard_focus; > focus_state_set_focus(state, es); > > - shsurf = get_shell_surface(main_surface); > - assert(shsurf); > - > if (shsurf->state.fullscreen && configure) > shell_configure_fullscreen(shsurf); > else > @@ -6119,7 +6142,7 @@ switcher_binding(struct weston_seat *seat, uint32_t > time, uint32_t key, > wl_array_init(&switcher->minimized_array); > > restore_all_output_modes(shell->compositor); > - lower_fullscreen_layer(switcher->shell); > + lower_fullscreen_layer(switcher->shell, NULL); > switcher->grab.interface = &switcher_grab; > weston_keyboard_start_grab(seat->keyboard, &switcher->grab); > weston_keyboard_set_focus(seat->keyboard, NULL); > diff --git a/desktop-shell/shell.h b/desktop-shell/shell.h > index 2cfd1d6..0f8e16d 100644 > --- a/desktop-shell/shell.h > +++ b/desktop-shell/shell.h > @@ -227,7 +227,8 @@ struct workspace * > get_current_workspace(struct desktop_shell *shell); > > void > -lower_fullscreen_layer(struct desktop_shell *shell); > +lower_fullscreen_layer(struct desktop_shell *shell, > + struct weston_output > *lowering_output); > > void > activate(struct desktop_shell *shell, struct weston_surface *es, > _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel