diff --git a/patches/alwaysontop/README.md b/patches/alwaysontop/README.md new file mode 100644 index 0000000..8c16475 --- /dev/null +++ b/patches/alwaysontop/README.md @@ -0,0 +1,9 @@ +## Description +Choose multiple/one floating window to be always-on-top - this prevents other floating windows from being raised above it. Useful for playing films, etc. +this builds against tag 0.9 and also against commit 1dae5ba3ed. +### Download +- [2026-09-17](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/ontop/ontop.patch) +### Author +- [killertofus](https://codeberg.org/killertofus) +killertofus irc/matrix +with help from kana \ No newline at end of file diff --git a/patches/alwaysontop/ontop.patch b/patches/alwaysontop/ontop.patch new file mode 100644 index 0000000..7919422 --- /dev/null +++ b/patches/alwaysontop/ontop.patch @@ -0,0 +1,99 @@ +diff --git a/config.def.h b/config.def.h +index 13c5322..0af77b2 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -137,6 +137,7 @@ static const Key keys[] = { + { MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XKB_KEY_space, setlayout, {0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} }, ++ { MODKEY|WLR_MODIFIER_ALT, XKB_KEY_space, togglealwaysontop, {0} }, + { MODKEY, XKB_KEY_e, togglefullscreen, {0} }, + { MODKEY, XKB_KEY_0, view, {.ui = ~0} }, + { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_0, tag, {.ui = ~0} }, +diff --git a/dwl.c b/dwl.c +index c51e0d5..a6c9a05 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -88,7 +88,7 @@ + /* enums */ + enum { CurNormal, CurPressed, CurMove, CurResize }; /* cursor */ + enum { XDGShell, LayerShell, X11 }; /* client types */ +-enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrTop, LyrFS, LyrUnmanaged, LyrOverlay, ++enum { LyrBg, LyrBottom, LyrTile, LyrFloat, LyrAlwaysTop, LyrTop, LyrFS, LyrUnmanaged, LyrOverlay, + LyrIMPopup, LyrBlock, NUM_LAYERS }; /* scene layers */ + enum { AxisUp, AxisRight, AxisDown, AxisLeft }; + +@@ -158,7 +158,7 @@ typedef struct { + #endif + unsigned int bw; + uint32_t tags; +- int isfloating, isurgent, isfullscreen; ++ int isfloating, isurgent, isfullscreen, isalwaysontop; + } Client; + + typedef struct { +@@ -355,6 +355,7 @@ static void startdrag(struct wl_listener *listener, void *data); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *m); ++static void togglealwaysontop(const Arg *arg); + static void togglefloating(const Arg *arg); + static void togglefullscreen(const Arg *arg); + static void toggletag(const Arg *arg); +@@ -565,7 +566,7 @@ arrange(Monitor *m) + /* We move all clients (except fullscreen and unmanaged) to LyrTile while + * in floating layout to avoid "real" floating clients be always on top */ + wl_list_for_each(c, &clients, link) { +- if (c->mon != m || c->scene->node.parent == layers[LyrFS]) ++ if (c->mon != m || c->scene->node.parent == layers[LyrFS] || c->isalwaysontop) + continue; + + wlr_scene_node_reparent(&c->scene->node, +@@ -2487,7 +2488,8 @@ setfloating(Client *c, int floating) + return; + wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen || + (p && p->isfullscreen) ? LyrFS +- : c->isfloating ? LyrFloat : LyrTile]); ++ : c->isfloating ? (c->isalwaysontop ? LyrAlwaysTop : LyrFloat) : LyrTile]); ++ + arrange(c->mon); + printstatus(); + } +@@ -2501,7 +2503,8 @@ setfullscreen(Client *c, int fullscreen) + c->bw = fullscreen ? 0 : borderpx; + client_set_fullscreen(c, fullscreen); + wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen +- ? LyrFS : c->isfloating ? LyrFloat : LyrTile]); ++ ? LyrFS : c->isfloating ? (c->isalwaysontop ? LyrAlwaysTop : LyrFloat) : LyrTile]); ++ + + if (fullscreen) { + c->prev = c->geom; +@@ -2515,6 +2518,27 @@ setfullscreen(Client *c, int fullscreen) + printstatus(); + } + ++void ++togglealwaysontop(const Arg *arg) ++{ ++ Client *sel = focustop(selmon); ++ if (!sel) ++ return; ++ ++ if (sel->isfullscreen) ++ return; ++ ++ if (sel->isalwaysontop) { ++ wlr_scene_node_reparent(&sel->scene->node, layers[sel->isalwaysontop]); ++ sel->isalwaysontop = 0; ++ } else { ++ sel->isalwaysontop = sel->isfullscreen ? LyrFS : LyrTile; ++ wlr_scene_node_reparent(&sel->scene->node, layers[LyrAlwaysTop]); ++ } ++ arrange(selmon); ++} ++ ++ + void + setlayout(const Arg *arg) + {