From cb6dd95704b8dbf2344d0c5008e0739cf8740438 Mon Sep 17 00:00:00 2001 From: Manuel Bachmann Date: Wed, 26 Feb 2014 16:43:59 +0100 Subject: compositor: implement xdg_surface_set_minimized() We now handle the client-side xdg_surface_set_minimized() call, and eventually hide the target surface by moving it to a dedicated layer. Bug-Tizen: TIVI-2792 Bug: https://bugs.freedesktop.org/show_bug.cgi?id=53214 Origin: http://lists.freedesktop.org/archives/wayland-devel/2014-February/013471.html Change-Id: I4894a9c384ecae8ef1d3f37b84d4d8eb1594a1a1 Signed-off-by: Manuel Bachmann --- desktop-shell/shell.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++- desktop-shell/shell.h | 2 ++ 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index c2755433..b8cd32b1 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -2382,6 +2382,53 @@ unset_maximized(struct shell_surface *shsurf) /* Layer is updated in set_surface_type(). */ } +static void +set_minimized(struct weston_surface *surface, uint32_t is_true) +{ + struct shell_surface *shsurf; + struct workspace *current_ws; + struct weston_seat *seat; + struct weston_surface *focus; + struct weston_view *view; + + view = get_default_view(surface); + if (!view) + return; + + assert(weston_surface_get_main_surface(view->surface) == view->surface); + + shsurf = get_shell_surface(surface); + current_ws = get_current_workspace(shsurf->shell); + + wl_list_remove(&view->layer_link); + /* hide or show, depending on the state */ + if (is_true) { + wl_list_insert(&shsurf->shell->minimized_layer.view_list, &view->layer_link); + + drop_focus_state(shsurf->shell, current_ws, view->surface); + wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) { + if (!seat->keyboard) + continue; + focus = weston_surface_get_main_surface(seat->keyboard->focus); + if (focus == view->surface) + weston_keyboard_set_focus(seat->keyboard, NULL); + } + } + else { + wl_list_insert(¤t_ws->layer.view_list, &view->layer_link); + + wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link) { + if (!seat->keyboard) + continue; + activate(shsurf->shell, view->surface, seat); + } + } + + shell_surface_update_child_surface_layers(shsurf); + + weston_view_damage_below(view); +} + static void shell_surface_set_maximized(struct wl_client *client, struct wl_resource *resource, @@ -3251,6 +3298,19 @@ xdg_surface_unset_maximized(struct wl_client *client, shsurf->client->send_configure(shsurf->surface, 0, width, height); } +static void +xdg_surface_set_minimized(struct wl_client *client, + struct wl_resource *resource) +{ + struct shell_surface *shsurf = wl_resource_get_user_data(resource); + + if (shsurf->type != SHELL_SURFACE_TOPLEVEL) + return; + + /* apply compositor's own minimization logic (hide) */ + set_minimized(shsurf->surface, 1); +} + static const struct xdg_surface_interface xdg_surface_implementation = { xdg_surface_destroy, xdg_surface_set_transient_for, @@ -3264,7 +3324,7 @@ static const struct xdg_surface_interface xdg_surface_implementation = { xdg_surface_unset_fullscreen, xdg_surface_set_maximized, xdg_surface_unset_maximized, - NULL /* set_minimized */ + xdg_surface_set_minimized }; static void @@ -5673,6 +5733,8 @@ module_init(struct weston_compositor *ec, } activate_workspace(shell, 0); + weston_layer_init(&shell->minimized_layer, NULL); + wl_list_init(&shell->workspaces.anim_sticky_list); wl_list_init(&shell->workspaces.animation.link); shell->workspaces.animation.frame = animate_workspace_change_frame; diff --git a/desktop-shell/shell.h b/desktop-shell/shell.h index dbb28543..e89fc9cc 100644 --- a/desktop-shell/shell.h +++ b/desktop-shell/shell.h @@ -183,6 +183,8 @@ struct desktop_shell { enum animation_type startup_animation_type; enum animation_type focus_animation_type; + struct weston_layer minimized_layer; + struct wl_listener output_create_listener; struct wl_list output_list; -- cgit v1.2.3