Extend minimize logic

This commit is contained in:
Erik Reider 2023-03-20 22:18:13 +01:00
parent 7d5d7a3022
commit d19c795bd5
4 changed files with 63 additions and 3 deletions

View file

@ -134,6 +134,7 @@ struct sway_xdg_shell_view {
struct wl_listener request_move; struct wl_listener request_move;
struct wl_listener request_resize; struct wl_listener request_resize;
struct wl_listener request_maximize; struct wl_listener request_maximize;
struct wl_listener request_minimize;
struct wl_listener request_fullscreen; struct wl_listener request_fullscreen;
struct wl_listener set_title; struct wl_listener set_title;
struct wl_listener set_app_id; struct wl_listener set_app_id;

View file

@ -332,6 +332,25 @@ static void handle_request_maximize(struct wl_listener *listener, void *data) {
wlr_xdg_surface_schedule_configure(toplevel->base); wlr_xdg_surface_schedule_configure(toplevel->base);
} }
/* Minimize to scratchpad */
static void handle_request_minimize(struct wl_listener *listener, void *data) {
struct sway_xdg_shell_view *xdg_shell_view =
wl_container_of(listener, xdg_shell_view, request_minimize);
struct sway_container *container = xdg_shell_view->view.container;
if (!container->pending.workspace) {
while (container->pending.parent) {
container = container->pending.parent;
}
}
if (!container->scratchpad) {
root_scratchpad_add_container(container, NULL);
} else if (container->pending.workspace) {
root_scratchpad_hide(container);
}
transaction_commit_dirty();
}
static void handle_request_fullscreen(struct wl_listener *listener, void *data) { static void handle_request_fullscreen(struct wl_listener *listener, void *data) {
struct sway_xdg_shell_view *xdg_shell_view = struct sway_xdg_shell_view *xdg_shell_view =
wl_container_of(listener, xdg_shell_view, request_fullscreen); wl_container_of(listener, xdg_shell_view, request_fullscreen);
@ -406,6 +425,7 @@ static void handle_unmap(struct wl_listener *listener, void *data) {
wl_list_remove(&xdg_shell_view->commit.link); wl_list_remove(&xdg_shell_view->commit.link);
wl_list_remove(&xdg_shell_view->new_popup.link); wl_list_remove(&xdg_shell_view->new_popup.link);
wl_list_remove(&xdg_shell_view->request_maximize.link); wl_list_remove(&xdg_shell_view->request_maximize.link);
wl_list_remove(&xdg_shell_view->request_minimize.link);
wl_list_remove(&xdg_shell_view->request_fullscreen.link); wl_list_remove(&xdg_shell_view->request_fullscreen.link);
wl_list_remove(&xdg_shell_view->request_move.link); wl_list_remove(&xdg_shell_view->request_move.link);
wl_list_remove(&xdg_shell_view->request_resize.link); wl_list_remove(&xdg_shell_view->request_resize.link);
@ -458,6 +478,10 @@ static void handle_map(struct wl_listener *listener, void *data) {
wl_signal_add(&toplevel->events.request_maximize, wl_signal_add(&toplevel->events.request_maximize,
&xdg_shell_view->request_maximize); &xdg_shell_view->request_maximize);
xdg_shell_view->request_minimize.notify = handle_request_minimize;
wl_signal_add(&toplevel->events.request_minimize,
&xdg_shell_view->request_minimize);
xdg_shell_view->request_fullscreen.notify = handle_request_fullscreen; xdg_shell_view->request_fullscreen.notify = handle_request_fullscreen;
wl_signal_add(&toplevel->events.request_fullscreen, wl_signal_add(&toplevel->events.request_fullscreen,
&xdg_shell_view->request_fullscreen); &xdg_shell_view->request_fullscreen);

View file

@ -575,6 +575,7 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
transaction_commit_dirty(); transaction_commit_dirty();
} }
/* Minimize to scratchpad */
static void handle_request_minimize(struct wl_listener *listener, void *data) { static void handle_request_minimize(struct wl_listener *listener, void *data) {
struct sway_xwayland_view *xwayland_view = struct sway_xwayland_view *xwayland_view =
wl_container_of(listener, xwayland_view, request_minimize); wl_container_of(listener, xwayland_view, request_minimize);
@ -585,9 +586,26 @@ static void handle_request_minimize(struct wl_listener *listener, void *data) {
} }
struct wlr_xwayland_minimize_event *e = data; struct wlr_xwayland_minimize_event *e = data;
struct sway_seat *seat = input_manager_current_seat(); struct sway_container *container = view->container;
bool focused = seat_get_focus(seat) == &view->container->node; if (!container->pending.workspace) {
wlr_xwayland_surface_set_minimized(xsurface, !focused && e->minimize); while (container->pending.parent) {
container = container->pending.parent;
}
}
if(e->minimize) {
if (!container->scratchpad) {
root_scratchpad_add_container(container, NULL);
} else if (container->pending.workspace) {
root_scratchpad_hide(container);
}
wlr_xwayland_surface_set_minimized(xsurface, true);
} else {
if(container->scratchpad) {
root_scratchpad_show(container);
wlr_xwayland_surface_set_minimized(xsurface, false);
}
}
transaction_commit_dirty();
} }
static void handle_request_move(struct wl_listener *listener, void *data) { static void handle_request_move(struct wl_listener *listener, void *data) {

View file

@ -111,6 +111,17 @@ void root_scratchpad_remove_container(struct sway_container *con) {
} }
} }
/* Set minimized state from scratchpad container `show` state */
static void root_handle_container(struct sway_container *con, bool show) {
struct wlr_foreign_toplevel_handle_v1 *foreign_toplevel = con->view->foreign_toplevel;
struct wlr_xwayland_surface *xsurface = con->view->wlr_xwayland_surface;
if (xsurface) {
wlr_xwayland_surface_set_minimized(xsurface, !show);
} else if (foreign_toplevel) {
wlr_foreign_toplevel_handle_v1_set_minimized(foreign_toplevel, !show);
}
}
void root_scratchpad_show(struct sway_container *con) { void root_scratchpad_show(struct sway_container *con) {
struct sway_seat *seat = input_manager_current_seat(); struct sway_seat *seat = input_manager_current_seat();
struct sway_workspace *new_ws = seat_get_focused_workspace(seat); struct sway_workspace *new_ws = seat_get_focused_workspace(seat);
@ -141,6 +152,9 @@ void root_scratchpad_show(struct sway_container *con) {
} }
workspace_add_floating(new_ws, con); workspace_add_floating(new_ws, con);
// Set minimize state to normalized
root_handle_container(con, true);
// Make sure the container's center point overlaps this workspace // Make sure the container's center point overlaps this workspace
double center_lx = con->pending.x + con->pending.width / 2; double center_lx = con->pending.x + con->pending.width / 2;
double center_ly = con->pending.y + con->pending.height / 2; double center_ly = con->pending.y + con->pending.height / 2;
@ -172,6 +186,9 @@ void root_scratchpad_hide(struct sway_container *con) {
return; return;
} }
// Set minimize state to minimized
root_handle_container(con, false);
disable_fullscreen(con, NULL); disable_fullscreen(con, NULL);
container_for_each_child(con, disable_fullscreen, NULL); container_for_each_child(con, disable_fullscreen, NULL);
container_detach(con); container_detach(con);