~ruther/dwl

8cace1921823e250041f7d85d939960f33824451 — Leonardo Hernandez Hernandez 3 years ago 3e6d584
fix crash when the last monitor is disconnected
1 files changed, 16 insertions(+), 5 deletions(-)

M dwl.c
M dwl.c => dwl.c +16 -5
@@ 57,7 57,7 @@
#define MAX(A, B)               ((A) > (B) ? (A) : (B))
#define MIN(A, B)               ((A) < (B) ? (A) : (B))
#define CLEANMASK(mask)         (mask & ~WLR_MODIFIER_CAPS)
#define VISIBLEON(C, M)         ((C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags]))
#define VISIBLEON(C, M)         ((M) && (C)->mon == (M) && ((C)->tags & (M)->tagset[(M)->seltags]))
#define LENGTH(X)               (sizeof X / sizeof X[0])
#define END(A)                  ((A) + LENGTH(A))
#define TAGMASK                 ((1 << LENGTH(tags)) - 1)


@@ 720,10 720,11 @@ cleanupmon(struct wl_listener *listener, void *data)
	wl_list_remove(&m->link);
	wlr_output_layout_remove(output_layout, m->wlr_output);

	nmons = wl_list_length(&mons);
	do // don't switch to disabled mons
		selmon = wl_container_of(mons.prev, selmon, link);
	while (!selmon->wlr_output->enabled && i++ < nmons);
	if ((nmons = wl_list_length(&mons)))
		do // don't switch to disabled mons
			selmon = wl_container_of(mons.prev, selmon, link);
		while (!selmon->wlr_output->enabled && i++ < nmons);

	focusclient(focustop(selmon), 1);
	closemon(m);
	free(m);


@@ 860,6 861,16 @@ createmon(struct wl_listener *listener, void *data)
	wlr_output_layout_add(output_layout, wlr_output, r->x, r->y);
	sgeom = *wlr_output_layout_get_box(output_layout, NULL);

	/* If length == 1 we need update selmon.
	 * Maybe it will change in run(). */
	if (wl_list_length(&mons) == 1) {
		Client *c;
		selmon = m;
		/* If there is any client, set c->mon to this monitor */
		wl_list_for_each(c, &clients, link)
			setmon(c, m, c->tags);
	}

	/* When adding monitors, the geometries of all monitors must be updated */
	wl_list_for_each(m, &mons, link) {
		/* The first monitor in the list is the most recently added */

Do not follow this link