From 537ad7e3fdc23602254ba00ba869eab891be7966 Mon Sep 17 00:00:00 2001 From: Stivvo Date: Sat, 12 Sep 2020 00:13:05 +0200 Subject: Restore floating win position after mon add Compensate the coordinate changes when adding a new monitor. Every test so far confirms that monitors are always added to the left, on top of the list, so every floating window's x coordinate has to be incremented by the width of the new monitor. --- dwl.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/dwl.c b/dwl.c index 414aa59..23a7211 100644 --- a/dwl.c +++ b/dwl.c @@ -195,6 +195,7 @@ static void applyexclusive(struct wlr_box *usable_area, uint32_t anchor, int32_t margin_bottom, int32_t margin_left); static void applyrules(Client *c); static void arrange(Monitor *m); +static void arrangefloat(Monitor *m, int sign); static void arrangelayer(Monitor *m, struct wl_list *list, struct wlr_box *usable_area, bool exclusive); static void arrangelayers(Monitor *m); @@ -469,6 +470,17 @@ arrange(Monitor *m) /* XXX recheck pointer focus here... or in resize()? */ } +void +arrangefloat(Monitor *m, int sign) +{ + Client *c; + wl_list_for_each(c, &clients, link) { + if (c->isfloating) + resize(c, c->geom.x + m->w.width * sign, c->geom.y, + c->geom.width, c->geom.height, 0); + } +} + void arrangelayer(Monitor *m, struct wl_list *list, struct wlr_box *usable_area, bool exclusive) { @@ -693,6 +705,7 @@ cleanupmon(struct wl_listener *listener, void *data) free(m); updatemons(); + arrangefloat(m, -1); } void @@ -821,6 +834,11 @@ createmon(struct wl_listener *listener, void *data) /* When adding monitors, the geometries of all monitors must be updated */ updatemons(); + wl_list_for_each(m, &mons, link) { + /* the first monitor in the list is the most recently added */ + arrangefloat(m, 1); + return; + } } void -- cgit v1.2.3