diff --git a/restore-monitor/restore-monitor.patch b/restore-monitor/restore-monitor.patch new file mode 100644 index 0000000..b9b81ff --- /dev/null +++ b/restore-monitor/restore-monitor.patch @@ -0,0 +1,74 @@ +From 5994fd10cce0eedf95a89406fae0ff5699d0db77 Mon Sep 17 00:00:00 2001 +From: Eldar Yusupov +Date: Sun, 17 Mar 2024 19:12:29 +0300 +Subject: [PATCH] Restore correct montior for client when it is reattached + +--- + dwl.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/dwl.c b/dwl.c +index bf763df..40d03dc 100644 +--- a/dwl.c ++++ b/dwl.c +@@ -107,6 +107,7 @@ typedef struct { + unsigned int type; /* XDGShell or X11* */ + struct wlr_box geom; /* layout-relative, includes border */ + Monitor *mon; ++ char *output; + 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) + size_t i; + struct wlr_output_state state; + Monitor *m; ++ Client *c; + + if (!wlr_output_init_render(wlr_output, alloc, drw)) + return; +@@ -938,6 +940,13 @@ 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); + } + + void +@@ -1186,6 +1195,7 @@ destroynotify(struct wl_listener *listener, void *data) + wl_list_remove(&c->map.link); + wl_list_remove(&c->unmap.link); + } ++ free(c->output); + free(c); + } + +@@ -1618,6 +1628,10 @@ mapnotify(struct wl_listener *listener, void *data) + } else { + applyrules(c); + } ++ c->output = strdup(c->mon->wlr_output->name); ++ if (c->output == NULL) { ++ die("oom"); ++ } + printstatus(); + + unset_fullscreen: +@@ -2567,6 +2581,8 @@ tagmon(const Arg *arg) + Client *sel = focustop(selmon); + if (sel) + setmon(sel, dirtomon(arg->i), 0); ++ free(sel->output); ++ sel->output = strdup(sel->mon->wlr_output->name); + } + + void +-- +2.44.0 +