diff --git a/config.def.h b/config.def.h index 8c1f5ba..982c870 100644 --- a/config.def.h +++ b/config.def.h @@ -28,12 +28,14 @@ static const Layout layouts[] = { * The order in which monitors are defined determines their position. * Non-configured monitors are always added to the left. */ static const MonitorRule monrules[] = { - /* name mfact nmaster scale layout rotate/reflect */ + /* name mfact nmaster scale layout rotate/reflect x y */ /* example of a HiDPI laptop monitor: - { "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL }, + { "eDP-1", 0.5, 1, 2, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0 }, */ + /* the order in which monitors are defined here affects the order in which + * focusmon and tagmon cycle trough the monitors */ /* defaults */ - { NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL }, + { NULL, 0.55, 1, 1, &layouts[0], WL_OUTPUT_TRANSFORM_NORMAL, 0, 0 }, }; /* keyboard */ diff --git a/dwl.c b/dwl.c index 29778d1..c09f598 100644 --- a/dwl.c +++ b/dwl.c @@ -186,6 +186,8 @@ typedef struct { float scale; const Layout *lt; enum wl_output_transform rr; + int x; + int y; } MonitorRule; typedef struct { @@ -814,11 +816,9 @@ createmon(struct wl_listener *listener, void *data) /* This event is raised by the backend when a new output (aka a display or * monitor) becomes available. */ struct wlr_output *wlr_output = data; - Monitor *m; const MonitorRule *r; size_t nlayers; - Monitor *moni, *insertmon = NULL; - int x = 0; + Monitor *m, *moni, *insertmon = NULL; /* The mode is a tuple of (width, height, refresh rate), and each * monitor supports only a specific set of modes. We just pick the @@ -851,12 +851,11 @@ createmon(struct wl_listener *listener, void *data) wl_list_for_each(moni, &mons, link) if (m->position > moni->position) insertmon = moni; - if (insertmon) { - x = insertmon->w.x + insertmon->w.width; + + if (insertmon) /* insertmon is the leftmost monitor to m */ wl_list_insert(&insertmon->link, &m->link); - } else { + else wl_list_insert(&mons, &m->link); - } wlr_output_enable(wlr_output, 1); if (!wlr_output_commit(wlr_output)) @@ -868,13 +867,7 @@ 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(output_layout, wlr_output, x, 0); - wl_list_for_each_reverse(moni, &mons, link) { - /* All monitors to 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); - } + wlr_output_layout_add(output_layout, wlr_output, r->x, r->y); sgeom = *wlr_output_layout_get_box(output_layout, NULL); nlayers = LENGTH(m->layers);