~ruther/dwl

5668c616161d451e6f20be29b31bbf03f0f398a5 — Stivvo 4 years ago cf7c5ea
Define monitor order with monrules[]

The order in which monitors are defined in monrules[] actually matters.

Monotors that aren't configured in monrules[], it will always be the
leftmost.
2 files changed, 29 insertions(+), 4 deletions(-)

M config.def.h
M dwl.c
M config.def.h => config.def.h +3 -0
@@ 32,6 32,9 @@ static const MonitorRule monrules[] = {
	*/
	/* defaults */
	{ NULL,       0.55, 1,      1,    &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL },
	/* with the outputOder patch, the order in which every monitor is defined
	 * defines its actual position. Non configured monitor, are always added to
	 * the left */
};

/* keyboard */

M dwl.c => dwl.c +26 -4
@@ 175,6 175,7 @@ struct Monitor {
	unsigned int tagset[2];
	double mfact;
	int nmaster;
	int position;
};

typedef struct {


@@ 836,8 837,8 @@ createmon(struct wl_listener *listener, void *data)
	Monitor *m = wlr_output->data = calloc(1, sizeof(*m));
	m->wlr_output = wlr_output;
	m->tagset[0] = m->tagset[1] = 1;
	const MonitorRule *r;
	for (r = monrules; r < END(monrules); r++) {
	m->position = -1;
	for (const MonitorRule *r = monrules; r < END(monrules); r++) {
		if (!r->name || strstr(wlr_output->name, r->name)) {
			m->mfact = r->mfact;
			m->nmaster = r->nmaster;


@@ 846,6 847,7 @@ createmon(struct wl_listener *listener, void *data)
			m->lt[0] = r->lt;
			m->lt[1] = &layouts[LENGTH(layouts) > 1 && r->lt != &layouts[1]];
			wlr_output_set_transform(wlr_output, r->rr);
			m->position = r - monrules;
			break;
		}
	}


@@ 856,7 858,19 @@ createmon(struct wl_listener *listener, void *data)
	m->destroy.notify = cleanupmon;
	wl_signal_add(&wlr_output->events.destroy, &m->destroy);

	wl_list_insert(&mons, &m->link);
	Monitor *moni, *insertmon = NULL;
	int x = 0;
	wl_list_for_each(moni, &mons, link)
		if (m->position > moni->position)
			insertmon = moni;
	if (insertmon) {
		x = insertmon->w.x + insertmon->w.width;
		wl_list_insert(&insertmon->link, &m->link);
		fprintf(stderr, "%s inserted in pos %d\n", m->wlr_output->name, m->position);
	} else {
		wl_list_insert(&mons, &m->link);
		fprintf(stderr, "%s defaulting\n", m->wlr_output->name);
	}

	wlr_output_enable(wlr_output, true);
	if (!wlr_output_commit(wlr_output))


@@ 871,7 885,15 @@ createmon(struct wl_listener *listener, void *data)
	 * display, which Wayland clients can see to find out information about the
	 * output (such as DPI, scale factor, manufacturer, etc).
	 */
	wlr_output_layout_add_auto(output_layout, wlr_output);
	wlr_output_layout_add(output_layout, wlr_output, x, 0);
	wl_list_for_each_reverse(moni, &mons, link) {
		/* all monitors that on the right of the new one must be moved */
		if (moni == m)
			break;
		wlr_output_layout_move(output_layout, moni->wlr_output, moni->w.x + m->wlr_output->width, 0);
		fprintf(stderr, "moved %s to %d", moni->wlr_output->name, moni->w.x + m->wlr_output->width);
	}
	sgeom = *wlr_output_layout_get_box(output_layout, NULL);

	size_t nlayers = LENGTH(m->layers);
	for (size_t i = 0; i < nlayers; ++i)

Do not follow this link