diff --git a/config.def.h b/config.def.h index 5dc9b0a..fddecb9 100644 --- a/config.def.h +++ b/config.def.h @@ -36,6 +36,7 @@ static const Layout layouts[] = { { "[]=", tile }, { "><>", NULL }, /* no layout function means floating behavior */ { "[M]", monocle }, + { NULL, NULL }, }; /* monitors @@ -149,6 +150,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 f3bc6b6..cee8155 100644 --- a/dwl.c +++ b/dwl.c @@ -280,6 +280,7 @@ static void createpointerconstraint(struct wl_listener *listener, void *data); static void cursorconstrain(struct wlr_pointer_constraint_v1 *constraint); static void cursorframe(struct wl_listener *listener, void *data); static void cursorwarptoconstrainthint(void); +static void cyclelayout(const Arg *arg); static void destroydragicon(struct wl_listener *listener, void *data); static void destroyidleinhibitor(struct wl_listener *listener, void *data); static void destroylayersurfacenotify(struct wl_listener *listener, void *data); @@ -1324,6 +1325,24 @@ cursorwarptoconstrainthint(void) } } +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 destroydragicon(struct wl_listener *listener, void *data) {