mirror of
https://codeberg.org/dwl/dwl-patches.git
synced 2025-10-26 17:54:17 +00:00
Compare commits
2 Commits
6bbc99d458
...
d8c1f707cc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d8c1f707cc | ||
|
|
af8902cb15 |
29
patches/fullscreenadaptivesync/README.md
Normal file
29
patches/fullscreenadaptivesync/README.md
Normal file
@ -0,0 +1,29 @@
|
||||
### Description
|
||||
|
||||
# fullscreenadaptivesync — Enables adaptive sync/VRR when a client is fullscreen.
|
||||
|
||||
Adds a function that automatically enables adaptive sync/VRR when a fullscreen client is detected, and disables it once the client exits fullscreen.
|
||||
|
||||
---
|
||||
|
||||
1. **Why**
|
||||
- Some VRR implementations can introduce distracting flickering when the display’s refresh rate is synced with the application’s framerate. While VRR is useful for some applications (especially fullscreen games), this patch automates the toggling of VRR whenever a client enters or exits fullscreen.
|
||||
|
||||
2. **Requirements**
|
||||
- A FreeSync/G-Sync capable monitor
|
||||
- GPU/driver support for adaptive sync
|
||||
|
||||
3. **How it works**
|
||||
- When a client enters fullscreen, adaptive sync is automatically enabled.
|
||||
- When the client exits fullscreen, adaptive sync is disabled again.
|
||||
|
||||
4. **togglefullscreenadaptivesync**
|
||||
- Adds a switch to enable or disable the fullscreenadaptivesync behavior.
|
||||
- Enabled by default.
|
||||
|
||||
### Download
|
||||
- [git branch](https://codeberg.org/julmajustus/dwl/src/branch/fullscreenadaptivesync)
|
||||
- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch)
|
||||
|
||||
### Authors
|
||||
- [julmajustus](https://codeberg.org/julmajustus)
|
||||
122
patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch
Normal file
122
patches/fullscreenadaptivesync/fullscreenadaptivesync-v0.7.patch
Normal file
@ -0,0 +1,122 @@
|
||||
From c003f450c197a0c960bbb355511f8dca7a35e3c3 Mon Sep 17 00:00:00 2001
|
||||
From: julmajustus <julmajustus@tutanota.com>
|
||||
Date: Sat, 4 Jan 2025 14:24:59 +0200
|
||||
Subject: [PATCH] add fullscreenadaptivesync
|
||||
|
||||
---
|
||||
config.def.h | 1 +
|
||||
dwl.c | 40 ++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 41 insertions(+)
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 22d2171..886f1ab 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -142,6 +142,7 @@ static const Key keys[] = {
|
||||
{ MODKEY, XKB_KEY_space, setlayout, {0} },
|
||||
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_space, togglefloating, {0} },
|
||||
{ MODKEY, XKB_KEY_e, togglefullscreen, {0} },
|
||||
+ { MODKEY, XKB_KEY_F5, togglefullscreenadaptivesync, {0} },
|
||||
{ MODKEY, XKB_KEY_0, view, {.ui = ~0} },
|
||||
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_parenright, tag, {.ui = ~0} },
|
||||
{ MODKEY, XKB_KEY_comma, focusmon, {.i = WLR_DIRECTION_LEFT} },
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index a2711f6..7be05ef 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -322,6 +322,7 @@ static void requeststartdrag(struct wl_listener *listener, void *data);
|
||||
static void requestmonstate(struct wl_listener *listener, void *data);
|
||||
static void resize(Client *c, struct wlr_box geo, int interact);
|
||||
static void run(char *startup_cmd);
|
||||
+static void set_adaptive_sync(Monitor *m, int enabled);
|
||||
static void setcursor(struct wl_listener *listener, void *data);
|
||||
static void setcursorshape(struct wl_listener *listener, void *data);
|
||||
static void setfloating(Client *c, int floating);
|
||||
@@ -340,6 +341,7 @@ static void tagmon(const Arg *arg);
|
||||
static void tile(Monitor *m);
|
||||
static void togglefloating(const Arg *arg);
|
||||
static void togglefullscreen(const Arg *arg);
|
||||
+static void togglefullscreenadaptivesync(const Arg *arg);
|
||||
static void toggletag(const Arg *arg);
|
||||
static void toggleview(const Arg *arg);
|
||||
static void unlocksession(struct wl_listener *listener, void *data);
|
||||
@@ -413,6 +415,8 @@ static struct wlr_box sgeom;
|
||||
static struct wl_list mons;
|
||||
static Monitor *selmon;
|
||||
|
||||
+static int fullscreen_adaptive_sync_enabled = 1;
|
||||
+
|
||||
#ifdef XWAYLAND
|
||||
static void activatex11(struct wl_listener *listener, void *data);
|
||||
static void associatex11(struct wl_listener *listener, void *data);
|
||||
@@ -2269,6 +2273,31 @@ run(char *startup_cmd)
|
||||
wl_display_run(dpy);
|
||||
}
|
||||
|
||||
+void
|
||||
+set_adaptive_sync(Monitor *m, int enable)
|
||||
+{
|
||||
+ struct wlr_output_state state;
|
||||
+ struct wlr_output_configuration_v1 *config;
|
||||
+ struct wlr_output_configuration_head_v1 *config_head;
|
||||
+
|
||||
+ if (!m || !m->wlr_output || !m->wlr_output->enabled
|
||||
+ || !fullscreen_adaptive_sync_enabled)
|
||||
+ return;
|
||||
+
|
||||
+ config = wlr_output_configuration_v1_create();
|
||||
+ config_head = wlr_output_configuration_head_v1_create(config, m->wlr_output);
|
||||
+
|
||||
+ /* Set and commit the adaptive sync state change */
|
||||
+ wlr_output_state_init(&state);
|
||||
+ wlr_output_state_set_adaptive_sync_enabled(&state, enable);
|
||||
+ wlr_output_commit_state(m->wlr_output, &state);
|
||||
+ wlr_output_state_finish(&state);
|
||||
+
|
||||
+ /* Broadcast the adaptive sync state change to output_mgr */
|
||||
+ config_head->state.adaptive_sync_enabled = enable;
|
||||
+ wlr_output_manager_v1_set_configuration(output_mgr, config);
|
||||
+}
|
||||
+
|
||||
void
|
||||
setcursor(struct wl_listener *listener, void *data)
|
||||
{
|
||||
@@ -2332,10 +2361,12 @@ setfullscreen(Client *c, int fullscreen)
|
||||
if (fullscreen) {
|
||||
c->prev = c->geom;
|
||||
resize(c, c->mon->m, 0);
|
||||
+ set_adaptive_sync(c->mon, 1);
|
||||
} else {
|
||||
/* restore previous size instead of arrange for floating windows since
|
||||
* client positions are set by the user and cannot be recalculated */
|
||||
resize(c, c->prev, 0);
|
||||
+ set_adaptive_sync(c->mon, 0);
|
||||
}
|
||||
arrange(c->mon);
|
||||
printstatus();
|
||||
@@ -2739,6 +2770,12 @@ togglefullscreen(const Arg *arg)
|
||||
setfullscreen(sel, !sel->isfullscreen);
|
||||
}
|
||||
|
||||
+void
|
||||
+togglefullscreenadaptivesync(const Arg *arg)
|
||||
+{
|
||||
+ fullscreen_adaptive_sync_enabled = !fullscreen_adaptive_sync_enabled;
|
||||
+}
|
||||
+
|
||||
void
|
||||
toggletag(const Arg *arg)
|
||||
{
|
||||
@@ -2809,6 +2846,9 @@ unmapnotify(struct wl_listener *listener, void *data)
|
||||
setmon(c, NULL, 0);
|
||||
wl_list_remove(&c->flink);
|
||||
}
|
||||
+ /* Toggle adaptive sync off when fullscreen client is unmapped */
|
||||
+ if (c->isfullscreen)
|
||||
+ set_adaptive_sync(selmon, 0);
|
||||
|
||||
wlr_scene_node_destroy(&c->scene->node);
|
||||
printstatus();
|
||||
--
|
||||
2.45.2
|
||||
|
||||
25
patches/simple_scratchpad/README.md
Normal file
25
patches/simple_scratchpad/README.md
Normal file
@ -0,0 +1,25 @@
|
||||
### Description
|
||||
|
||||
# simple_scratchpad — A very simple scratchpad utility.
|
||||
|
||||
Adds functions to add, toggle and remove clients to/from scratchpad client list.
|
||||

