aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.def.h1
-rw-r--r--dwl.c30
2 files changed, 31 insertions, 0 deletions
diff --git a/config.def.h b/config.def.h
index 41b652f..e9ced7c 100644
--- a/config.def.h
+++ b/config.def.h
@@ -59,6 +59,7 @@ static const Key keys[] = {
{ MODKEY, XKB_KEY_d, incnmaster, {.i = -1} },
{ MODKEY, XKB_KEY_h, setmfact, {.f = -0.05} },
{ MODKEY, XKB_KEY_l, setmfact, {.f = +0.05} },
+ { MODKEY, XKB_KEY_Return, zoom, {0} },
{ MODKEY, XKB_KEY_Tab, view, {0} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_c, killclient, {0} },
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
diff --git a/dwl.c b/dwl.c
index e4ab735..b5478a7 100644
--- a/dwl.c
+++ b/dwl.c
@@ -211,6 +211,7 @@ static void unmapnotify(struct wl_listener *listener, void *data);
static void view(const Arg *arg);
static Client *xytoclient(double x, double y);
static Monitor *xytomon(double x, double y);
+static void zoom(const Arg *arg);
/* variables */
static const char broken[] = "broken";
@@ -1636,6 +1637,35 @@ xytomon(double x, double y)
return o ? o->data : NULL;
}
+void
+zoom(const Arg *arg)
+{
+ unsigned int n = 0;
+ Client *c, *sel = selclient();
+
+ if (!sel || !selmon->lt[selmon->sellt]->arrange || sel->isfloating)
+ return;
+
+ wl_list_for_each(c, &clients, link)
+ if (VISIBLEON(c, selmon) && !c->isfloating) {
+ if (++n == 1 && c == sel)
+ sel = NULL;
+ else if (n == 2) {
+ if (!sel)
+ sel = c;
+ break;
+ }
+ }
+
+ if (n == 1)
+ return;
+
+ wl_list_remove(&sel->link);
+ wl_list_insert(&clients, &sel->link);
+ focusclient(sel, NULL, 1);
+ arrange(selmon);
+}
+
int
main(int argc, char *argv[])
{