Compare commits

...

4 Commits

Author SHA1 Message Date
moonsabre
9356baf802 Add follow patch. Add line break in bartruecenteredtitle README file. 2025-03-13 15:26:17 -07:00
moonsabre
06571a92bf bartruecenteredtitle patch file was missing. 2025-03-13 13:09:01 -07:00
moonsabre
a90f5b63ad Update bartruecenteredtitle to fix floating window indicator position. Update README file to better address version compatibility. 2025-03-13 12:57:40 -07:00
LaKato
813b425117 Revive togglekblayoutandoptions
Changes:
- Updated for v0.7
- incxkbrules now uses its argument (value to increment by)
- A new setxkbrules function has been added
- Keyboard groups are no longer looped over because only one is created
2025-03-13 17:11:59 +00:00
9 changed files with 241 additions and 126 deletions

View File

@ -1,9 +1,10 @@
### Description
A homegrown port of dwm's _truecenteredtitle_ patch, with the addition of a config option to toggle its effects.<br>Requires [the bar patch](https://codeberg.org/dwl/dwl-patches/src/branch/main/patches/bar) to be applied beforehand.
![](centeredtitle.webp)
### Download
- [v0.7](/dwl/dwl-patches/raw/branch/main/patches/bartruecenteredtitle/bar-truecenteredtitle-v0.7.patch)<br>Targets latest dwl release v0.7.
- [v0.7/v0.6](/dwl/dwl-patches/raw/branch/main/patches/bartruecenteredtitle/bartruecenteredtitle.patch)<br>Works on both v0.7 and v0.6.
### Author
- [moonsabre](https://codeberg.org/moonsabre)

View File

@ -1,41 +1,48 @@
From be07463a7bc7a5b6f4860666d131e32b56e62ff0 Mon Sep 17 00:00:00 2001
From 1bffefbe03a8f3002c7eb285ba285226aee45ef2 Mon Sep 17 00:00:00 2001
From: moonsabre <moonsabre@tuta.io>
Date: Mon, 10 Mar 2025 22:26:38 -0700
Subject: [PATCH] Implement title centering parameter
Date: Thu, 13 Mar 2025 13:05:03 -0700
Subject: [PATCH] Bar title centering parameter.
---
config.def.h | 1 +
dwl.c | 6 +++++-
2 files changed, 6 insertions(+), 1 deletion(-)
config.def.h | 1 +
dwl.c | 12 +++++++++---
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/config.def.h b/config.def.h
index 5d1dc2b..ecbf223 100644
index 5d1dc2b..8ac3a8b 100644
--- a/config.def.h
+++ b/config.def.h
@@ -9,6 +9,7 @@ static const int bypass_surface_visibility = 0; /* 1 means idle inhibitors will
static const unsigned int borderpx = 1; /* border pixel of windows */
static const int showbar = 1; /* 0 means no bar */
static const int topbar = 1; /* 0 means bottom bar */
+static const int centeredtitle = 1; /* 1 means center window title */
+static const int centeredtitle = 1; /* 1 means centered title */
static const char *fonts[] = {"monospace:size=10"};
static const float rootcolor[] = COLOR(0x000000ff);
/* This conforms to the xdg-protocol. Set the alpha to zero to restore the old behavior */
diff --git a/dwl.c b/dwl.c
index ece537a..d7ffce2 100644
index ece537a..afa1d41 100644
--- a/dwl.c
+++ b/dwl.c
@@ -1551,7 +1551,11 @@ drawbar(Monitor *m)
@@ -1551,9 +1551,15 @@ drawbar(Monitor *m)
if ((w = m->b.width - tw - x) > m->b.height) {
if (c) {
drwl_setscheme(m->drw, colors[m == selmon ? SchemeSel : SchemeNorm]);
- drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0);
+ if ((centeredtitle == 0) || (TEXTW(selmon, client_get_title(c)) > w)) {
- if (c && c->isfloating)
- drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0);
+ if (centeredtitle == 0 || TEXTW(selmon, client_get_title(c)) > w) {
+ drwl_text(m->drw, x, 0, w, m->b.height, m->lrpad / 2, client_get_title(c), 0);
+ if (c && c->isfloating)
+ drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0);
+ } else {
+ drwl_text(m->drw, x, 0, w, m->b.height, (w - TEXTW(selmon, client_get_title(c))) / 2, client_get_title(c), 0);
+ if (c && c->isfloating)
+ drwl_rect(m->drw, x + ((w - TEXTW(selmon, client_get_title(c))) / 2 - boxs * 6), boxs, boxw, boxw, 0, 0);
+ }
if (c && c->isfloating)
drwl_rect(m->drw, x + boxs, boxs, boxw, boxw, 0, 0);
} else {
--
2.46.0
drwl_setscheme(m->drw, colors[SchemeNorm]);
drwl_rect(m->drw, x, 0, w, m->b.height, 1, 1);
--
2.48.1

10
patches/follow/README.md Normal file
View File

@ -0,0 +1,10 @@
### Description
An extremely simple patch that adds the option to change DWL's window sending behavior; when active, sent windows will be followed, i.e. when a window is sent to another tag, the view changes to that tag.<br>No dependencies.
![](follow.webp)
### Download
- [v0.7](/dwl/dwl-patches/raw/branch/main/patches/follow/follow.patch)<br>Targets tag v0.7, but also works on git master and v0.6.
### Author
- [moonsabre](https://codeberg.org/moonsabre)

View File

@ -0,0 +1,38 @@
From c4de366aa5e2a465f5e2963f4ffed7adde77929a Mon Sep 17 00:00:00 2001
From: moonsabre <moonsabre@tuta.io>
Date: Thu, 13 Mar 2025 14:36:49 -0700
Subject: [PATCH] Add parameter for following sent windows.
---
config.def.h | 1 +
dwl.c | 2 ++
2 files changed, 3 insertions(+)
diff --git a/config.def.h b/config.def.h
index 22d2171..cdbdc72 100644
--- a/config.def.h
+++ b/config.def.h
@@ -6,6 +6,7 @@
/* 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 int follow = 1; /* 1 means follow windows when sent to another tag */
static const unsigned int borderpx = 1; /* border pixel of windows */
static const float rootcolor[] = COLOR(0x222222ff);
static const float bordercolor[] = COLOR(0x444444ff);
diff --git a/dwl.c b/dwl.c
index a2711f6..d2cf8ba 100644
--- a/dwl.c
+++ b/dwl.c
@@ -2677,6 +2677,8 @@ tag(const Arg *arg)
sel->tags = arg->ui & TAGMASK;
focusclient(focustop(selmon), 1);
arrange(selmon);
+ if (follow == 1)
+ view(arg);
printstatus();
}
--
2.48.1

BIN
patches/follow/follow.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 KiB

View File

@ -0,0 +1,9 @@
### Description
Switch between multiple keyboard layouts, variants, and options at runtime.
### Download
- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch)
### Authors
- [LaKato](https://codeberg.org/LaKato)
- [dev-gm](https://codeberg.org/dev-gm)

View File

@ -0,0 +1,160 @@
From 9ee76adc7c6567650e7b34273f953fed03191c05 Mon Sep 17 00:00:00 2001
From: LaKato <lakato@noreply.codeberg.org>
Date: Sat, 8 Mar 2025 12:14:41 -0500
Subject: [PATCH] Update for v0.7
Additional changes:
- incxkbrules now uses its argument
- A new setxkbrules function has been added
- Keyboard groups are no longer looped over because only one is created
---
config.def.h | 17 +++++++++++------
dwl.c | 44 +++++++++++++++++++++++++++++++++-----------
2 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/config.def.h b/config.def.h
index 22d2171..b3b4699 100644
--- a/config.def.h
+++ b/config.def.h
@@ -52,12 +52,15 @@ static const MonitorRule monrules[] = {
};
/* keyboard */
-static const struct xkb_rule_names xkb_rules = {
- /* can specify fields: rules, model, layout, variant, options */
- /* example:
- .options = "ctrl:nocaps",
- */
- .options = NULL,
+static const struct xkb_rule_names xkb_rules[] = {
+ {
+ .layout = "us",
+ },
+ /*{
+ .layout = "us",
+ .variant = "dvp",
+ .options = "compose:102,numpad:shift3,kpdl:semi,keypad:atm,caps:super"
+ }*/
};
static const int repeat_rate = 25;
@@ -148,6 +151,8 @@ static const Key keys[] = {
{ MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} },
+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_A, incxkbrules, {.i = +1} },
+ /*{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_E, setxkbrules, {.i = +1} },*/
TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0),
TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1),
TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2),
diff --git a/dwl.c b/dwl.c
index a2711f6..a2413e9 100644
--- a/dwl.c
+++ b/dwl.c
@@ -249,6 +249,7 @@ static void arrange(Monitor *m);
static void arrangelayer(Monitor *m, struct wl_list *list,
struct wlr_box *usable_area, int exclusive);
static void arrangelayers(Monitor *m);
+static void assignkeymap(struct wlr_keyboard *keyboard);
static void axisnotify(struct wl_listener *listener, void *data);
static void buttonpress(struct wl_listener *listener, void *data);
static void chvt(const Arg *arg);
@@ -293,6 +294,7 @@ static void fullscreennotify(struct wl_listener *listener, void *data);
static void gpureset(struct wl_listener *listener, void *data);
static void handlesig(int signo);
static void incnmaster(const Arg *arg);
+static void incxkbrules(const Arg *arg);
static void inputdevice(struct wl_listener *listener, void *data);
static int keybinding(uint32_t mods, xkb_keysym_t sym);
static void keypress(struct wl_listener *listener, void *data);
@@ -333,6 +335,7 @@ static void setmon(Client *c, Monitor *m, uint32_t newtags);
static void setpsel(struct wl_listener *listener, void *data);
static void setsel(struct wl_listener *listener, void *data);
static void setup(void);
+static void setxkbrules(const Arg *arg);
static void spawn(const Arg *arg);
static void startdrag(struct wl_listener *listener, void *data);
static void tag(const Arg *arg);
@@ -404,6 +407,7 @@ static struct wl_listener lock_listener = {.notify = locksession};
static struct wlr_seat *seat;
static KeyboardGroup *kb_group;
+static unsigned int kblayout = 0;
static unsigned int cursor_mode;
static Client *grabc;
static int grabcx, grabcy; /* client-relative */
@@ -580,6 +584,20 @@ arrangelayers(Monitor *m)
}
}
+void
+assignkeymap(struct wlr_keyboard *keyboard) {
+ struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ struct xkb_keymap *keymap = xkb_keymap_new_from_names(context, &xkb_rules[kblayout],
+ XKB_KEYMAP_COMPILE_NO_FLAGS);
+
+ if (!keymap)
+ die("failed to compile keymap");
+
+ wlr_keyboard_set_keymap(keyboard, keymap);
+ xkb_keymap_unref(keymap);
+ xkb_context_unref(context);
+}
+
void
axisnotify(struct wl_listener *listener, void *data)
{
@@ -885,21 +903,11 @@ KeyboardGroup *
createkeyboardgroup(void)
{
KeyboardGroup *group = ecalloc(1, sizeof(*group));
- struct xkb_context *context;
- struct xkb_keymap *keymap;
group->wlr_group = wlr_keyboard_group_create();
group->wlr_group->data = group;
- /* Prepare an XKB keymap and assign it to the keyboard group. */
- context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
- if (!(keymap = xkb_keymap_new_from_names(context, &xkb_rules,
- XKB_KEYMAP_COMPILE_NO_FLAGS)))
- die("failed to compile keymap");
-
- wlr_keyboard_set_keymap(&group->wlr_group->keyboard, keymap);
- xkb_keymap_unref(keymap);
- xkb_context_unref(context);
+ assignkeymap(&group->wlr_group->keyboard);
wlr_keyboard_set_repeat_info(&group->wlr_group->keyboard, repeat_rate, repeat_delay);
@@ -1524,6 +1532,13 @@ incnmaster(const Arg *arg)
arrange(selmon);
}
+void
+incxkbrules(const Arg *arg)
+{
+ kblayout = (kblayout + arg->i) % LENGTH(xkb_rules);
+ assignkeymap(&kb_group->wlr_group->keyboard);
+}
+
void
inputdevice(struct wl_listener *listener, void *data)
{
@@ -2645,6 +2660,13 @@ setup(void)
#endif
}
+void
+setxkbrules(const Arg *arg)
+{
+ kblayout = arg->i;
+ assignkeymap(&kb_group->wlr_group->keyboard);
+}
+
void
spawn(const Arg *arg)
{
--
2.48.1

View File

@ -1,8 +0,0 @@
### Description
Switch between multiple keyboard layouts, variants, and options at runtime.
### Download
- [2024-03-15](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/togglekblayoutandoptions/togglekblayoutandoptions.patch)
### Authors
- [dev-gm](https://codeberg.org/dev-gm)

View File

@ -1,102 +0,0 @@
From 4ba551f0f3837ccc2241f99665f0566c5af6dab9 Mon Sep 17 00:00:00 2001
From: Gavin M <github@gavinm.us>
Date: Fri, 15 Mar 2024 16:56:53 -0500
Subject: [PATCH] Togglekblayoutandoptions patch
---
config.def.h | 16 ++++++++++------
dwl.c | 23 ++++++++++++++++++++++-
2 files changed, 32 insertions(+), 7 deletions(-)
diff --git a/config.def.h b/config.def.h
index 9009517..1583932 100644
--- a/config.def.h
+++ b/config.def.h
@@ -48,12 +48,15 @@ static const MonitorRule monrules[] = {
};
/* keyboard */
-static const struct xkb_rule_names xkb_rules = {
- /* can specify fields: rules, model, layout, variant, options */
- /* example:
- .options = "ctrl:nocaps",
- */
- .options = NULL,
+static const struct xkb_rule_names xkb_rules[] = {
+ {
+ .layout = "us"
+ },
+ /*{
+ .layout = "us",
+ .variant = "dvp",
+ .options = "compose:102,numpad:shift3,kpdl:semi,keypad:atm,caps:super"
+ }*/
};
static const int repeat_rate = 25;
@@ -143,6 +146,7 @@ static const Key keys[] = {
{ MODKEY, XKB_KEY_period, focusmon, {.i = WLR_DIRECTION_RIGHT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_less, tagmon, {.i = WLR_DIRECTION_LEFT} },
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_greater, tagmon, {.i = WLR_DIRECTION_RIGHT} },
+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_A, incxkbrules, {.i = +1} },
TAGKEYS( XKB_KEY_1, XKB_KEY_exclam, 0),
TAGKEYS( XKB_KEY_2, XKB_KEY_at, 1),
TAGKEYS( XKB_KEY_3, XKB_KEY_numbersign, 2),
diff --git a/dwl.c b/dwl.c
index 5867b0c..ef4e605 100644
--- a/dwl.c
+++ b/dwl.c
@@ -327,6 +327,7 @@ static void setsel(struct wl_listener *listener, void *data);
static void setup(void);
static void spawn(const Arg *arg);
static void startdrag(struct wl_listener *listener, void *data);
+static void incxkbrules(const Arg *arg);
static void tag(const Arg *arg);
static void tagmon(const Arg *arg);
static void tile(Monitor *m);
@@ -395,6 +396,7 @@ static struct wl_listener lock_listener = {.notify = locksession};
static struct wlr_seat *seat;
static KeyboardGroup kb_group = {0};
static KeyboardGroup vkb_group = {0};
+static unsigned int kblayout = 0;
static struct wlr_surface *held_grab;
static unsigned int cursor_mode;
static Client *grabc;
@@ -2470,7 +2472,7 @@ setup(void)
/* Prepare an XKB keymap and assign it to the keyboard group. */
context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
- if (!(keymap = xkb_keymap_new_from_names(context, &xkb_rules,
+ if (!(keymap = xkb_keymap_new_from_names(context, &xkb_rules[kblayout],
XKB_KEYMAP_COMPILE_NO_FLAGS)))
die("failed to compile keymap");
@@ -2548,6 +2550,25 @@ startdrag(struct wl_listener *listener, void *data)
LISTEN_STATIC(&drag->icon->events.destroy, destroydragicon);
}
+void
+incxkbrules(const Arg *arg)
+{
+ KeyboardGroup *group;
+ struct wlr_keyboard_group *wlr_group;
+ const struct xkb_rule_names newrule = xkb_rules[(kblayout + 1) % LENGTH(xkb_rules)];
+
+ wl_list_for_each(group, &kb_group.link, link) {
+ wl_list_for_each(wlr_group, &group->wlr_group->keys, keys) {
+ struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS);
+ struct xkb_keymap *keymap = xkb_map_new_from_names(context, &newrule,
+ XKB_KEYMAP_COMPILE_NO_FLAGS);
+ wlr_keyboard_set_keymap(&wlr_group->keyboard, keymap);
+ xkb_keymap_unref(keymap);
+ xkb_context_unref(context);
+ }
+ }
+}
+
void
tag(const Arg *arg)
{
--
2.44.0