- /* window area geometry */
- if(XineramaIsActive(dpy) && (info = XineramaQueryScreens(dpy, &n))) {
- if(n != nmons) {
- for(c = clients; c; c = c->next)
- if(c->mon >= n)
- c->mon = n - 1;
- if(!(mon = (Monitor *)realloc(mon, sizeof(Monitor) * n)))
- die("fatal: could not realloc() %u bytes\n", sizeof(Monitor) * nmons);
- selmon = NULL;
- }
- for(i = 0; i < n ; i++) {
- /* TODO: consider re-using XineramaScreenInfo */
- mon[i].symbol[0] = '[';
- mon[i].symbol[1] = '0' + info[i].screen_number;
- mon[i].symbol[2] = ']';
- mon[i].symbol[3] = 0;
- if(!selmon) { /* not initialised yet */
- mon[i].mfact = mfact;
- mon[i].showbar = showbar;
- mon[i].topbar = topbar;
- mon[i].tagset[0] = mon[i].tagset[1] = 1;
- }
- mon[i].wx = info[i].x_org;
- mon[i].wy = mon[i].showbar && mon[i].topbar ? info[i].y_org + bh : info[i].y_org;
- mon[i].ww = info[i].width;
- mon[i].wh = mon[i].showbar ? info[i].height - bh : info[i].height;
- mon[i].seltags = 0;
- mon[i].sellt = 0;
- if(mon[i].showbar)
- mon[i].by = mon[i].topbar ? info[i].y_org : mon[i].wy + mon[i].wh;
- else
- mon[i].by = -bh;
- }
- nmons = (unsigned int)n;
- if(!selmon) {
- selmon = &mon[0];
- int di, x, y;
- unsigned int dui;
- Window dummy;
- if(XQueryPointer(dpy, root, &dummy, &dummy, &x, &y, &di, &di, &dui))
- for(i = 0; i < nmons; i++)
- if(INRECT(x, y, info[i].x_org, info[i].y_org, info[i].width, info[i].height)) {
- selmon = &mon[i];
- break;
- }
+ if(XineramaIsActive(dpy))
+ info = XineramaQueryScreens(dpy, &n);
+ for(i = 1, nn = n; i < n; i++)
+ if(info[i - 1].x_org == info[i].x_org && info[i - 1].y_org == info[i].y_org
+ && info[i - 1].width == info[i].width && info[i - 1].height == info[i].height)
+ --nn;
+ n = nn; /* we only consider unique geometries as separate screens */
+#endif /* XINERAMA */
+ /* allocate monitor(s) for the new geometry setup */
+ for(i = 0; i < n; i++) {
+ if(!(m = (Monitor *)malloc(sizeof(Monitor))))
+ die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
+ m->next = newmons;
+ newmons = m;
+ }
+ /* initialise monitor(s) */
+#ifdef XINERAMA
+ if(XineramaIsActive(dpy)) {
+ for(i = 0, m = newmons; m; m = m->next, i++) {
+ m->num = info[i].screen_number;
+ m->mx = m->wx = info[i].x_org;
+ m->my = m->wy = info[i].y_org;
+ m->mw = m->ww = info[i].width;
+ m->mh = m->wh = info[i].height;