apply dwm-xinerama-monitors-xorder-6.4.diff

This commit is contained in:
2025-10-06 23:17:39 +02:00
parent b6d063c786
commit 9e3e644c21

12
dwm.c
View File

@@ -2164,6 +2164,16 @@ updateclientlist(void)
(unsigned char *) &(c->win), 1);
}
#ifdef XINERAMA
// Custom comparator: sort monitors by x_org to match physical layout left-to-right
static int
compare_xinerama_x(const void *a, const void *b) {
const XineramaScreenInfo *sa = (const XineramaScreenInfo *)a;
const XineramaScreenInfo *sb = (const XineramaScreenInfo *)b;
return sa->x_org - sb->x_org;
}
#endif /* XINERAMA */
int
updategeom(void)
{
@@ -2180,6 +2190,8 @@ updategeom(void)
for (n = 0, m = mons; m; m = m->next, n++);
/* only consider unique geometries as separate screens */
unique = ecalloc(nn, sizeof(XineramaScreenInfo));
// Sort monitors by x_org so dwm handles screens in left-to-right order
qsort(info, nn, sizeof(XineramaScreenInfo), compare_xinerama_x);
for (i = 0, j = 0; i < nn; i++)
if (isuniquegeom(unique, j, &info[i]))
memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo));