Compare commits

...

4 Commits

Author SHA1 Message Date
André Desgualdo Pereira
9506523f32 add focus on urgent patch 2025-10-29 09:12:39 -03:00
André Desgualdo Pereira
0a6759e881 decklayout fixes 2025-10-29 02:48:07 +01:00
Zuki Air
3f25b6c7d4 riverctl: add support for changing border colors via dwlctl, and fix bug with changing borderpx not applying 2025-10-26 14:24:20 +00:00
Fernando Otto
4263f5be4d Fix: Fixing disconnect with the graphics tablet 2025-10-14 13:13:03 -03:00
7 changed files with 253 additions and 40 deletions

View File

@ -0,0 +1,9 @@
### Description
Deck is a dwl-layout which is inspired by the dwm Deck layout (which is inspired by TTWM window manager). It applies the monocle-layout to the clients in the stack. The master-client is still visible. The stacked clients are like a deck of cards, hence the name.
### Download
- [git branch](https://codeberg.org/Kana/dwl/src/branch/decklayout)
- [main 2025-10-08](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/decklayout/decklayout.patch)
### Authors
- [André Desgualdo Pereira](https://codeberg.org/Kana)

View File

@ -0,0 +1,112 @@
From 095439425e64f2567f141d5d941178b148ef0d3a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Desgualdo=20Pereira?= <desgua@gmail.com>
Date: Sun, 12 Oct 2025 11:44:26 -0300
Subject: [PATCH] decklayout
---
config.def.h | 2 ++
dwl.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 63 insertions(+)
diff --git a/config.def.h b/config.def.h
index 95c2afa..cc846eb 100644
--- a/config.def.h
+++ b/config.def.h
@@ -34,6 +34,7 @@ static const Layout layouts[] = {
{ "[]=", tile },
{ "><>", NULL }, /* no layout function means floating behavior */
{ "[M]", monocle },
+ { "[E]", deck },
};
/* monitors */
@@ -139,6 +140,7 @@ 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, XKB_KEY_a, setlayout, {.v = &layouts[3]} },
{ 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 12f441e..227004f 100644
--- a/dwl.c
+++ b/dwl.c
@@ -278,6 +278,7 @@ static void destroylayersurfacenotify(struct wl_listener *listener, void *data);
static void destroylock(SessionLock *lock, int unlocked);
static void destroylocksurface(struct wl_listener *listener, void *data);
static void destroynotify(struct wl_listener *listener, void *data);
+static void deck(Monitor *m);
static void destroypointerconstraint(struct wl_listener *listener, void *data);
static void destroysessionlock(struct wl_listener *listener, void *data);
static void destroykeyboardgroup(struct wl_listener *listener, void *data);
@@ -1837,6 +1838,66 @@ monocle(Monitor *m)
wlr_scene_node_raise_to_top(&c->scene->node);
}
+void
+deck(Monitor *m)
+{
+ unsigned int mw, my;
+ int i, n = 0;
+ Client *c;
+
+ /* count tiled clients */
+ wl_list_for_each(c, &clients, link)
+
+ /* if (VISIBLEON(c, m) && !c->isfloating && !c->isfullscreen) */
+ if (VISIBLEON(c, m) && !c->isfloating)
+ n++;
+ if (n == 0)
+ return;
+
+ /* set master width */
+ if (n > m->nmaster)
+ mw = m->nmaster ? (int)roundf(m->w.width * m->mfact) : 0;
+ else
+ mw = m->w.width;
+
+ /* update layout symbol with number of stack windows */
+ /* use the following rules to count only the windows on the deck
+ if (n > m->nmaster)
+ snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n - m->nmaster);
+ else
+ snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); */
+
+ /* or this one to count all windows on the tag */
+ snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
+
+ i = my = 0;
+ wl_list_for_each(c, &clients, link) {
+ /* if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen) */
+ if (!VISIBLEON(c, m) || c->isfloating)
+ continue;
+
+ if (i < m->nmaster) {
+ /* master clients */
+ resize(c, (struct wlr_box){
+ .x = m->w.x,
+ .y = m->w.y + my,
+ .width = mw,
+ .height = (m->w.height - my) / (MIN(n, m->nmaster) - i)
+ }, 0);
+ my += c->geom.height;
+ } else {
+ /* deck clients: overlap in stack area */
+ resize(c, (struct wlr_box){
+ .x = m->w.x + mw,
+ .y = m->w.y,
+ .width = m->w.width - mw,
+ .height = m->w.height
+ }, 0);
+ }
+ i++;
+ }
+}
+
void
motionabsolute(struct wl_listener *listener, void *data)
{
--
2.51.0

View File

@ -0,0 +1,14 @@
### Description
By default, dwl responds to client requests to client messages by setting the urgency bit on the named window.
This patch changes the focus to the window instead.
Both behaviours are legitimate according to the cursed spec.
This is the approximately the equivalent of the focusonactive patch of dwm.
If you want a more controlled behavior, for example setting which clients can focus, check [activation-rule patch](https://codeberg.org/sevz/dwl-patches/src/branch/activation-rules).
### Download
- [git branch](https://codeberg.org/Kana/dwl/src/branch/focusonurgent)
- [main 2025-10-08](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/focusonurgent/focusonurgent.patch)
### Authors
- [André Desgualdo Pereira](https://codeberg.org/Kana)

View File

@ -0,0 +1,29 @@
From 3613d9a6342fc85279a79ba203f25ff39fc0d8e4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Desgualdo=20Pereira?= <desgua@gmail.com>
Date: Wed, 29 Oct 2025 09:06:00 -0300
Subject: [PATCH] add focusonurgent patch
---
dwl.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/dwl.c b/dwl.c
index 12f441e..5620f66 100644
--- a/dwl.c
+++ b/dwl.c
@@ -2097,8 +2097,10 @@ printstatus(void)
if (c->mon != m)
continue;
occ |= c->tags;
- if (c->isurgent)
- urg |= c->tags;
+ if (c->isurgent) {
+ view(&((Arg){ .ui = c->tags }));
+ focusclient(c, 1);
+ }
}
if ((c = focustop(m))) {
printf("%s title %s\n", m->wlr_output->name, client_get_title(c));
--
2.51.0

View File

@ -1,17 +1,20 @@
From 735440660fd2bccdde982f9c3d758e189ba35e40 Mon Sep 17 00:00:00 2001
From 672df57ab7d5b52f91a712eaf3954d580cdf8ba3 Mon Sep 17 00:00:00 2001
From: Zuki Air <zukirust@gmail.com>
Date: Thu, 7 Aug 2025 13:19:59 +0100
Subject: [PATCH] riverctl patch
make setborderpx apply instantly
add setting border colors via dwlctl
---
.gitignore | 1 +
Makefile | 22 +-
config.def.h | 36 +-
config.def.h | 42 +-
dwl.c | 47 +-
dwlctl.c | 133 +++++
dwlctl.c | 133 ++++
protocols/river-control-unstable-v1.xml | 85 +++
river-control.h | 753 ++++++++++++++++++++++++
7 files changed, 1055 insertions(+), 22 deletions(-)
river-control.h | 789 ++++++++++++++++++++++++
7 files changed, 1094 insertions(+), 25 deletions(-)
create mode 100644 dwlctl.c
create mode 100644 protocols/river-control-unstable-v1.xml
create mode 100644 river-control.h
@ -75,18 +78,25 @@ index 578194f..029dfad 100644
dist: clean
mkdir -p dwl-$(VERSION)
diff --git a/config.def.h b/config.def.h
index 95c2afa..72afbd6 100644
index 95c2afa..ccc3edb 100644
--- a/config.def.h
+++ b/config.def.h
@@ -6,7 +6,7 @@
@@ -6,11 +6,11 @@
/* appearance */
static const int sloppyfocus = 1; /* focus follows mouse */
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
-static const unsigned int borderpx = 1; /* border pixel of windows */
+static unsigned int borderpx = 1; /* border pixel of windows */
static const float rootcolor[] = COLOR(0x222222ff);
static const float bordercolor[] = COLOR(0x444444ff);
static const float focuscolor[] = COLOR(0x005577ff);
-static const float bordercolor[] = COLOR(0x444444ff);
-static const float focuscolor[] = COLOR(0x005577ff);
-static const float urgentcolor[] = COLOR(0xff0000ff);
+static float bordercolor[] = COLOR(0x444444ff);
+static float focuscolor[] = COLOR(0x005577ff);
+static float urgentcolor[] = COLOR(0xff0000ff);
/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */
static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You can also use glsl colors */
@@ -21,7 +21,14 @@ static const float fullscreen_bg[] = {0.0f, 0.0f, 0.0f, 1.0f}; /* You ca
static int log_level = WLR_ERROR;
@ -480,10 +490,10 @@ index 0000000..aa5fc4d
+</protocol>
diff --git a/river-control.h b/river-control.h
new file mode 100644
index 0000000..59561b6
index 0000000..599cffe
--- /dev/null
+++ b/river-control.h
@@ -0,0 +1,753 @@
@@ -0,0 +1,789 @@
+#include "river-control-unstable-v1-private-protocol.c"
+#include "river-control-unstable-v1-protocol.h"
+#ifdef KEYS_USED
@ -495,6 +505,9 @@ index 0000000..59561b6
+void clear_rules(const Arg*);
+void clear_binds(const Arg*);
+void setborderpx(const Arg*);
+void setfocuscolor(const Arg*);
+void setbordercolor(const Arg*);
+void seturgentcolor(const Arg*);
+struct wl_list arg_str_store;
+struct wl_list rule_str_store;
+struct wl_list rules_list;
@ -534,6 +547,7 @@ index 0000000..59561b6
+ FUNC_STR_ARG_TYPE_INT,
+ FUNC_STR_ARG_TYPE_UINT,
+ FUNC_STR_ARG_TYPE_FLOAT,
+ FUNC_STR_ARG_TYPE_COLOR,
+ FUNC_STR_ARG_TYPE_STRING_ARRAY,
+ FUNC_STR_ARG_TYPE_WLR_DIRECTION,
+ FUNC_STR_ARG_TYPE_LAYOUT,
@ -552,6 +566,9 @@ index 0000000..59561b6
+ { enter_mode, FUNC_STR_ARG_TYPE_STRING_ARRAY, "enter-mode"},
+ { oneshot_mode, FUNC_STR_ARG_TYPE_STRING_ARRAY, "oneshot-mode"},
+ { create_mode_user, FUNC_STR_ARG_TYPE_STRING_ARRAY, "create-mode"},
+ STR(setfocuscolor,FUNC_STR_ARG_TYPE_COLOR),
+ STR(setbordercolor,FUNC_STR_ARG_TYPE_COLOR),
+ STR(seturgentcolor,FUNC_STR_ARG_TYPE_COLOR),
+ STR(setborderpx,FUNC_STR_ARG_TYPE_UINT),
+ STR(setlayout,FUNC_STR_ARG_TYPE_LAYOUT),
+ STR(spawn,FUNC_STR_ARG_TYPE_STRING_ARRAY),
@ -641,10 +658,36 @@ index 0000000..59561b6
+
+void setborderpx(const Arg *arg) {
+ Client *c;
+ Monitor *m;
+ borderpx = arg->ui;
+ wl_list_for_each(c, &clients, link) {
+ c->bw = borderpx;
+ }
+ wl_list_for_each(m, &mons,link) {
+ arrange(m);
+ }
+}
+
+void setfocuscolor(const Arg *arg) {
+ const float color[4] = COLOR(arg->i);
+ int i;
+ for (i = 0; i < 4; i++) {
+ focuscolor[i] = color[i];
+ }
+}
+void setbordercolor(const Arg *arg) {
+ const float color[4] = COLOR(arg->i);
+ int i;
+ for (i = 0; i < 4; i++) {
+ bordercolor[i] = color[i];
+ }
+}
+void seturgentcolor(const Arg *arg) {
+ const float color[4] = COLOR(arg->i);
+ int i;
+ for (i = 0; i < 4; i++) {
+ urgentcolor[i] = color[i];
+ }
+}
+
+void zriver_control_destroy(struct wl_client *client,
@ -1098,7 +1141,10 @@ index 0000000..59561b6
+ args->error = true;
+ args->error_msg = zriver_error_out_of_range;
+ }
+
+ break;
+ case(FUNC_STR_ARG_TYPE_COLOR):
+ arg->i = strtol(argument,NULL,16);
+ break;
+ }
+ }
+ args->argc++;
@ -1238,5 +1284,5 @@ index 0000000..59561b6
+ zriver_arg_list_resource, zriver_control_handle_destory);
+}
--
2.49.1
2.51.0

View File

@ -1,16 +1,16 @@
From e504dc0fccfc3994962f03dc824d8907c6afc64f Mon Sep 17 00:00:00 2001
From: choc <notchoc@proton.me>
Date: Sat, 4 May 2024 01:16:12 +0800
Subject: [PATCH] implement wlr-tablet-v2
From 9221dab35862605bd8768652488f8d6211f15a3e Mon Sep 17 00:00:00 2001
From: Fernando Otto <fernandootto369@gmail.com>
Date: Tue, 14 Oct 2025 12:52:30 -0300
Subject: [PATCH] Fixing disconnect with the graphics tablet
---
Makefile | 6 +-
config.def.h | 1 +
dwl.c | 224 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 230 insertions(+), 1 deletion(-)
dwl.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 232 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index f955e7b..ce1b556 100644
index 3358bae..47a2bb2 100644
--- a/Makefile
+++ b/Makefile
@@ -21,7 +21,8 @@ dwl: dwl.o util.o
@ -46,7 +46,7 @@ index 22d2171..3ad98ef 100644
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
static const unsigned int borderpx = 1; /* border pixel of windows */
diff --git a/dwl.c b/dwl.c
index ac9c36b..b8d129f 100644
index a2711f6..97d3d53 100644
--- a/dwl.c
+++ b/dwl.c
@@ -50,6 +50,9 @@
@ -132,13 +132,15 @@ index ac9c36b..b8d129f 100644
void
cursorconstrain(struct wlr_pointer_constraint_v1 *constraint)
{
@@ -1321,6 +1362,27 @@ destroykeyboardgroup(struct wl_listener *listener, void *data)
@@ -1320,6 +1361,29 @@ destroykeyboardgroup(struct wl_listener *listener, void *data)
free(group);
}
+void
+destroytablet(struct wl_listener *listener, void *data)
+{
+ wl_list_remove(&tablet_device_destroy.link);
+ wlr_cursor_detach_input_device(cursor, tablet->wlr_device);
+ tablet = NULL;
+}
+
@ -160,7 +162,7 @@ index ac9c36b..b8d129f 100644
Monitor *
dirtomon(enum wlr_direction dir)
{
@@ -1540,6 +1602,12 @@ inputdevice(struct wl_listener *listener, void *data)
@@ -1539,6 +1603,12 @@ inputdevice(struct wl_listener *listener, void *data)
case WLR_INPUT_DEVICE_POINTER:
createpointer(wlr_pointer_from_input_device(device));
break;
@ -173,7 +175,7 @@ index ac9c36b..b8d129f 100644
default:
/* TODO handle other input device types */
break;
@@ -2567,6 +2635,8 @@ setup(void)
@@ -2566,6 +2636,8 @@ setup(void)
relative_pointer_mgr = wlr_relative_pointer_manager_v1_create(dpy);
@ -182,7 +184,7 @@ index ac9c36b..b8d129f 100644
/*
* Creates a cursor, which is a wlroots utility for tracking the cursor
* image shown on screen.
@@ -2596,6 +2666,10 @@ setup(void)
@@ -2595,6 +2667,10 @@ setup(void)
LISTEN_STATIC(&cursor->events.button, buttonpress);
LISTEN_STATIC(&cursor->events.axis, axisnotify);
LISTEN_STATIC(&cursor->events.frame, cursorframe);
@ -193,7 +195,7 @@ index ac9c36b..b8d129f 100644
cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1);
LISTEN_STATIC(&cursor_shape_mgr->events.request_set_shape, setcursorshape);
@@ -2689,6 +2763,156 @@ tagmon(const Arg *arg)
@@ -2688,6 +2764,156 @@ tagmon(const Arg *arg)
setmon(sel, dirtomon(arg->i), 0);
}
@ -351,5 +353,5 @@ index ac9c36b..b8d129f 100644
tile(Monitor *m)
{
--
2.43.0
2.51.0

View File

@ -1,14 +1,13 @@
From dd0abf07f9f3e456428b07e442b87578128da310 Mon Sep 17 00:00:00 2001
From: A Frederick Christensen <dwl@ivories.org>
Date: Sat, 17 May 2025 23:26:15 -0500
Subject: [PATCH] Add tablet input
From f639289974285207be396eac085cce6a316294c0 Mon Sep 17 00:00:00 2001
From: Fernando Otto <fernandootto369@gmail.com>
Date: Tue, 14 Oct 2025 12:20:37 -0300
Subject: [PATCH] Fixing disconnect with the graphics tablet
Signed-off-by: Aldrik Dunbar <aldrik@gmail.com>
---
Makefile | 6 +-
config.def.h | 1 +
dwl.c | 238 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 244 insertions(+), 1 deletion(-)
dwl.c | 240 +++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 246 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index 578194f..e0d1835 100644
@ -47,7 +46,7 @@ index 95c2afa..1f06356 100644
static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will disable idle tracking even if it's surface isn't visible */
static const unsigned int borderpx = 1; /* border pixel of windows */
diff --git a/dwl.c b/dwl.c
index 12f441e..1f3b325 100644
index 12f441e..43566fe 100644
--- a/dwl.c
+++ b/dwl.c
@@ -51,6 +51,9 @@
@ -146,13 +145,15 @@ index 12f441e..1f3b325 100644
void
cursorconstrain(struct wlr_pointer_constraint_v1 *constraint)
{
@@ -1383,6 +1430,27 @@ destroykeyboardgroup(struct wl_listener *listener, void *data)
@@ -1383,6 +1430,29 @@ destroykeyboardgroup(struct wl_listener *listener, void *data)
free(group);
}
+void
+destroytablet(struct wl_listener *listener, void *data)
+{
+ wl_list_remove(&tablet_device_destroy.link);
+ wlr_cursor_detach_input_device(cursor, tablet->wlr_device);
+ tablet = NULL;
+}
+
@ -174,7 +175,7 @@ index 12f441e..1f3b325 100644
Monitor *
dirtomon(enum wlr_direction dir)
{
@@ -1590,6 +1658,12 @@ inputdevice(struct wl_listener *listener, void *data)
@@ -1590,6 +1660,12 @@ inputdevice(struct wl_listener *listener, void *data)
case WLR_INPUT_DEVICE_POINTER:
createpointer(wlr_pointer_from_input_device(device));
break;
@ -187,7 +188,7 @@ index 12f441e..1f3b325 100644
default:
/* TODO handle other input device types */
break;
@@ -2584,6 +2658,8 @@ setup(void)
@@ -2584,6 +2660,8 @@ setup(void)
relative_pointer_mgr = wlr_relative_pointer_manager_v1_create(dpy);
@ -196,7 +197,7 @@ index 12f441e..1f3b325 100644
/*
* Creates a cursor, which is a wlroots utility for tracking the cursor
* image shown on screen.
@@ -2613,6 +2689,11 @@ setup(void)
@@ -2613,6 +2691,11 @@ setup(void)
wl_signal_add(&cursor->events.button, &cursor_button);
wl_signal_add(&cursor->events.axis, &cursor_axis);
wl_signal_add(&cursor->events.frame, &cursor_frame);
@ -208,7 +209,7 @@ index 12f441e..1f3b325 100644
cursor_shape_mgr = wlr_cursor_shape_manager_v1_create(dpy, 1);
wl_signal_add(&cursor_shape_mgr->events.request_set_shape, &request_set_cursor_shape);
@@ -2708,6 +2789,163 @@ tagmon(const Arg *arg)
@@ -2708,6 +2791,163 @@ tagmon(const Arg *arg)
setmon(sel, dirtomon(arg->i), 0);
}