diff --git a/patches/focusdir/README.md b/patches/focusdir/README.md index a2ed478..65315c0 100644 --- a/patches/focusdir/README.md +++ b/patches/focusdir/README.md @@ -2,8 +2,9 @@ Focus the window to the left, right, above or below the current focused window ### Download -- [git branch](https://codeberg.org/ldev105/dwl/src/branch/focusdir) -- [2023-01-22](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/focusdir/focusdir.patch) +- [0.9](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/focusdir/focusdir-0.9.patch.patch) +- [main 2026-09-29](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/focusdir/focusdir-wlroots-next-4fd683c.patch) ### Authors +- [pi66](https://codeberg.org/pi66) - [ldev105](https://codeberg.org/ldev105) diff --git a/patches/focusdir/focusdir.patch b/patches/focusdir/focusdir-0.9.patch similarity index 55% rename from patches/focusdir/focusdir.patch rename to patches/focusdir/focusdir-0.9.patch index 72b8c5a..5134c31 100644 --- a/patches/focusdir/focusdir.patch +++ b/patches/focusdir/focusdir-0.9.patch @@ -1,7 +1,7 @@ -From a0e71a687b7fcaebdaf1da80c09bf5563bff46b1 Mon Sep 17 00:00:00 2001 -From: ldev -Date: Mon, 12 Feb 2024 21:50:24 +0100 -Subject: [PATCH] focusdir +From 2b10cf7ae87f119627260ec5a17147593697b734 Mon Sep 17 00:00:00 2001 +From: pi66 +Date: Tue, 29 Sep 2026 12:15:43 +0100 +Subject: [PATCH] focusdir: update for dwl v0.9 and wlroots-next-4fd683c --- config.def.h | 4 ++++ @@ -9,22 +9,22 @@ Subject: [PATCH] focusdir 2 files changed, 49 insertions(+) diff --git a/config.def.h b/config.def.h -index 9009517..2a1a82e 100644 +index 13c5322..d81f9cd 100644 --- a/config.def.h +++ b/config.def.h -@@ -124,6 +124,10 @@ static const Key keys[] = { - { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, - { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, - { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_h, focusdir, {.ui = 0} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_l, focusdir, {.ui = 1} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_k, focusdir, {.ui = 2} }, -+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_j, focusdir, {.ui = 3} }, - { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, - { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, - { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, +@@ -125,6 +125,10 @@ static const Key keys[] = { + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, + { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, + { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_h, focusdir, {.ui = 0} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_l, focusdir, {.ui = 1} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_k, focusdir, {.ui = 2} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_j, focusdir, {.ui = 3} }, + { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, + { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, + { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, diff --git a/dwl.c b/dwl.c -index bf02a6d..64d5de7 100644 +index 4cfd0fd..acab367 100644 --- a/dwl.c +++ b/dwl.c @@ -1,6 +1,7 @@ @@ -34,29 +34,30 @@ index bf02a6d..64d5de7 100644 +#include #include #include - #include -@@ -268,6 +269,7 @@ static Monitor *dirtomon(enum wlr_direction dir); + #include +@@ -306,6 +307,7 @@ static Monitor *dirtomon(enum wlr_direction dir); static void focusclient(Client *c, int lift); static void focusmon(const Arg *arg); static void focusstack(const Arg *arg); +static void focusdir(const Arg *arg); static Client *focustop(Monitor *m); static void fullscreennotify(struct wl_listener *listener, void *data); - static void handlesig(int signo); -@@ -1271,6 +1273,49 @@ focusstack(const Arg *arg) + static void gpureset(struct wl_listener *listener, void *data); +@@ -1624,6 +1626,49 @@ focusstack(const Arg *arg) focusclient(c, 1); } +void focusdir(const Arg *arg) +{ + /* Focus the left, right, up, down client relative to the current focused client on selmon */ -+ Client *c, *sel = focustop(selmon); -+ if (!sel || sel->isfullscreen) -+ return; -+ + int dist=INT_MAX; ++ Client *c, *sel = focustop(selmon); + Client *newsel = NULL; + int newdist=INT_MAX; ++ ++ if (!sel || sel->isfullscreen) ++ return; ++ + wl_list_for_each(c, &clients, link) { + if (!VISIBLEON(c, selmon)) + continue; /* skip non visible windows */ @@ -89,10 +90,9 @@ index bf02a6d..64d5de7 100644 + } +} + -+ - /* We probably should change the name of this, it sounds like + /* We probably should change the name of this: it sounds like it * will focus the topmost client of this mon, when actually will * only return that client */ -- -2.43.0 +2.55.0 diff --git a/patches/focusdir/focusdir-wlroots-next-4fd683c.patch b/patches/focusdir/focusdir-wlroots-next-4fd683c.patch new file mode 100644 index 0000000..09fcbdc --- /dev/null +++ b/patches/focusdir/focusdir-wlroots-next-4fd683c.patch @@ -0,0 +1,98 @@ +From 552608256fdd2fcc0a0654651b5ee345b6fb9718 Mon Sep 17 00:00:00 2001 +From: pi66 +Date: Tue, 29 Sep 2026 12:09:59 +0100 +Subject: [PATCH] focusdir: update for dwl v0.9 and wlroots-next-4fd683c + +--- + config.def.h | 4 ++++ + dwl.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 49 insertions(+) + +diff --git a/config.def.h b/config.def.h +index a4019d3..c36bd6e 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -125,6 +125,10 @@ static const Key keys[] = { + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Return, spawn, {.v = termcmd} }, + { MODKEY, XKB_KEY_j, focusstack, {.i = +1} }, + { MODKEY, XKB_KEY_k, focusstack, {.i = -1} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_h, focusdir, {.ui = 0} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_l, focusdir, {.ui = 1} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_k, focusdir, {.ui = 2} }, ++ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_j, focusdir, {.ui = 3} }, + { MODKEY, XKB_KEY_i, incnmaster, {.i = +1} }, + { MODKEY, XKB_KEY_d, incnmaster, {.i = -1} }, + { MODKEY, XKB_KEY_h, setmfact, {.f = -0.05f} }, +diff --git a/dwl.c b/dwl.c +index 26fb3a0..4f66a63 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -1,6 +1,7 @@ + /* + * See LICENSE file for copyright and license details. + */ ++#include + #include + #include + #include +@@ -308,6 +309,7 @@ static Monitor *dirtomon(enum wlr_direction dir); + static void focusclient(Client *c, LayerSurface *l, int lift); + static void focusmon(const Arg *arg); + static void focusstack(const Arg *arg); ++static void focusdir(const Arg *arg); + static Client *focustop(Monitor *m); + static void fullscreennotify(struct wl_listener *listener, void *data); + static void gpureset(struct wl_listener *listener, void *data); +@@ -1632,6 +1634,49 @@ focusstack(const Arg *arg) + focusclient(c, NULL, 1); + } + ++void focusdir(const Arg *arg) ++{ ++ /* Focus the left, right, up, down client relative to the current focused client on selmon */ ++ int dist=INT_MAX; ++ Client *c, *sel = focustop(selmon); ++ Client *newsel = NULL; ++ int newdist=INT_MAX; ++ ++ if (!sel || sel->isfullscreen) ++ return; ++ ++ wl_list_for_each(c, &clients, link) { ++ if (!VISIBLEON(c, selmon)) ++ continue; /* skip non visible windows */ ++ ++ if (arg->ui == 0 && sel->geom.x <= c->geom.x) { ++ /* Client isn't on our left */ ++ continue; ++ } ++ if (arg->ui == 1 && sel->geom.x >= c->geom.x) { ++ /* Client isn't on our right */ ++ continue; ++ } ++ if (arg->ui == 2 && sel->geom.y <= c->geom.y) { ++ /* Client isn't above us */ ++ continue; ++ } ++ if (arg->ui == 3 && sel->geom.y >= c->geom.y) { ++ /* Client isn't below us */ ++ continue; ++ } ++ ++ dist=abs(sel->geom.x-c->geom.x)+abs(sel->geom.y-c->geom.y); ++ if (dist < newdist){ ++ newdist = dist; ++ newsel=c; ++ } ++ } ++ if (newsel != NULL){ ++ focusclient(newsel, NULL, 1); ++ } ++} ++ + /* We probably should change the name of this: it sounds like it + * will focus the topmost client of this mon, when actually will + * only return that client */ +-- +2.55.0 +