mirror of
https://gitlab.freedesktop.org/wayland/weston
synced 2024-07-21 10:44:25 +00:00
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. Signed-off-by: Manuel Bachmann <manuel.bachmann@open.eurogiciel.org>
This commit is contained in:
parent
e058cd13e8
commit
50c87dbd95
|
@ -2444,6 +2444,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,
|
||||
|
@ -3344,6 +3391,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,
|
||||
|
@ -3355,7 +3415,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
|
||||
|
@ -5902,6 +5962,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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue