diff --git a/patches/restore-monitor/README.md b/patches/restore-monitor/README.md index 8380967..0a21ba8 100644 --- a/patches/restore-monitor/README.md +++ b/patches/restore-monitor/README.md @@ -5,4 +5,5 @@ Moves clients to their old output when it is reattached. - [git branch](https://codeberg.org/eyusupov/dwl/src/branch/restore-monitor) - [2024-04-07](https://codeberg.org/dwl/dwl-patches/raw/branch/main/patches/restore-monitor/restore-monitor.patch) ### Authors -- [eyusupov](https://codeberg.org/eyusupov) \ No newline at end of file +- [eyusupov](https://codeberg.org/eyusupov) +- [6z7y](https://codeberg.org/6z7y) diff --git a/patches/restore-monitor/restore-monitor.patch b/patches/restore-monitor/restore-monitor.patch index 2a818c6..d8e13bb 100644 --- a/patches/restore-monitor/restore-monitor.patch +++ b/patches/restore-monitor/restore-monitor.patch @@ -1,79 +1,95 @@ From e42ca1c539437d3098d80983cfe2ad6f938d7a08 Mon Sep 17 00:00:00 2001 From: Eldar Yusupov Date: Sun, 17 Mar 2024 19:12:29 +0300 -Subject: [PATCH] Restore correct monitor for client when it is reattached +Subject: [PATCH] Restore correct monitor and floating position when reattached --- - dwl.c | 24 ++++++++++++++++++++++-- - 1 file changed, 22 insertions(+), 2 deletions(-) + dwl.c | 33 ++++++++++++++++++++++++++++++--- + 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/dwl.c b/dwl.c -index bf763df..d8d8139 100644 +index 44f3ad9..41548cd 100644 --- a/dwl.c +++ b/dwl.c -@@ -107,6 +107,7 @@ typedef struct { +@@ -106,6 +106,8 @@ typedef struct { unsigned int type; /* XDGShell or X11* */ - struct wlr_box geom; /* layout-relative, includes border */ + Monitor *mon; -+ char *output; ++ char *output; ++ struct wlr_box floatgeom; /* saved geom for floating restore after monitor reconnect */ struct wlr_scene_tree *scene; struct wlr_scene_rect *border[4]; /* top, bottom, left, right */ struct wlr_scene_tree *scene_surface; -@@ -869,6 +870,7 @@ createmon(struct wl_listener *listener, void *data) +@@ -807,6 +809,13 @@ closemon(Monitor *m) + } + + wl_list_for_each(c, &clients, link) { ++ ++ /* Save floating geom now, before destroymon modifies it below. ++ * destroymon subtracts m->w.width from c->geom.x for floating ++ * windows, which corrupts the layout-absolute position we need ++ * to restore on reconnect. */ ++ if (c->isfloating && c->mon == m) c->floatgeom = c->geom; ++ + if (c->isfloating && c->geom.x > m->m.width) + resize(c, (struct wlr_box){.x = c->geom.x - m->w.width, .y = c->geom.y, + .width = c->geom.width, .height = c->geom.height}, 0); +@@ -1045,6 +1054,7 @@ createmon(struct wl_listener *listener, void *data) size_t i; struct wlr_output_state state; Monitor *m; -+ Client *c; ++ Client *c; if (!wlr_output_init_render(wlr_output, alloc, drw)) return; -@@ -938,6 +940,13 @@ createmon(struct wl_listener *listener, void *data) +@@ -1114,6 +1124,15 @@ createmon(struct wl_listener *listener, void *data) wlr_output_layout_add_auto(output_layout, wlr_output); else wlr_output_layout_add(output_layout, wlr_output, m->m.x, m->m.y); -+ -+ wl_list_for_each(c, &clients, link) { -+ if (strcmp(wlr_output->name, c->output) == 0) { -+ c->mon = m; -+ } -+ } -+ updatemons(NULL, NULL); ++ ++ wl_list_for_each(c, &clients, link) { ++ if (!c->output || strcmp(wlr_output->name, c->output) != 0) ++ continue; ++ c->mon = m; ++ if (c->isfloating) ++ resize(c, c->floatgeom, 0); ++ } ++ updatemons(NULL, NULL); } void -@@ -1186,6 +1195,7 @@ destroynotify(struct wl_listener *listener, void *data) - wl_list_remove(&c->map.link); +@@ -1347,7 +1366,8 @@ destroynotify(struct wl_listener *listener, void *data) wl_list_remove(&c->unmap.link); + wl_list_remove(&c->maximize.link); } -+ free(c->output); - free(c); +- free(c); ++ free(c->output); ++ free(c); } -@@ -1618,6 +1628,10 @@ mapnotify(struct wl_listener *listener, void *data) + void +@@ -1792,6 +1812,9 @@ mapnotify(struct wl_listener *listener, void *data) } else { applyrules(c); } -+ c->output = strdup(c->mon->wlr_output->name); -+ if (c->output == NULL) { -+ die("oom"); -+ } ++ c->output = strdup(c->mon->wlr_output->name); ++ if (c->output == NULL) die("oom"); ++ printstatus(); unset_fullscreen: -@@ -2565,8 +2579,14 @@ void +@@ -2705,8 +2728,12 @@ void tagmon(const Arg *arg) { Client *sel = focustop(selmon); - if (sel) - setmon(sel, dirtomon(arg->i), 0); -+ if (!sel) -+ return; -+ setmon(sel, dirtomon(arg->i), 0); -+ free(sel->output); -+ sel->output = strdup(sel->mon->wlr_output->name); -+ if (sel->output == NULL) { -+ die("oom"); -+ } ++ if (!sel) return; ++ ++ setmon(sel, dirtomon(arg->i), 0); ++ free(sel->output); ++ sel->output = strdup(sel->mon->wlr_output->name); ++ if (sel->output == NULL) die("oom"); } void