dotfiles/.config/dwl/patch/cyclelayouts.patch

69 lines
2.5 KiB
Diff

From 8510cd247ad288e63ac346539ed75320c407897d Mon Sep 17 00:00:00 2001
From: Vladislav Nepogodin <nepogodin.vlad@gmail.com>
Date: Tue, 27 Jul 2021 23:01:45 +0400
Subject: [PATCH] Function to cycle through available layouts.
---
config.def.h | 3 +++
dwl.c | 19 +++++++++++++++++++
2 files changed, 22 insertions(+)
diff --git a/config.def.h b/config.def.h
index 089aa379..1c6a1331 100644
--- a/config.def.h
+++ b/config.def.h
@@ -22,6 +22,7 @@ static const Layout layouts[] = {
{ "[]=", tile },
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
+ { NULL, NULL },
};
/* monitors
@@ -82,6 +83,8 @@ static const Key keys[] = {
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
{ MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} },
{ MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} },
+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_comma, cyclelayout, {.i = -1 } },
+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_period, cyclelayout, {.i = +1 } },
{ MODKEY, XKB_KEY_space, setlayout, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} },
{ MODKEY, XKB_KEY_e, togglefullscreen, {0} },
diff --git a/dwl.c b/dwl.c
index a2a0b692..bc6e76b5 100644
--- a/dwl.c
+++ b/dwl.c
@@ -232,6 +232,7 @@ static void createnotify(struct wl_listener *listener, void *data);
static void createlayersurface(struct wl_listener *listener, void *data);
static void createpointer(struct wlr_input_device *device);
static void cursorframe(struct wl_listener *listener, void *data);
+static void cyclelayout(const Arg *arg);
static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
static void destroynotify(struct wl_listener *listener, void *data);
static Monitor *dirtomon(enum wlr_direction dir);
@@ -971,6 +972,24 @@ cursorframe(struct wl_listener *listener, void *data)
wlr_seat_pointer_notify_frame(seat);
}
+void
+cyclelayout(const Arg *arg)
+{
+ Layout *l;
+ for (l = (Layout *)layouts; l != selmon->lt[selmon->sellt]; l++);
+ if (arg->i > 0) {
+ if (l->symbol && (l + 1)->symbol)
+ setlayout(&((Arg) { .v = (l + 1) }));
+ else
+ setlayout(&((Arg) { .v = layouts }));
+ } else {
+ if (l != layouts && (l - 1)->symbol)
+ setlayout(&((Arg) { .v = (l - 1) }));
+ else
+ setlayout(&((Arg) { .v = &layouts[LENGTH(layouts) - 2] }));
+ }
+}
+
void
destroylayersurfacenotify(struct wl_listener *listener, void *data)
{