|
||||
|
||||
---
|
||||
|
||||
1. **addscratchpad**
|
||||
- Floats client and adds it to scratchpad clients list.
|
||||
|
||||
2. **togglescratchpad**
|
||||
- Shows or hides the clients in scratchpad client list.
|
||||
|
||||
3. **removescratchpad**
|
||||
- Removes client from scratchpad client list.
|
||||
|
||||
|
||||
### Download
|
||||
- [git branch](https://codeberg.org/julmajustus/dwl/src/branch/simple_scratchpad)
|
||||
- [0.7](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/simple_scratchpad/simple_scratchpad-v0.7.patch)
|
||||
|
||||
### Authors
|
||||
- [julmajustus](https://codeberg.org/julmajustus)
|
||||
BIN
patches/simple_scratchpad/demos/simple_scratchpad_demo.gif
Normal file
BIN
patches/simple_scratchpad/demos/simple_scratchpad_demo.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 MiB |
211
patches/simple_scratchpad/simple_scratchpad-v0.7.patch
Normal file
211
patches/simple_scratchpad/simple_scratchpad-v0.7.patch
Normal file
@ -0,0 +1,211 @@
|
||||
From a8d29e03f565b54a68c6c2cb2da103366c627825 Mon Sep 17 00:00:00 2001
|
||||
From: julmajustus <julmajustus@tutanota.com>
|
||||
Date: Sat, 4 Jan 2025 13:22:12 +0200
|
||||
Subject: [PATCH] add simple_scratchpad
|
||||
|
||||
---
|
||||
config.def.h | 3 ++
|
||||
dwl.c | 34 +++++++++++++++++++++--
|
||||
simple_scratchpad.c | 67 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
3 files changed, 102 insertions(+), 2 deletions(-)
|
||||
create mode 100644 simple_scratchpad.c
|
||||
|
||||
diff --git a/config.def.h b/config.def.h
|
||||
index 22d2171..83f19b3 100644
|
||||
--- a/config.def.h
|
||||
+++ b/config.def.h
|
||||
@@ -136,6 +136,9 @@ static const Key keys[] = {
|
||||
{ MODKEY, XKB_KEY_Return, zoom, {0} },
|
||||
{ MODKEY, XKB_KEY_Tab, view, {0} },
|
||||
{ MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_C, killclient, {0} },
|
||||
+ { MODKEY|WLR_MODIFIER_SHIFT, XKB_KEY_Z, addscratchpad, {0} },
|
||||
+ { MODKEY|WLR_MODIFIER_CTRL, XKB_KEY_z, togglescratchpad, {0} },
|
||||
+ { MODKEY, XKB_KEY_z, removescratchpad, {0} },
|
||||
{ MODKEY, XKB_KEY_t, setlayout, {.v = &layouts[0]} },
|
||||
{ MODKEY, XKB_KEY_f, setlayout, {.v = &layouts[1]} },
|
||||
{ MODKEY, XKB_KEY_m, setlayout, {.v = &layouts[2]} },
|
||||
diff --git a/dwl.c b/dwl.c
|
||||
index a2711f6..85f4a51 100644
|
||||
--- a/dwl.c
|
||||
+++ b/dwl.c
|
||||
@@ -141,6 +141,7 @@ typedef struct {
|
||||
uint32_t tags;
|
||||
int isfloating, isurgent, isfullscreen;
|
||||
uint32_t resize; /* configure serial of a pending resize */
|
||||
+ struct wl_list link_temp;
|
||||
} Client;
|
||||
|
||||
typedef struct {
|
||||
@@ -243,6 +244,7 @@ typedef struct {
|
||||
} SessionLock;
|
||||
|
||||
/* function declarations */
|
||||
+static void addscratchpad(const Arg *arg);
|
||||
static void applybounds(Client *c, struct wlr_box *bbox);
|
||||
static void applyrules(Client *c);
|
||||
static void arrange(Monitor *m);
|
||||
@@ -317,6 +319,7 @@ static void printstatus(void);
|
||||
static void powermgrsetmode(struct wl_listener *listener, void *data);
|
||||
static void quit(const Arg *arg);
|
||||
static void rendermon(struct wl_listener *listener, void *data);
|
||||
+static void removescratchpad(const Arg *arg);
|
||||
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);
|
||||
@@ -340,6 +343,7 @@ static void tagmon(const Arg *arg);
|
||||
static void tile(Monitor *m);
|
||||
static void togglefloating(const Arg *arg);
|
||||
static void togglefullscreen(const Arg *arg);
|
||||
+static void togglescratchpad(const Arg *arg);
|
||||
static void toggletag(const Arg *arg);
|
||||
static void toggleview(const Arg *arg);
|
||||
static void unlocksession(struct wl_listener *listener, void *data);
|
||||
@@ -413,6 +417,9 @@ static struct wlr_box sgeom;
|
||||
static struct wl_list mons;
|
||||
static Monitor *selmon;
|
||||
|
||||
+static struct wl_list scratchpad_clients;
|
||||
+static int scratchpad_visible = 1;
|
||||
+
|
||||
#ifdef XWAYLAND
|
||||
static void activatex11(struct wl_listener *listener, void *data);
|
||||
static void associatex11(struct wl_listener *listener, void *data);
|
||||
@@ -432,6 +439,8 @@ static xcb_atom_t netatom[NetLast];
|
||||
/* attempt to encapsulate suck into one file */
|
||||
#include "client.h"
|
||||
|
||||
+#include "simple_scratchpad.c"
|
||||
+
|
||||
/* function implementations */
|
||||
void
|
||||
applybounds(Client *c, struct wlr_box *bbox)
|
||||
@@ -1259,10 +1268,20 @@ void
|
||||
destroynotify(struct wl_listener *listener, void *data)
|
||||
{
|
||||
/* Called when the xdg_toplevel is destroyed. */
|
||||
- Client *c = wl_container_of(listener, c, destroy);
|
||||
+ Client *sc, *c = wl_container_of(listener, c, destroy);
|
||||
wl_list_remove(&c->destroy.link);
|
||||
wl_list_remove(&c->set_title.link);
|
||||
wl_list_remove(&c->fullscreen.link);
|
||||
+ /* Check if destroyed client was part of scratchpad_clients
|
||||
+ * and clean it from the list if so. */
|
||||
+ if (c && wl_list_length(&scratchpad_clients) > 0) {
|
||||
+ wl_list_for_each(sc, &scratchpad_clients, link_temp) {
|
||||
+ if (sc == c) {
|
||||
+ wl_list_remove(&c->link_temp);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
#ifdef XWAYLAND
|
||||
if (c->type != XDGShell) {
|
||||
wl_list_remove(&c->activate.link);
|
||||
@@ -2306,11 +2325,21 @@ setcursorshape(struct wl_listener *listener, void *data)
|
||||
void
|
||||
setfloating(Client *c, int floating)
|
||||
{
|
||||
- Client *p = client_get_parent(c);
|
||||
+ Client *sc, *p = client_get_parent(c);
|
||||
c->isfloating = floating;
|
||||
/* If in floating layout do not change the client's layer */
|
||||
if (!c->mon || !client_surface(c)->mapped || !c->mon->lt[c->mon->sellt]->arrange)
|
||||
return;
|
||||
+ /* Check if unfloated client was part of scratchpad_clients
|
||||
+ * and remove it from scratchpad_clients list if so */
|
||||
+ if (!floating && wl_list_length(&scratchpad_clients) > 0) {
|
||||
+ wl_list_for_each(sc, &scratchpad_clients, link_temp) {
|
||||
+ if (sc == c) {
|
||||
+ wl_list_remove(&c->link_temp);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
wlr_scene_node_reparent(&c->scene->node, layers[c->isfullscreen ||
|
||||
(p && p->isfullscreen) ? LyrFS
|
||||
: c->isfloating ? LyrFloat : LyrTile]);
|
||||
@@ -2534,6 +2563,7 @@ setup(void)
|
||||
*/
|
||||
wl_list_init(&clients);
|
||||
wl_list_init(&fstack);
|
||||
+ wl_list_init(&scratchpad_clients);
|
||||
|
||||
xdg_shell = wlr_xdg_shell_create(dpy, 6);
|
||||
LISTEN_STATIC(&xdg_shell->events.new_toplevel, createnotify);
|
||||
diff --git a/simple_scratchpad.c b/simple_scratchpad.c
|
||||
new file mode 100644
|
||||
index 0000000..381f4b5
|
||||
--- /dev/null
|
||||
+++ b/simple_scratchpad.c
|
||||
@@ -0,0 +1,68 @@
|
||||
+/* ************************************************************************** */
|
||||
+/* */
|
||||
+/* ::: :::::::: */
|
||||
+/* simple_scratchpad.c :+: :+: :+: */
|
||||
+/* +:+ +:+ +:+ */
|
||||
+/* By: jmakkone <jmakkone@student.hive.fi> +#+ +:+ +#+ */
|
||||
+/* +#+#+#+#+#+ +#+ */
|
||||
+/* Created: 2024/12/19 19:35:02 by jmakkone #+# #+# */
|
||||
+/* Updated: 2025/01/04 13:35:50 by jmakkone ### ########.fr */
|
||||
+/* */
|
||||
+/* ************************************************************************** */
|
||||
+
|
||||
+void
|
||||
+addscratchpad(const Arg *arg)
|
||||
+{
|
||||
+ Client *cc, *c = focustop(selmon);
|
||||
+
|
||||
+ if (!c)
|
||||
+ return;
|
||||
+ /* Check if the added client is already a scratchpad client */
|
||||
+ wl_list_for_each(cc, &scratchpad_clients, link_temp) {
|
||||
+ if (cc == c)
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!c->isfloating) {
|
||||
+ setfloating(c, 1);
|
||||
+ }
|
||||
+ wl_list_insert(&scratchpad_clients, &c->link_temp);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+togglescratchpad(const Arg *arg)
|
||||
+{
|
||||
+ Client *c;
|
||||
+ Monitor *m = selmon;
|
||||
+
|
||||
+ scratchpad_visible = !scratchpad_visible;
|
||||
+ if (scratchpad_visible) {
|
||||
+ wl_list_for_each(c, &scratchpad_clients, link_temp) {
|
||||
+ c->mon = m;
|
||||
+ c->tags = m->tagset[m->seltags];
|
||||
+ arrange(m);
|
||||
+ focusclient(c, 1);
|
||||
+ }
|
||||
+ } else {
|
||||
+ wl_list_for_each(c, &scratchpad_clients, link_temp) {
|
||||
+ c->tags = 0;
|
||||
+ focusclient(focustop(m), 1);
|
||||
+ arrange(m);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+removescratchpad(const Arg *arg)
|
||||
+{
|
||||
+ Client *sc, *c = focustop(selmon);
|
||||
+
|
||||
+ if (c && wl_list_length(&scratchpad_clients) > 0) {
|
||||
+ /* Check if c is in scratchpad_clients */
|
||||
+ wl_list_for_each(sc, &scratchpad_clients, link_temp) {
|
||||
+ if (sc == c) {
|
||||
+ wl_list_remove(&c->link_temp);
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
--
|
||||
2.45.2
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user