We now handle the client-side xdg_surface_set_minimized()
call, and eventually hide the target surface by moving it
to a dedicated layer.

Signed-off-by: Manuel Bachmann <manuel.bachm...@open.eurogiciel.org>
---
 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 fd9ead0..8ad528e 100644
--- a/desktop-shell/shell.c
+++ b/desktop-shell/shell.c
@@ -2443,6 +2443,53 @@ unset_maximized(struct shell_surface *shsurf)
 }
 
 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(&current_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,
                             struct wl_resource *output_resource)
@@ -3312,6 +3359,19 @@ xdg_surface_ack_change_state(struct wl_client *client,
        }
 }
 
+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,
@@ -3323,7 +3383,7 @@ static const struct xdg_surface_interface 
xdg_surface_implementation = {
        xdg_surface_set_output,
        xdg_surface_request_change_state,
        xdg_surface_ack_change_state,
-       NULL /* set_minimized */
+       xdg_surface_set_minimized
 };
 
 static void
@@ -5870,6 +5930,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 48ac250..5d127c6 100644
--- a/desktop-shell/shell.h
+++ b/desktop-shell/shell.h
@@ -197,6 +197,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_listener output_move_listener;
        struct wl_list output_list;
-- 
1.7.10.4

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to