summaryrefslogtreecommitdiff
path: root/sway/desktop
diff options
context:
space:
mode:
Diffstat (limited to 'sway/desktop')
-rw-r--r--sway/desktop/xdg_shell.c27
-rw-r--r--sway/desktop/xwayland.c22
2 files changed, 49 insertions, 0 deletions
diff --git a/sway/desktop/xdg_shell.c b/sway/desktop/xdg_shell.c
index 8da922d5..2d79727d 100644
--- a/sway/desktop/xdg_shell.c
+++ b/sway/desktop/xdg_shell.c
@@ -332,6 +332,24 @@ static void handle_request_maximize(struct wl_listener *listener, void *data) {
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) {
struct sway_xdg_shell_view *xdg_shell_view =
wl_container_of(listener, xdg_shell_view, request_fullscreen);
@@ -406,6 +424,9 @@ static void handle_unmap(struct wl_listener *listener, void *data) {
wl_list_remove(&xdg_shell_view->commit.link);
wl_list_remove(&xdg_shell_view->new_popup.link);
wl_list_remove(&xdg_shell_view->request_maximize.link);
+ if (xdg_shell_view->request_minimize.notify) {
+ 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_move.link);
wl_list_remove(&xdg_shell_view->request_resize.link);
@@ -458,6 +479,12 @@ static void handle_map(struct wl_listener *listener, void *data) {
wl_signal_add(&toplevel->events.request_maximize,
&xdg_shell_view->request_maximize);
+ if (config->scratchpad_minimize) {
+ 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;
wl_signal_add(&toplevel->events.request_fullscreen,
&xdg_shell_view->request_fullscreen);
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index e15a3341..55a14c0b 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -575,6 +575,7 @@ static void handle_request_fullscreen(struct wl_listener *listener, void *data)
transaction_commit_dirty();
}
+/* Minimize to scratchpad */
static void handle_request_minimize(struct wl_listener *listener, void *data) {
struct sway_xwayland_view *xwayland_view =
wl_container_of(listener, xwayland_view, request_minimize);
@@ -585,6 +586,27 @@ static void handle_request_minimize(struct wl_listener *listener, void *data) {
}
struct wlr_xwayland_minimize_event *e = data;
+ if (config->scratchpad_minimize) {
+ struct sway_container *container = view->container;
+ if (!container->pending.workspace) {
+ 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);
+ }
+ } else {
+ if(container->scratchpad) {
+ root_scratchpad_show(container);
+ }
+ }
+ transaction_commit_dirty();
+ return;
+ }
struct sway_seat *seat = input_manager_current_seat();
bool focused = seat_get_focus(seat) == &view->container->node;
wlr_xwayland_surface_set_minimized(xsurface, !focused && e->minimize);