mirror of
https://codeberg.org/dwl/dwl-patches.git
synced 2026-06-11 10:23:19 +00:00
Renamed _STALE_PATCHES -> stale-patches
The odd name was necessary historically to keep the directory visible at the top of a large list of patches. This is no longer necessary.
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
This implements the DRM lease protocol, which is needed to use devices such as VR headsets.
|
||||
|
||||
### Download
|
||||
- [2023-05-26](https://github.com/djpohly/dwl/compare/main...minego:drm_lease_patch.patch)
|
||||
|
||||
### Authors
|
||||
- [Micah N Gorrell](https://github.com/minego)
|
||||
@@ -0,0 +1,10 @@
|
||||
### Description
|
||||
Utilizing the [/usr/include/X11/XF86keysym.h](https://cgit.freedesktop.org/xorg/proto/x11proto/tree/XF86keysym.h) header file to change the volume via the appropriate keys.
|
||||
|
||||
### Download
|
||||
- [2023-10-15](https://github.com/djpohly/dwl/compare/main...nakibrayan3:dwl:update-XF86keysym-patch.patch)
|
||||
- [2021-05-06](https://github.com/djpohly/dwl/compare/main...917Wolf:vol.patch)
|
||||
|
||||
### Authors
|
||||
- [917Wolf](https://github.com/917Wolf)
|
||||
- [Rayan Nakib](https://nakibrayan2.pages.dev)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Adds configurable transparency for focused and unfocused windows.
|
||||
|
||||
### Download
|
||||
- [2021-12-03](https://github.com/djpohly/dwl/compare/main...juliag2:alphafocus.patch)
|
||||
|
||||
### Authors
|
||||
- [Julia](https://github.com/juliag2)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Newly created windows are placed above the currently selected window in the stack.
|
||||
|
||||
### Download
|
||||
- [2021-01-16](https://github.com/djpohly/dwl/compare/main...ss7m:attachabove.patch)
|
||||
|
||||
### Authors
|
||||
- [sam-barr](https://github.com/ss7m)
|
||||
@@ -0,0 +1,13 @@
|
||||
### Description
|
||||
|
||||
This is a port of attachtop patch for dwm: https://dwm.suckless.org/patches/attachtop
|
||||
|
||||
New client attaches below the last master/on top of the stack.
|
||||
|
||||
Behavior feels very intuitive as it doesn't disrupt existing masters no matter the amount of them, it only pushes the clients in stack down.
|
||||
|
||||
### Download
|
||||
- [2023-07-15](https://github.com/djpohly/dwl/compare/main...NikitaIvanovV:attachtop.patch)
|
||||
|
||||
### Authors
|
||||
- [Nikita Ivanov](https://github.com/NikitaIvanovV)
|
||||
@@ -0,0 +1,40 @@
|
||||
### Description
|
||||
Adds keybindings for screen rotation and auto rotation from an accelerometer.
|
||||
|
||||
### Setup
|
||||
Find an accelerometer device in sysfs (`cat /sys/bus/iio/devices/iio*/name`,
|
||||
or using a script: [monitor-iio.sh](https://github.com/Unprex/dotfiles/blob/main/scripts/monitor-iio.sh)) \
|
||||
Find the raw output file of the accelerometer
|
||||
(e.g. `cat /sys/bus/iio/devices/iio:device0/in_accel_x_raw` should output an integer). \
|
||||
Add the raw output file names to the dwl configuration **accel_\***.
|
||||
|
||||
Add a udev rule to uniquely identify the device, for example:
|
||||
```
|
||||
sudo echo 'SUBSYSTEM=="iio", KERNEL=="iio*", ATTR{name}=="accel_3d", GROUP="input", SYMLINK+="input/accel"' >> /etc/udev/rules.d/99-accel.rules
|
||||
sudo udevadm control --reload-rules && sudo udevadm trigger
|
||||
```
|
||||
(the device is probably already in /dev/ e.g. `/dev/iio:device0` but on my computer the number changes after a reboot)
|
||||
|
||||
A symlink to the device should now be available in `/dev/input/` and accessible to input group members. \
|
||||
Add the device path to the dwl configuration **accel_path**.
|
||||
|
||||
### Config
|
||||
* `rotation_enabled`: If the auto rotation is enabled on startup.
|
||||
* `rotation_delay`: How often to check the accelerometer values in milliseconds.
|
||||
* `rotation_flat`: Threshold on the normalized Z axis to consider the device flat and stop the auto rotation.
|
||||
* `rotation_thresh`: Rotation threshold after which the screen flips (values less than 0.5 will cause a back and forth).
|
||||
|
||||
+ `accel_path`: The path to the accelerometer device file (e.g. "/dev/input/accel").
|
||||
+ `accel_x`: The name of the sysfs file for the accelerometer x axis.
|
||||
+ `accel_y`: The name of the sysfs file for the accelerometer y axis.
|
||||
+ `accel_z`: The name of the sysfs file for the accelerometer z axis.
|
||||
|
||||
Default keybindings:
|
||||
* `<Modkey>` + `<Shift>` + `<Arrows>`: Change the screen rotation manually (doesn't disable the auto rotation).
|
||||
* `<Modkey>` + `<Shift>` + `<R>`: Enable/disable the auto rotation.
|
||||
|
||||
### Download
|
||||
- [2022-10-25](https://github.com/djpohly/dwl/compare/main...Unprex:rotation.patch)
|
||||
|
||||
### Authors
|
||||
- [Unprex](https://github.com/Unprex)
|
||||
@@ -0,0 +1,10 @@
|
||||
### Description
|
||||
Adds a rule to automatically center clients on the current monitor.
|
||||
|
||||
### Download
|
||||
- [v0.4](https://github.com/djpohly/dwl/compare/main...dm1tz:04-center.patch)
|
||||
- [v0.4-r1](https://github.com/djpohly/dwl/compare/main...dm1tz:04rc1-iscenter.patch)
|
||||
- [2022-08-27](https://github.com/djpohly/dwl/compare/main...dm1tz:iscenter.patch)
|
||||
|
||||
### Authors
|
||||
- [Dmitry Zakharchenko](https://github.com/dm1tz)
|
||||
@@ -0,0 +1,27 @@
|
||||
### Description
|
||||
Store your clipboard history using `clipman` clipboard manager without your KeePassXC passwords leaking into clipman.
|
||||
|
||||
Ensure these dependencies are installed (instructions for debian, other distros are left as an exercise...):
|
||||
|
||||
apt install clipman libmodern-perl-perl moreutils wl-clipboard
|
||||
|
||||
Change your command to launch `dwl` to something like the following:
|
||||
|
||||
dwl -s 'pee somebar dwl-getwindowtitle'
|
||||
|
||||
Ensure the following command is running in the background of your `dwl` session. Put it whereever your auto-started stuff is.
|
||||
|
||||
exec wl-paste -t text --watch dwl-clipman
|
||||
|
||||
This solution is based on the following reddit post, modified to support `dwl`. https://www.reddit.com/r/swaywm/comments/ljl0dh/keeping_secrets_secret_with_keepassxc_clipman_and/
|
||||
|
||||
Feel free to use this code however you want, but I can't guarantee it will work for what you are trying to do. Licenced under the same license as `dwl`, "WITHOUT WARRANTY OF ANY KIND".
|
||||
|
||||
|
||||
|
||||
### Download
|
||||
- [2022-12-21](https://github.com/djpohly/dwl/compare/main...bencollerson:clipboard-manager.patch)
|
||||
- [2022-12-01](https://github.com/djpohly/dwl/compare/main...bencollerson:94d0a21.patch)
|
||||
|
||||
### Authors
|
||||
- [Ben Collerson](https://github.com/bencollerson)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Adds clipboard functionality. Requires the [ipc](https://github.com/djpohly/dwl/wiki/ipc) patch for dwl and `wl-clipboard` to be installed. By default, requires [clipman](https://github.com/yory8/clipman) for the clipboard and [dwl-state](https://github.com/MadcowOG/dwl-state) for getting the appid of the focused application, but you can change these in the script if you have alternatives. You may change which applications to not record by modifying the `excludes` array in `dwl-cliboard-watcher`. Make sure `wl-paste -t text -w dwl-clipboard-watcher` is running after dwl.
|
||||
|
||||
### Downloads
|
||||
- [2023-3-01](https://github.com/djpohly/dwl/compare/main...MadcowOG:ipc-clipboard.patch)
|
||||
|
||||
### Authors
|
||||
- [MadcowOG](https://github.com/MadcowOG)
|
||||
@@ -0,0 +1,9 @@
|
||||
### Description
|
||||
Adds function to cycle through available layouts.
|
||||
|
||||
### Download
|
||||
- [v0.4](https://github.com/djpohly/dwl/compare/main...dm1tz:04-cyclelayouts.patch)
|
||||
- [2021-07-27](https://github.com/djpohly/dwl/compare/main...vnepogodin:cyclelayouts.patch)
|
||||
|
||||
### Authors
|
||||
- [Vladislav Nepogodin](https://github.com/vnepogodin)
|
||||
@@ -0,0 +1,27 @@
|
||||
### Description
|
||||
Arranges windows in a Fibonacci spiral or dwindle.
|
||||
|
||||
### Scheme
|
||||
```
|
||||
+-----------+-----------+ +-----------+-----------+
|
||||
| | | | | |
|
||||
| | 2 | | | 2 |
|
||||
| | | | | |
|
||||
| 1 +--+--+-----+ | 1 +-----+-----+
|
||||
| | 5|-.| | | | | 4 |
|
||||
| +--+--+ 3 | | | 3 +--+--+
|
||||
| | 4 | | | | | 5|-.|
|
||||
+-----------+-----+-----+ +-----------+-----+-----+
|
||||
spiral dwindle
|
||||
```
|
||||
|
||||
### Download
|
||||
- [2023-06-21](https://github.com/djpohly/dwl/compare/main...Abanoub8:fibonacci.patch)
|
||||
- [2022-09-22](http://0x0.st/oVlu.patch)
|
||||
- [2021-05-06](https://github.com/djpohly/dwl/compare/main...917Wolf:fib.patch)
|
||||
|
||||
### Authors
|
||||
- [Abanoub8](https://github.com/Abanoub8)
|
||||
- [medanisjbara](https://github.com/medanisjbara)
|
||||
- [917Wolf](https://github.com/917Wolf)
|
||||
- Niki Yoshiuchi
|
||||
@@ -0,0 +1,7 @@
|
||||
### Description
|
||||
Implements `focusmon()` function that moves the cursor to the focused monitor.
|
||||
### Download
|
||||
- [2020-10-15](https://github.com/djpohly/dwl/compare/main...Stivvo:focusMonPointer.patch)
|
||||
|
||||
### Authors
|
||||
- [Stivvo](https://github.com/Stivvo)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Focus the window left, right, above or below the current focused window
|
||||
|
||||
### Download
|
||||
- [2023-19-15](https://github.com/djpohly/dwl/compare/main...XGames123:focusdir.patch)
|
||||
|
||||
### Authors
|
||||
- [ldev](https://github.com/Xgames123)
|
||||
@@ -0,0 +1,9 @@
|
||||
### Description
|
||||
Focus the master regardless of the current focus.
|
||||
|
||||
### Download
|
||||
- [2022-09-02](https://github.com/djpohly/dwl/compare/main...dm1tz:fmaster.patch)
|
||||
- [2022-08-18](https://github.com/djpohly/dwl/compare/main...PalanixYT:focusmaster.patch)
|
||||
|
||||
### Authors
|
||||
- [Palanix](https://github.com/PalanixYT)
|
||||
@@ -0,0 +1,25 @@
|
||||
### Description
|
||||
This patch is a modified version of [vanitygaps][vanitygaps] that adds gaps around clients regardless of a layout.
|
||||
It means you can apply any layout patch and the gaps will be shown properly as long as the layout does not add any gaps on its own.
|
||||
|
||||
This works by allowing a layout to place clients normally without gaps,
|
||||
and then correcting positions and dimensions of clients afterwards to add gaps around them.
|
||||
To make it work, I had to modify `resize()` function,
|
||||
and, as a side effect, this change fixed some flickering I experienced when using [snail][snail] layout.
|
||||
|
||||
[snail]: https://github.com/djpohly/dwl/wiki/snail
|
||||
[vanitygaps]: https://github.com/djpohly/dwl/wiki/vanitygaps
|
||||
|
||||
### Changelog
|
||||
|
||||
2023-11-24:
|
||||
- Refactor, it does exactly the same, just using less code.
|
||||
- Replace `gappih`, `gappiv`, `gappoh` and `gappov` with only `gappx`. They don't do anything anyways.
|
||||
|
||||
### Download
|
||||
- [2023-11-24](https://github.com/djpohly/dwl/compare/main...wochap:genericgaps.patch)
|
||||
- [2023-05-20](https://github.com/djpohly/dwl/compare/main...NikitaIvanovV:genericgaps.patch) generic gaps
|
||||
- [2023-05-20](https://github.com/djpohly/dwl/compare/main...NikitaIvanovV:genericgaps-rule.patch) generic gaps + monitor rule to enable gaps on certain monitors by default
|
||||
|
||||
### Authors
|
||||
- [Nikita Ivanov](https://github.com/NikitaIvanovV)
|
||||
@@ -0,0 +1,10 @@
|
||||
### Description
|
||||
Arranges windows in a grid of equal sizes.
|
||||
|
||||
### Download
|
||||
- [2023-06-21](https://github.com/djpohly/dwl/compare/main...Abanoub8:gridmode.patch)
|
||||
- [2021-07-24](https://github.com/djpohly/dwl/compare/main...vnepogodin:gridmode.patch)
|
||||
|
||||
### Authors
|
||||
- [Vladislav Nepogodin](https://github.com/vnepogodin)
|
||||
- [Abanoub8](https://github.com/Abanoub8)
|
||||
@@ -0,0 +1,9 @@
|
||||
### Description
|
||||
Hide the cursor when typing
|
||||
|
||||
### Download
|
||||
- [2023-10-25](https://github.com/djpohly/dwl/compare/main...apprehensions:hidecursor.patch)
|
||||
- [2023-02-19](https://github.com/djpohly/dwl/compare/main...PalanixYT:type_hide.patch)
|
||||
|
||||
### Authors
|
||||
- [Palanix](https://github.com/PalanixYT)
|
||||
@@ -0,0 +1,15 @@
|
||||
### Description
|
||||
Allow for keyboard rules to be used; This allows for keyboard-specific options or layouts.
|
||||
|
||||
The keyboard's names can be retrieved from `libinput list-devices | grep Device`, example:
|
||||
```c
|
||||
static const KeyboardRule kbrules[] = {
|
||||
{ "AT Translated Set 2 keyboard", { .options = "altwin:swap_alt_win,caps:swapescape" } },
|
||||
};
|
||||
```
|
||||
|
||||
### Download
|
||||
- [2023-09-20](https://github.com/djpohly/dwl/compare/main...apprehensions:dwl:kbrules.patch)
|
||||
|
||||
### Authors
|
||||
- [sewn](https://github.com/apprehensions)
|
||||
@@ -0,0 +1,44 @@
|
||||
### Description
|
||||
|
||||
This patch implements sequences for chained keybindings (like the dwm [keychord](https://dwm.suckless.org/patches/keychord/) patch).
|
||||
|
||||
_Notes_:
|
||||
- The maximum number of sequences is set to `5` in the `Keychord` struct for a given keybinding
|
||||
- This original motivation was better support for [stumpwm](https://stumpwm.github.io/) style of keybindings, however this is not a limitation
|
||||
|
||||
### Example
|
||||
|
||||
The default values for `MODKEY` and `PREFIXKEY` can be changed in `config.def.h` and/or `config.h`.
|
||||
|
||||
#### emacs-like
|
||||
|
||||
In the example below, the `firefox` command is bound to the key sequence `alt-s alt-u f`.
|
||||
|
||||
```C
|
||||
static const Keychord keychords[] = {
|
||||
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
|
||||
/* count key_sequences function argument */
|
||||
{ 3, {{MODKEY, XKB_KEY_s}, {MODKEY, XKB_KEY_u}, {MOD_NONE, XKB_KEY_f}}, spawn, SHCMD("firefox") },
|
||||
};
|
||||
```
|
||||
|
||||
#### vim-like
|
||||
|
||||
In the example below, the `firefox` command is bound to the key sequence `alt-s u f`.
|
||||
|
||||
```C
|
||||
static const Keychord keychords[] = {
|
||||
/* Note that Shift changes certain key codes: c -> C, 2 -> at, etc. */
|
||||
/* count key_sequences function argument */
|
||||
{ 3, {{MODKEY, XKB_KEY_s}, {MOD_NONE, XKB_KEY_u}, {MOD_NONE, XKB_KEY_f}}, spawn,SHCMD("firefox") },
|
||||
};
|
||||
```
|
||||
|
||||
### Download
|
||||
|
||||
- [2023-03-12](https://github.com/djpohly/dwl/compare/main...yveszoundi:dwl-customization:keychord-2023-03-12.patch)
|
||||
- [2023-02-15](https://github.com/djpohly/dwl/compare/main...yveszoundi:dwl-customization:v0.4-keychord-2023-02-15.patch)
|
||||
|
||||
### Authors
|
||||
|
||||
- [Yves Zoundi](https://github.com/yveszoundi)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Print current keyboard layout to stdout
|
||||
|
||||
### Download
|
||||
- [2022-09-10](https://github.com/djpohly/dwl/compare/main...GospodinHoroshiy:keymap.patch)
|
||||
|
||||
### Authors
|
||||
- [Gospodin](https://github.com/GospodinHoroshiy)
|
||||
@@ -0,0 +1,13 @@
|
||||
### Description
|
||||
Show the master area to the right.
|
||||
|
||||
### Reason for deprecation
|
||||
I created this patch for a user on Discord and I have never used it.
|
||||
|
||||
### Download
|
||||
- [git branch](https://codeberg.org/sevz/dwl/src/branch/master-right)
|
||||
- [main 2024-09-01](/dwl/dwl-patches/raw/branch/main/patches/master-right/master-right.patch)
|
||||
- [master-right-0.7.patch](/dwl/dwl-patches/raw/branch/main/patches/master-right/master-right-0.7.patch)
|
||||
|
||||
### Authors
|
||||
- [sevz](https://codeberg.org/sevz)
|
||||
@@ -0,0 +1,35 @@
|
||||
From f72236247e5e7cb23c3cac86b496cdd2c523f7ff Mon Sep 17 00:00:00 2001
|
||||
From: Sevz17 <leohdz172@outlook.com>
|
||||
Date: Fri, 25 Jun 2021 19:50:56 -0500
|
||||
Subject: [PATCH] show master area to the right
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
|
||||
---
|
||||
dwl.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index a2711f67..50b057a7 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -2710,11 +2710,12 @@ tile(Monitor *m)
|
||||
if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
|
||||
continue;
|
||||
if (i < m->nmaster) {
|
||||
- resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw,
|
||||
+ resize(c, (struct wlr_box){.x = m->w.x + m->w.width - mw,
|
||||
+ .y = m->w.y + my, .width = mw,
|
||||
.height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0);
|
||||
my += c->geom.height;
|
||||
} else {
|
||||
- resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty,
|
||||
+ resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + ty,
|
||||
.width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0);
|
||||
ty += c->geom.height;
|
||||
}
|
||||
--
|
||||
2.46.0
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
From 0afd0a98998dda20e4fe4f4d2b5fcdec49c448c3 Mon Sep 17 00:00:00 2001
|
||||
From: Sevz17 <leohdz172@outlook.com>
|
||||
Date: Fri, 25 Jun 2021 19:50:56 -0500
|
||||
Subject: [PATCH] show master area to the right
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Leonardo Hernández Hernández <leohdz172@proton.me>
|
||||
---
|
||||
dwl.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index 9021e442..2bd354a3 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -2670,11 +2670,12 @@ tile(Monitor *m)
|
||||
if (!VISIBLEON(c, m) || c->isfloating || c->isfullscreen)
|
||||
continue;
|
||||
if (i < m->nmaster) {
|
||||
- resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + my, .width = mw,
|
||||
+ resize(c, (struct wlr_box){.x = m->w.x + m->w.width - mw,
|
||||
+ .y = m->w.y + my, .width = mw,
|
||||
.height = (m->w.height - my) / (MIN(n, m->nmaster) - i)}, 0);
|
||||
my += c->geom.height;
|
||||
} else {
|
||||
- resize(c, (struct wlr_box){.x = m->w.x + mw, .y = m->w.y + ty,
|
||||
+ resize(c, (struct wlr_box){.x = m->w.x, .y = m->w.y + ty,
|
||||
.width = m->w.width - mw, .height = (m->w.height - ty) / (n - i)}, 0);
|
||||
ty += c->geom.height;
|
||||
}
|
||||
--
|
||||
2.46.0
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
This patch adds the option to let the cursor jump to the center of new clients, as well as move the cursor to the center of clients that gains focus.
|
||||
|
||||
### Download
|
||||
- [2023-03-17](https://github.com/djpohly/dwl/compare/main...0undefined:mouse-follows-focus.patch)
|
||||
|
||||
### Authors
|
||||
- [0undefined](https://github.com/0undefined)
|
||||
@@ -0,0 +1,9 @@
|
||||
### Description
|
||||
Extend the [movestack](https://github.com/djpohly/dwl/wiki/movestack) patch to let you also focus, or move, a client to the top or bottom of the stack.
|
||||
|
||||
### Download
|
||||
- [2023-03-12](https://github.com/djpohly/dwl/compare/main...0undefined:dwl:move-client-top.patch)
|
||||
|
||||
### Authors
|
||||
- [0undefined](https://github.com/0undefined)
|
||||
- Original movestack patch: [sam-barr](https://github.com/ss7m)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Prevent focus on mouseover.
|
||||
|
||||
### Download
|
||||
- [2023-02-05](https://github.com/djpohly/dwl/compare/main...jjjt-git:nomousefocus.patch)
|
||||
|
||||
### Authors
|
||||
- [JJJT](https://github.com/jjjt-git)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Only exit when no windows are open
|
||||
|
||||
### Download
|
||||
- [2022-09-11](https://github.com/djpohly/dwl/compare/main...GospodinHoroshiy:onlyquitonempty.patch)
|
||||
|
||||
### Authors
|
||||
- [Gospodin](https://github.com/GospodinHoroshiy)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Adds the -u option that allows users to pass a desired uid to drop to after becoming DRM master.
|
||||
|
||||
### Download
|
||||
- [2021-09-06](https://github.com/djpohly/dwl/compare/main...DanielMowitz:privilege-drop.patch)
|
||||
|
||||
### Authors
|
||||
- [Daniel Mowitz](https://github.com/DanielMowitz)
|
||||
@@ -0,0 +1,16 @@
|
||||
### Description
|
||||
This patch modifies the behavior when selecting tags so that selecting a tag will also enable any other tags that were previously visible.
|
||||
|
||||
For example:
|
||||
1. Select tag 5, with mod+5
|
||||
2. Toggle tag 8, with ctrl+mod+8
|
||||
3. Select tag 1, with mod+1. Tags 5 and 8 should no longer be visible.
|
||||
4. Select tag 5 again, with mod+5. Tag 8 should be visible since it was remembered.
|
||||
5. Select tag 5 again, with mod_5. Selecting the already selected tag resets any remembered tags, so now tag 5 should be the only one visible.
|
||||
|
||||
### Download
|
||||
- [git branch](https://codeberg.org/minego/dwl/src/branch/remembertags)
|
||||
- [2024-03-27](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/remembertags/remembertags.patch)
|
||||
|
||||
### Authors
|
||||
- [minego](https://codeberg.org/minego)
|
||||
@@ -0,0 +1,105 @@
|
||||
From fea6eb3cfc84ede8403c89a3230f5c658a6c7bd1 Mon Sep 17 00:00:00 2001
|
||||
From: Micah N Gorrell <m@minego.net>
|
||||
Date: Wed, 27 Mar 2024 13:05:09 -0600
|
||||
Subject: [PATCH] remembertags
|
||||
|
||||
---
|
||||
config.def.h | 8 ++++----
|
||||
dwl.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 52 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 9009517..2312802 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -105,10 +105,10 @@ static const enum libinput_config_tap_button_map button_map = LIBINPUT_CONFIG_TA
|
||||
#define MODKEY WLR_MODIFIER_ALT
|
||||
|
||||
#define TAGKEYS(KEY,SKEY,TAG) \
|
||||
- { MODKEY, KEY, view, {.ui = 1 << TAG} }, \
|
||||
- { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \
|
||||
- { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \
|
||||
- { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT,SKEY,toggletag, {.ui = 1 << TAG} }
|
||||
+ { MODKEY, KEY, remembertagsview, {.i = TAG} }, \
|
||||
+ { MODKEY|WLR_MODIFIER_CTRL, KEY, toggleview, {.ui = 1 << TAG} }, \
|
||||
+ { MODKEY|WLR_MODIFIER_SHIFT, SKEY, tag, {.ui = 1 << TAG} }, \
|
||||
+ { MODKEY|WLR_MODIFIER_CTRL|WLR_MODIFIER_SHIFT, SKEY, toggletag, {.ui = 1 << TAG} }
|
||||
|
||||
/* helper for spawning shell commands in the pre dwm-5.0 fashion */
|
||||
#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } }
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index 5867b0c..31a81aa 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -205,6 +205,11 @@ struct Monitor {
|
||||
int gamma_lut_changed;
|
||||
int nmaster;
|
||||
char ltsymbol[16];
|
||||
+ unsigned int createtag[2]; /* Create windows on the last tag directly selected, not all selected */
|
||||
+ struct {
|
||||
+ unsigned int tagset;
|
||||
+ Client *zoomed;
|
||||
+ } remembered[31];
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
@@ -308,6 +313,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface,
|
||||
double sx, double sy, uint32_t time);
|
||||
static void printstatus(void);
|
||||
static void quit(const Arg *arg);
|
||||
+static void remembertagsview(const Arg *arg);
|
||||
static void rendermon(struct wl_listener *listener, void *data);
|
||||
static void requestdecorationmode(struct wl_listener *listener, void *data);
|
||||
static void requeststartdrag(struct wl_listener *listener, void *data);
|
||||
@@ -1951,6 +1957,48 @@ quit(const Arg *arg)
|
||||
wl_display_terminate(dpy);
|
||||
}
|
||||
|
||||
+void
|
||||
+remembertagsview(const Arg *arg) {
|
||||
+ unsigned newtags = (1 << arg->i) & TAGMASK;
|
||||
+ int oldtag;
|
||||
+ int active;
|
||||
+ unsigned int newcreate;
|
||||
+
|
||||
+ if (selmon == NULL) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ oldtag = selmon->createtag[selmon->seltags];
|
||||
+ active = (oldtag == arg->i);
|
||||
+
|
||||
+ if (oldtag < TAGCOUNT) {
|
||||
+ selmon->remembered[oldtag].tagset = selmon->tagset[selmon->seltags];
|
||||
+ }
|
||||
+
|
||||
+ selmon->seltags ^= 1; /*toggle tagset*/
|
||||
+
|
||||
+ if (-1 == arg->i) {
|
||||
+ /* A specific tag was not specified */
|
||||
+ active = 0;
|
||||
+ newcreate = selmon->createtag[selmon->seltags];
|
||||
+ } else {
|
||||
+ newcreate = arg->i;
|
||||
+ }
|
||||
+
|
||||
+ if (active) {
|
||||
+ /* Select twice to isolate the tag */
|
||||
+ selmon->tagset[selmon->seltags] = newtags;
|
||||
+ } else if (arg->i < TAGCOUNT) {
|
||||
+ /* Restore whatever was previously on this tag */
|
||||
+ selmon->tagset[selmon->seltags] = newtags | selmon->remembered[newcreate].tagset;
|
||||
+ }
|
||||
+
|
||||
+ selmon->createtag[selmon->seltags] = newcreate;
|
||||
+ focusclient(focustop(selmon), 1);
|
||||
+ arrange(selmon);
|
||||
+ printstatus();
|
||||
+}
|
||||
+
|
||||
void
|
||||
rendermon(struct wl_listener *listener, void *data)
|
||||
{
|
||||
--
|
||||
2.44.0
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
### Description
|
||||
This patch allows you to restart dwl with a keybinding.
|
||||
**NOTE:** that all of your applications are gonna get killed on dwl restart.
|
||||
|
||||
The function creates a file at **/tmp/restart_dwl** and exits dwl.
|
||||
You have to modify your dwl launch script in order for this patch to work.
|
||||
Example dwl launch script:
|
||||
```sh
|
||||
do=true
|
||||
while $do || [ -f /tmp/restart_dwl ]; do
|
||||
do=false
|
||||
rm -rf /tmp/restart_dwl > /dev/null 2>&1
|
||||
dwl
|
||||
done
|
||||
```
|
||||
It's a do-while that checks if **/tmp/restart_dwl** exists after the first run of dwl.
|
||||
If this file exists delete it and start dwl again.
|
||||
|
||||
### Download
|
||||
- [2022-10-27](https://github.com/djpohly/dwl/compare/main...krypciak:patch-restartdwl.patch)
|
||||
|
||||
### Authors
|
||||
- [krypciak](https://github.com/krypciak)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
All floating windows become tiling when switching to a different layout.
|
||||
|
||||
### Download
|
||||
- [2020-08-28](https://github.com/djpohly/dwl/compare/main...Stivvo:restoreTiling.patch)
|
||||
|
||||
### Authors
|
||||
- [Stivvo](https://github.com/Stivvo)
|
||||
@@ -0,0 +1,11 @@
|
||||
### Description
|
||||
Add a rule to clients to spawn them [sticky](sticky) on start up.
|
||||
I personally use it to make [dragon](https://github.com/mwh/dragon) show up on all tags.
|
||||
|
||||
### Download
|
||||
Apply on top of [sticky patch](sticky).
|
||||
|
||||
- [2023-05-27](https://github.com/dm1tz/dwl/compare/04-sticky...NikitaIvanovV:stickyrule.patch)
|
||||
|
||||
### Authors
|
||||
- [Nikita Ivanov](https://github.com/NikitaIvanovV)
|
||||
@@ -0,0 +1,8 @@
|
||||
### Description
|
||||
Implements just enough of the `sway-ipc` protocol to facilitate status bars. Tested with `waybar` and `rootbar`.
|
||||
|
||||
### Download
|
||||
- [2022-06-08](https://github.com/djpohly/dwl/compare/main...StratusFearMe21:main.patch)
|
||||
|
||||
### Authors
|
||||
- [Isaac Mills](https://github.com/StratusFearMe21)
|
||||
@@ -0,0 +1,10 @@
|
||||
### Description
|
||||
Add a tab bar or window title to the top or bottom of windows.
|
||||
|
||||
**This is the old version of the `tab` patch. Deprecated because the [new version](https://codeberg.org/dwl/dwl-patches/raw/branch-main/patches/tab) is significantly more efficient and well-written than this, and it better adheres to the suckless philosophy.**
|
||||
|
||||
### Download
|
||||
- [2024-03-15](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/tab/tab.patch)
|
||||
|
||||
### Authors
|
||||
- [dev-gm](https://codeberg.org/dev-gm)
|
||||
@@ -0,0 +1,461 @@
|
||||
From b624206781513cdff1b9609fc5ac4b848094e1b4 Mon Sep 17 00:00:00 2001
|
||||
From: Gavin M <github@gavinm.us>
|
||||
Date: Fri, 15 Mar 2024 16:37:23 -0500
|
||||
Subject: [PATCH] Tabbed patch
|
||||
|
||||
---
|
||||
Makefile | 2 +-
|
||||
config.def.h | 18 +++-
|
||||
dwl.c | 276 +++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
3 files changed, 281 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/Makefile b/Makefile
|
||||
index a67fdd3..182eb87 100644
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -9,7 +9,7 @@ DWLDEVCFLAGS = -g -pedantic -Wall -Wextra -Wdeclaration-after-statement -Wno-unu
|
||||
-Werror=strict-prototypes -Werror=implicit -Werror=return-type -Werror=incompatible-pointer-types -Wfloat-conversion
|
||||
|
||||
# CFLAGS / LDFLAGS
|
||||
-PKGS = wlroots wayland-server xkbcommon libinput $(XLIBS)
|
||||
+PKGS = wlroots wayland-server xkbcommon libinput cairo pangocairo $(XLIBS)
|
||||
DWLCFLAGS = `$(PKG_CONFIG) --cflags $(PKGS)` $(DWLCPPFLAGS) $(DWLDEVCFLAGS) $(CFLAGS)
|
||||
LDLIBS = `$(PKG_CONFIG) --libs $(PKGS)` $(LIBS)
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 9009517..1ca270f 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -7,6 +7,16 @@
|
||||
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 const double title_border_width = 0.75;
|
||||
+static const unsigned int title_padding = 11;
|
||||
+static const int title_top = 0;
|
||||
+static const LayoutType floating_title_type = LAYOUT_TYPE_LABEL;
|
||||
+static const char title_font[] = "Dejavu Sans Mono 10.5";
|
||||
+static const float title_font_color[] = COLOR(0xffffffff);
|
||||
+static const float title_focus_bg[] = COLOR(0x3b3b3bff);
|
||||
+static const float title_root_bg[] = COLOR(0x131313ff);
|
||||
+static const float title_urgent_bg[] = COLOR(0x00ff00ff);
|
||||
+static const float title_border_color[] = COLOR(0x3b3b3bff);
|
||||
static const float rootcolor[] = COLOR(0x222222ff);
|
||||
static const float bordercolor[] = COLOR(0x444444ff);
|
||||
static const float focuscolor[] = COLOR(0x005577ff);
|
||||
@@ -30,10 +40,10 @@ static const Rule rules[] = {
|
||||
|
||||
/* layout(s) */
|
||||
static const Layout layouts[] = {
|
||||
- /* symbol arrange function */
|
||||
- { "[]=", tile },
|
||||
- { "><>", NULL }, /* no layout function means floating behavior */
|
||||
- { "[M]", monocle },
|
||||
+ /* symbol type render_only_top arrange function */
|
||||
+ { "[]=", LAYOUT_TYPE_NONE, 0, tile },
|
||||
+ { "><>", LAYOUT_TYPE_LABEL, 0, NULL }, /* no layout function means floating behavior */
|
||||
+ { "[M]", LAYOUT_TYPE_TABS_ONLY_MULTIPLE_CLIENTS, 1, monocle },
|
||||
};
|
||||
|
||||
/* monitors */
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index 5867b0c..e613d17 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -2,6 +2,11 @@
|
||||
* See LICENSE file for copyright and license details.
|
||||
*/
|
||||
#include <getopt.h>
|
||||
+#include <cairo/cairo.h>
|
||||
+#include <pango/pangocairo.h>
|
||||
+#include <pango/pango-font.h>
|
||||
+#include <pango/pango-layout.h>
|
||||
+#include <libdrm/drm_fourcc.h>
|
||||
#include <libinput.h>
|
||||
#include <linux/input-event-codes.h>
|
||||
#include <signal.h>
|
||||
@@ -13,8 +18,10 @@
|
||||
#include <wayland-server-core.h>
|
||||
#include <wlr/backend.h>
|
||||
#include <wlr/backend/libinput.h>
|
||||
+#include <wlr/interfaces/wlr_buffer.h>
|
||||
#include <wlr/render/allocator.h>
|
||||
#include <wlr/render/wlr_renderer.h>
|
||||
+#include <wlr/types/wlr_buffer.h>
|
||||
#include <wlr/types/wlr_compositor.h>
|
||||
#include <wlr/types/wlr_cursor.h>
|
||||
#include <wlr/types/wlr_cursor_shape_v1.h>
|
||||
@@ -110,6 +117,7 @@ typedef struct {
|
||||
struct wlr_scene_tree *scene;
|
||||
struct wlr_scene_rect *border[4]; /* top, bottom, left, right */
|
||||
struct wlr_scene_tree *scene_surface;
|
||||
+ struct wlr_scene_buffer *titlebar;
|
||||
struct wl_list link;
|
||||
struct wl_list flink;
|
||||
union {
|
||||
@@ -137,7 +145,7 @@ typedef struct {
|
||||
#endif
|
||||
unsigned int bw;
|
||||
uint32_t tags;
|
||||
- int isfloating, isurgent, isfullscreen;
|
||||
+ int isfloating, isurgent, isfullscreen, titleisinit, istabbed;
|
||||
uint32_t resize; /* configure serial of a pending resize */
|
||||
} Client;
|
||||
|
||||
@@ -179,8 +187,17 @@ typedef struct {
|
||||
struct wl_listener surface_commit;
|
||||
} LayerSurface;
|
||||
|
||||
+typedef enum {
|
||||
+ LAYOUT_TYPE_NONE,
|
||||
+ LAYOUT_TYPE_LABEL,
|
||||
+ LAYOUT_TYPE_TABS_ONLY_MULTIPLE_CLIENTS,
|
||||
+ LAYOUT_TYPE_TABS_ALWAYS
|
||||
+} LayoutType;
|
||||
+
|
||||
typedef struct {
|
||||
const char *symbol;
|
||||
+ LayoutType type;
|
||||
+ int render_top_only;
|
||||
void (*arrange)(Monitor *);
|
||||
} Layout;
|
||||
|
||||
@@ -282,6 +299,7 @@ static void focusclient(Client *c, int lift);
|
||||
static void focusmon(const Arg *arg);
|
||||
static void focusstack(const Arg *arg);
|
||||
static Client *focustop(Monitor *m);
|
||||
+static Client *focustop_onlytiled(Monitor *m, int onlytiled);
|
||||
static void fullscreennotify(struct wl_listener *listener, void *data);
|
||||
static void handlesig(int signo);
|
||||
static void incnmaster(const Arg *arg);
|
||||
@@ -309,6 +327,7 @@ static void pointerfocus(Client *c, struct wlr_surface *surface,
|
||||
static void printstatus(void);
|
||||
static void quit(const Arg *arg);
|
||||
static void rendermon(struct wl_listener *listener, void *data);
|
||||
+static void rendertitlebar(Client *client);
|
||||
static void requestdecorationmode(struct wl_listener *listener, void *data);
|
||||
static void requeststartdrag(struct wl_listener *listener, void *data);
|
||||
static void requestmonstate(struct wl_listener *listener, void *data);
|
||||
@@ -349,6 +368,7 @@ static void xytonode(double x, double y, struct wlr_surface **psurface,
|
||||
static void zoom(const Arg *arg);
|
||||
|
||||
/* variables */
|
||||
+static int title_height;
|
||||
static const char broken[] = "broken";
|
||||
static pid_t child_pid = -1;
|
||||
static int locked;
|
||||
@@ -973,6 +993,7 @@ createnotify(struct wl_listener *listener, void *data)
|
||||
c = xdg_surface->data = ecalloc(1, sizeof(*c));
|
||||
c->surface.xdg = xdg_surface;
|
||||
c->bw = borderpx;
|
||||
+ c->titleisinit = c->istabbed = 0;
|
||||
|
||||
wlr_xdg_toplevel_set_wm_capabilities(xdg_surface->toplevel,
|
||||
WLR_XDG_TOPLEVEL_WM_CAPABILITIES_FULLSCREEN);
|
||||
@@ -1360,6 +1381,22 @@ focustop(Monitor *m)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+Client *
|
||||
+focustop_onlytiled(Monitor *m, int onlytiled)
|
||||
+{
|
||||
+ Client *c;
|
||||
+ if (!m)
|
||||
+ return NULL;
|
||||
+ wl_list_for_each(c, &fstack, flink) {
|
||||
+ if (VISIBLEON(c, m)) {
|
||||
+ if ((onlytiled == 1 && c->isfloating) || (onlytiled == 2 && (!c->isfloating || !m->lt[m->sellt]->arrange)))
|
||||
+ continue;
|
||||
+ return c;
|
||||
+ }
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
void
|
||||
fullscreennotify(struct wl_listener *listener, void *data)
|
||||
{
|
||||
@@ -2003,6 +2040,195 @@ skip:
|
||||
wlr_output_state_finish(&pending);
|
||||
}
|
||||
|
||||
+struct text_buffer {
|
||||
+ struct wlr_buffer base;
|
||||
+ void *data;
|
||||
+ uint32_t format;
|
||||
+ size_t stride;
|
||||
+};
|
||||
+
|
||||
+static void text_buffer_destroy(struct wlr_buffer *wlr_buffer) {
|
||||
+ struct text_buffer *buffer = wl_container_of(wlr_buffer, buffer, base);
|
||||
+ free(buffer->data);
|
||||
+ free(buffer);
|
||||
+}
|
||||
+
|
||||
+static bool text_buffer_begin_data_ptr_access(struct wlr_buffer *wlr_buffer,
|
||||
+ uint32_t flags, void **data, uint32_t *format, size_t *stride) {
|
||||
+ struct text_buffer *buffer = wl_container_of(wlr_buffer, buffer, base);
|
||||
+ if(data != NULL) {
|
||||
+ *data = (void *)buffer->data;
|
||||
+ }
|
||||
+ if(format != NULL) {
|
||||
+ *format = buffer->format;
|
||||
+ }
|
||||
+ if(stride != NULL) {
|
||||
+ *stride = buffer->stride;
|
||||
+ }
|
||||
+ return true;
|
||||
+}
|
||||
+
|
||||
+static void text_buffer_end_data_ptr_access(struct wlr_buffer *wlr_buffer) {
|
||||
+ // This space is intentionally left blank
|
||||
+}
|
||||
+
|
||||
+static const struct wlr_buffer_impl text_buffer_impl = {
|
||||
+ .destroy = text_buffer_destroy,
|
||||
+ .begin_data_ptr_access = text_buffer_begin_data_ptr_access,
|
||||
+ .end_data_ptr_access = text_buffer_end_data_ptr_access,
|
||||
+};
|
||||
+
|
||||
+static struct text_buffer *text_buffer_create(uint32_t width, uint32_t height, uint32_t stride) {
|
||||
+ struct text_buffer *buffer = calloc(1, sizeof(*buffer));
|
||||
+ if (buffer == NULL) {
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ wlr_buffer_init(&buffer->base, &text_buffer_impl, width, height);
|
||||
+ buffer->format = DRM_FORMAT_ARGB8888;
|
||||
+ buffer->stride = stride;
|
||||
+
|
||||
+ buffer->data = malloc(buffer->stride * height);
|
||||
+ if (buffer->data == NULL) {
|
||||
+ free(buffer);
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ return buffer;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+rendertitlebar(Client *c)
|
||||
+{
|
||||
+ struct wl_list *init_destroy, *cursor_destroy;
|
||||
+ cairo_surface_t *surface;
|
||||
+ cairo_status_t status;
|
||||
+ cairo_t *cr;
|
||||
+ PangoFontDescription *desc;
|
||||
+ PangoLayout *layout;
|
||||
+ LayoutType title_type;
|
||||
+ Client *l, *sel;
|
||||
+ unsigned int len, tabsize, i;
|
||||
+ const char *title;
|
||||
+ const float *color;
|
||||
+ unsigned char *data;
|
||||
+ int stride;
|
||||
+ struct text_buffer *text_buffer;
|
||||
+ void *data_ptr;
|
||||
+
|
||||
+ if (!c || !c->scene || !c->mon || !selmon || (!VISIBLEON(c, selmon) && c->mon == selmon))
|
||||
+ return;
|
||||
+
|
||||
+ if (c->titleisinit) {
|
||||
+ init_destroy = cursor_destroy = &c->titlebar->node.events.destroy.listener_list;
|
||||
+ do {
|
||||
+ cursor_destroy = cursor_destroy->next;
|
||||
+ } while (cursor_destroy && cursor_destroy != init_destroy);
|
||||
+ if (!cursor_destroy) {
|
||||
+ return;
|
||||
+ }
|
||||
+ wlr_scene_node_destroy(&c->titlebar->node);
|
||||
+ }
|
||||
+ c->titleisinit = c->istabbed = 0;
|
||||
+
|
||||
+ sel = focustop_onlytiled(c->mon, c->isfloating + 1);
|
||||
+
|
||||
+ if (c->isfullscreen)
|
||||
+ return;
|
||||
+ title_type = c->isfloating ? floating_title_type : c->mon->lt[c->mon->sellt]->type;
|
||||
+
|
||||
+ if (title_type == LAYOUT_TYPE_TABS_ONLY_MULTIPLE_CLIENTS || title_type == LAYOUT_TYPE_TABS_ALWAYS) {
|
||||
+ len = 0;
|
||||
+ wl_list_for_each(l, &clients, link) {
|
||||
+ if (VISIBLEON(l, c->mon) && l->isfloating == c->isfloating)
|
||||
+ len++;
|
||||
+ }
|
||||
+ if (title_type == LAYOUT_TYPE_TABS_ONLY_MULTIPLE_CLIENTS && len <= 1)
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ if (c->mon->lt[c->mon->sellt]->render_top_only == 1 && !c->isfloating && c != sel) {
|
||||
+ c->istabbed = 1;
|
||||
+ return;
|
||||
+ } /*else if (c->mon->lt[c->mon->sellt]->render_top_only == 2 && c != sel) {
|
||||
+ c->istabbed = 1;
|
||||
+ return;
|
||||
+ }*/
|
||||
+
|
||||
+ if (title_type == LAYOUT_TYPE_NONE)
|
||||
+ return;
|
||||
+
|
||||
+ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, c->geom.width, title_height);
|
||||
+ if ((status = cairo_surface_status(surface)) != CAIRO_STATUS_SUCCESS) {
|
||||
+ wlr_log(WLR_ERROR, "cairo_image_surface_create failed: %s",
|
||||
+ cairo_status_to_string(status));
|
||||
+ return;
|
||||
+ }
|
||||
+ cr = cairo_create(surface);
|
||||
+ desc = pango_font_description_from_string(title_font);
|
||||
+ layout = pango_cairo_create_layout(cr);
|
||||
+ pango_layout_set_font_description(layout, desc);
|
||||
+ pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_NONE);
|
||||
+
|
||||
+ cairo_set_line_width(cr, title_border_width);
|
||||
+
|
||||
+ if (title_type == LAYOUT_TYPE_LABEL) {
|
||||
+ cairo_rectangle(cr, 0, 0, c->geom.width, title_height);
|
||||
+ cairo_set_source_rgba(cr, title_focus_bg[0], title_focus_bg[1], title_focus_bg[2], title_focus_bg[3]);
|
||||
+ cairo_fill_preserve(cr);
|
||||
+ cairo_set_source_rgba(cr, title_border_color[0], title_border_color[1], title_border_color[2], title_border_color[3]);
|
||||
+ cairo_stroke(cr);
|
||||
+ cairo_set_source_rgba(cr, title_font_color[0], title_font_color[1], title_font_color[2], title_font_color[3]);
|
||||
+ title = client_get_title(c);
|
||||
+ pango_layout_set_text(layout, title ? title : " ", (c->geom.width - title_padding) * PANGO_SCALE);
|
||||
+ cairo_move_to(cr, title_padding, 0);
|
||||
+ pango_cairo_show_layout(cr, layout);
|
||||
+ } else {
|
||||
+ tabsize = c->geom.width / len;
|
||||
+ i = 0;
|
||||
+ wl_list_for_each(l, &clients, link) {
|
||||
+ if (VISIBLEON(l, c->mon) && l->isfloating == c->isfloating) {
|
||||
+ cairo_rectangle(cr, i * tabsize, 0, (i + 1) * tabsize, title_height);
|
||||
+ color = (l == sel) ? title_focus_bg
|
||||
+ : (c->isurgent ? title_urgent_bg : title_root_bg);
|
||||
+ cairo_set_source_rgba(cr, color[0], color[1], color[2], color[3]);
|
||||
+ cairo_fill_preserve(cr);
|
||||
+ cairo_set_source_rgba(cr, title_border_color[0], title_border_color[1], title_border_color[2], title_border_color[3]);
|
||||
+ cairo_stroke(cr);
|
||||
+ cairo_set_source_rgba(cr, title_font_color[0], title_font_color[1], title_font_color[2], title_font_color[3]);
|
||||
+ title = client_get_title(l);
|
||||
+ pango_layout_set_text(layout, title ? title : " ", (tabsize - title_padding) * PANGO_SCALE);
|
||||
+ cairo_move_to(cr, (i * tabsize) + title_padding, 0);
|
||||
+ pango_cairo_show_layout(cr, layout);
|
||||
+ i++;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ data = cairo_image_surface_get_data(surface);
|
||||
+ stride = cairo_image_surface_get_stride(surface);
|
||||
+ text_buffer = text_buffer_create(c->geom.width, title_height, stride);
|
||||
+
|
||||
+ if(!wlr_buffer_begin_data_ptr_access(&text_buffer->base,
|
||||
+ WLR_BUFFER_DATA_PTR_ACCESS_WRITE, &data_ptr, NULL, NULL)) {
|
||||
+ wlr_log(WLR_ERROR, "%s", "Failed to get pointer access to text buffer");
|
||||
+ return;
|
||||
+ }
|
||||
+ memcpy(data_ptr, data, stride * title_height);
|
||||
+ wlr_buffer_end_data_ptr_access(&text_buffer->base);
|
||||
+ cairo_surface_destroy(surface);
|
||||
+
|
||||
+ c->titlebar = wlr_scene_buffer_create(c->scene, &text_buffer->base);
|
||||
+ c->titleisinit = c->istabbed = 1;
|
||||
+
|
||||
+ wlr_scene_node_set_position(&c->titlebar->node, 0, !title_top ? c->geom.height - title_height : 0);
|
||||
+ wlr_scene_node_raise_to_top(&c->titlebar->node);
|
||||
+
|
||||
+ pango_font_description_free(desc);
|
||||
+ g_object_unref(layout);
|
||||
+ cairo_destroy(cr);
|
||||
+}
|
||||
+
|
||||
void
|
||||
requestdecorationmode(struct wl_listener *listener, void *data)
|
||||
{
|
||||
@@ -2036,24 +2262,30 @@ resize(Client *c, struct wlr_box geo, int interact)
|
||||
{
|
||||
struct wlr_box *bbox = interact ? &sgeom : &c->mon->w;
|
||||
struct wlr_box clip;
|
||||
+ unsigned int th;
|
||||
+ int draw_borders = 1;
|
||||
client_set_bounds(c, geo.width, geo.height);
|
||||
c->geom = geo;
|
||||
+ c->bw = draw_borders ? borderpx : 0;
|
||||
applybounds(c, bbox);
|
||||
|
||||
+ rendertitlebar(c);
|
||||
+ th = c->istabbed ? title_height : c->bw;
|
||||
+
|
||||
/* Update scene-graph, including borders */
|
||||
wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y);
|
||||
- wlr_scene_node_set_position(&c->scene_surface->node, c->bw, c->bw);
|
||||
- wlr_scene_rect_set_size(c->border[0], c->geom.width, c->bw);
|
||||
- wlr_scene_rect_set_size(c->border[1], c->geom.width, c->bw);
|
||||
- wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - 2 * c->bw);
|
||||
- wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - 2 * c->bw);
|
||||
- wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - c->bw);
|
||||
- wlr_scene_node_set_position(&c->border[2]->node, 0, c->bw);
|
||||
- wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, c->bw);
|
||||
+ wlr_scene_node_set_position(&c->scene_surface->node, c->bw, title_top ? th : c->bw);
|
||||
+ wlr_scene_rect_set_size(c->border[0], c->geom.width, (title_top && c->istabbed) ? 0 : c->bw);
|
||||
+ wlr_scene_rect_set_size(c->border[1], c->geom.width, (!title_top && c->istabbed) ? 0 : c->bw);
|
||||
+ wlr_scene_rect_set_size(c->border[2], c->bw, c->geom.height - (c->bw + th));
|
||||
+ wlr_scene_rect_set_size(c->border[3], c->bw, c->geom.height - (c->bw + th));
|
||||
+ wlr_scene_node_set_position(&c->border[1]->node, 0, c->geom.height - (title_top ? c->bw : th));
|
||||
+ wlr_scene_node_set_position(&c->border[2]->node, 0, title_top ? th : c->bw);
|
||||
+ wlr_scene_node_set_position(&c->border[3]->node, c->geom.width - c->bw, title_top ? th : c->bw);
|
||||
|
||||
/* this is a no-op if size hasn't changed */
|
||||
c->resize = client_set_size(c, c->geom.width - 2 * c->bw,
|
||||
- c->geom.height - 2 * c->bw);
|
||||
+ c->geom.height - (c->bw + th));
|
||||
client_get_clip(c, &clip);
|
||||
wlr_scene_subsurface_tree_set_clip(&c->scene_surface->node, &clip);
|
||||
}
|
||||
@@ -2274,6 +2506,11 @@ setup(void)
|
||||
|
||||
int i, sig[] = {SIGCHLD, SIGINT, SIGTERM, SIGPIPE};
|
||||
struct sigaction sa = {.sa_flags = SA_RESTART, .sa_handler = handlesig};
|
||||
+ cairo_surface_t *surface;
|
||||
+ cairo_t *cr;
|
||||
+ PangoFontDescription *desc;
|
||||
+ PangoLayout *layout;
|
||||
+
|
||||
sigemptyset(&sa.sa_mask);
|
||||
|
||||
for (i = 0; i < (int)LENGTH(sig); i++)
|
||||
@@ -2506,6 +2743,24 @@ setup(void)
|
||||
|
||||
wlr_scene_set_presentation(scene, wlr_presentation_create(dpy, backend));
|
||||
|
||||
+ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0);
|
||||
+
|
||||
+ cr = cairo_create(surface);
|
||||
+
|
||||
+ desc = pango_font_description_from_string(title_font);
|
||||
+ /* Create Pango layout. */
|
||||
+ layout = pango_cairo_create_layout(cr);
|
||||
+ pango_layout_set_font_description(layout, desc);
|
||||
+ pango_layout_set_text(layout, " ", -1);
|
||||
+ /* Set width and height to text size */
|
||||
+ pango_layout_get_pixel_size(layout, NULL, &title_height);
|
||||
+
|
||||
+ /* Cleanup */
|
||||
+ pango_font_description_free (desc);
|
||||
+ cairo_surface_destroy(surface);
|
||||
+ g_object_unref (layout);
|
||||
+ cairo_destroy(cr);
|
||||
+
|
||||
/* Make sure XWayland clients don't connect to the parent X server,
|
||||
* e.g when running in the x11 backend or the wayland backend and the
|
||||
* compositor has Xwayland support */
|
||||
@@ -2978,6 +3233,7 @@ createnotifyx11(struct wl_listener *listener, void *data)
|
||||
c->surface.xwayland = xsurface;
|
||||
c->type = X11;
|
||||
c->bw = borderpx;
|
||||
+ c->titleisinit = c->istabbed = 0;
|
||||
|
||||
/* Listen to the various events it can emit */
|
||||
LISTEN(&xsurface->events.associate, &c->associate, associatex11);
|
||||
--
|
||||
2.44.0
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
### Description
|
||||
|
||||
> This patch is no longer being maintained by me [wochap](https://codeberg.org/wochap), since I'm now using a different patch specific to my use case: https://codeberg.org/wochap/dwl/src/branch/v0.6-b/xkb-rules-switcher/xkb-rules-switcher.patch
|
||||
|
||||
Switch between multiple keyboard layouts at runtime.
|
||||
|
||||
### Download
|
||||
- [git branch](https://codeberg.org/wochap/dwl/src/branch/v0.5/togglekblayout)
|
||||
- [v0.5](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/togglekblayout/togglekblayout.patch)
|
||||
|
||||
### Authors
|
||||
- [wochap](https://codeberg.org/wochap)
|
||||
- [Stivvo](https://github.com/Stivvo)
|
||||
|
||||
@@ -0,0 +1,107 @@
|
||||
From 1bb99c78da484ce6036dc997962ed2f4c0d11208 Mon Sep 17 00:00:00 2001
|
||||
From: wochap <gean.marroquin@gmail.com>
|
||||
Date: Thu, 19 Oct 2023 23:21:49 -0500
|
||||
Subject: [PATCH 1/2] apply main...Stivvo:toggleKbLayout.patch
|
||||
|
||||
---
|
||||
config.def.h | 6 ++++++
|
||||
dwl.c | 20 ++++++++++++++++++++
|
||||
2 files changed, 26 insertions(+)
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index db0babc..caa09ea 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -57,6 +57,11 @@ static const struct xkb_rule_names xkb_rules = {
|
||||
static const int repeat_rate = 25;
|
||||
static const int repeat_delay = 600;
|
||||
|
||||
+/* gb will be set the first time togglekblayout is called, then us.. it is
|
||||
+ * recommended to set the same layout in position 0 of kblayouts and in
|
||||
+ * xkb_rules */
|
||||
+static const char *kblayouts[] = {"us", "gb"};
|
||||
+
|
||||
/* Trackpad */
|
||||
static const int tap_to_click = 1;
|
||||
static const int tap_and_drag = 1;
|
||||
@@ -141,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, XKB_KEY_w, togglekblayout, {0} },
|
||||
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 ef27a1d..25458e6 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -312,6 +312,7 @@ static void tag(const Arg *arg);
|
||||
static void tagmon(const Arg *arg);
|
||||
static void tile(Monitor *m);
|
||||
static void togglefloating(const Arg *arg);
|
||||
+static void togglekblayout(const Arg *arg);
|
||||
static void togglefullscreen(const Arg *arg);
|
||||
static void toggletag(const Arg *arg);
|
||||
static void toggleview(const Arg *arg);
|
||||
@@ -368,6 +369,7 @@ static struct wl_listener lock_listener = {.notify = locksession};
|
||||
|
||||
static struct wlr_seat *seat;
|
||||
static struct wl_list keyboards;
|
||||
+static unsigned int kblayout = 0; /* index of kblayouts */
|
||||
static unsigned int cursor_mode;
|
||||
static Client *grabc;
|
||||
static int grabcx, grabcy; /* client-relative */
|
||||
@@ -2454,6 +2456,24 @@ togglefullscreen(const Arg *arg)
|
||||
setfullscreen(sel, !sel->isfullscreen);
|
||||
}
|
||||
|
||||
+void
|
||||
+togglekblayout(const Arg *arg)
|
||||
+{
|
||||
+ Keyboard *kb;
|
||||
+ struct xkb_rule_names newrule = xkb_rules;
|
||||
+
|
||||
+ kblayout = (kblayout + 1) % LENGTH(kblayouts);
|
||||
+ newrule.layout = kblayouts[kblayout];
|
||||
+ wl_list_for_each(kb, &keyboards, link) {
|
||||
+ 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(kb->device->keyboard, keymap);
|
||||
+ xkb_keymap_unref(keymap);
|
||||
+ xkb_context_unref(context);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void
|
||||
toggletag(const Arg *arg)
|
||||
{
|
||||
--
|
||||
2.42.0
|
||||
|
||||
|
||||
From 3428168a686e2da8ba8a9dc1473350610afaef19 Mon Sep 17 00:00:00 2001
|
||||
From: wochap <gean.marroquin@gmail.com>
|
||||
Date: Thu, 19 Oct 2023 23:46:06 -0500
|
||||
Subject: [PATCH 2/2] fix build
|
||||
|
||||
---
|
||||
dwl.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index 25458e6..090280f 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -2468,7 +2468,7 @@ togglekblayout(const Arg *arg)
|
||||
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(kb->device->keyboard, keymap);
|
||||
+ wlr_keyboard_set_keymap(kb->wlr_keyboard, keymap);
|
||||
xkb_keymap_unref(keymap);
|
||||
xkb_context_unref(context);
|
||||
}
|
||||
--
|
||||
2.42.0
|
||||
@@ -0,0 +1,8 @@
|
||||
### 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)
|
||||
@@ -0,0 +1,102 @@
|
||||
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
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
### Description
|
||||
Adds SIMPLE touchscreen functionality.<br>
|
||||
Currently emulates mouse movement and button presses.<br>
|
||||
|
||||
### Download
|
||||
- [2023-03-31](https://github.com/djpohly/dwl/compare/main...fauxmight:dwl:simple_touch_input.patch)
|
||||
- [2022-10-16](https://github.com/djpohly/dwl/compare/main...Unprex:touch-screen.patch)
|
||||
|
||||
### Authors
|
||||
- [fauxmight](https://github.com/fauxmight)
|
||||
- [Unprex](https://github.com/Unprex)
|
||||
@@ -0,0 +1,25 @@
|
||||
### Description
|
||||
A tiled layout optimized for wide vertical monitors.
|
||||
### Scheme
|
||||
```
|
||||
|---------------------------|
|
||||
| |
|
||||
| |
|
||||
| M |
|
||||
| |
|
||||
| |
|
||||
|---------------------------|
|
||||
| t1 |
|
||||
|---------------------------|
|
||||
| t2 |
|
||||
|---------------------------|
|
||||
| t3 |
|
||||
|---------------------------|
|
||||
```
|
||||
### Download
|
||||
- [2023-06-21](https://github.com/djpohly/dwl/compare/main...Abanoub8:vertile.patch)
|
||||
- [2021-08-15](https://github.com/djpohly/dwl/compare/main...ChausseBenjamin:vertile.patch)
|
||||
|
||||
### Authors
|
||||
- [Benjamin Chausse](https://github.com/ChausseBenjamin)
|
||||
- [Abanoub8](https://github.com/Abanoub8)
|
||||
@@ -0,0 +1,9 @@
|
||||
### Description
|
||||
|
||||
Set cursor theme and size via `XCURSOR_THEME` and `XCURSOR_SIZE` environmental variables.
|
||||
|
||||
### Download
|
||||
- [2023-07-18](https://github.com/djpohly/dwl/compare/main...NikitaIvanovV:xcursor.patch)
|
||||
|
||||
### Authors
|
||||
- [Nikita Ivanov](https://github.com/NikitaIvanovV)
|
||||
Reference in New Issue
Block a user