|
@@ -221,7 +221,7 @@ static void toggleview(const Arg *arg);
|
|
|
static void unfocus(Client *c);
|
|
static void unfocus(Client *c);
|
|
|
static void unmanage(Client *c, Bool destroyed);
|
|
static void unmanage(Client *c, Bool destroyed);
|
|
|
static void unmapnotify(XEvent *e);
|
|
static void unmapnotify(XEvent *e);
|
|
|
-static void updategeom(void);
|
|
|
|
|
|
|
+static Bool updategeom(void);
|
|
|
static void updatebarpos(Monitor *m);
|
|
static void updatebarpos(Monitor *m);
|
|
|
static void updatebars(void);
|
|
static void updatebars(void);
|
|
|
static void updatenumlockmask(void);
|
|
static void updatenumlockmask(void);
|
|
@@ -535,14 +535,15 @@ configurenotify(XEvent *e) {
|
|
|
if(ev->window == root) {
|
|
if(ev->window == root) {
|
|
|
sw = ev->width;
|
|
sw = ev->width;
|
|
|
sh = ev->height;
|
|
sh = ev->height;
|
|
|
- updategeom();
|
|
|
|
|
- if(dc.drawable != 0)
|
|
|
|
|
- XFreePixmap(dpy, dc.drawable);
|
|
|
|
|
- dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
|
|
|
|
|
- updatebars();
|
|
|
|
|
- for(m = mons; m; m = m->next)
|
|
|
|
|
- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
|
|
|
|
|
- arrange();
|
|
|
|
|
|
|
+ if(updategeom()) {
|
|
|
|
|
+ if(dc.drawable != 0)
|
|
|
|
|
+ XFreePixmap(dpy, dc.drawable);
|
|
|
|
|
+ dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
|
|
|
|
|
+ updatebars();
|
|
|
|
|
+ for(m = mons; m; m = m->next)
|
|
|
|
|
+ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
|
|
|
|
|
+ arrange();
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -1692,26 +1693,73 @@ updatebarpos(Monitor *m) {
|
|
|
m->by = -bh;
|
|
m->by = -bh;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void
|
|
|
|
|
|
|
+Bool
|
|
|
updategeom(void) {
|
|
updategeom(void) {
|
|
|
- int i, n = 1;
|
|
|
|
|
|
|
+ int i, j, nn = 1, n = 1;
|
|
|
Client *c;
|
|
Client *c;
|
|
|
Monitor *newmons = NULL, *m = NULL, *tm;
|
|
Monitor *newmons = NULL, *m = NULL, *tm;
|
|
|
|
|
|
|
|
#ifdef XINERAMA
|
|
#ifdef XINERAMA
|
|
|
- int nn;
|
|
|
|
|
XineramaScreenInfo *info = NULL;
|
|
XineramaScreenInfo *info = NULL;
|
|
|
|
|
+ Bool *flags = NULL;
|
|
|
|
|
|
|
|
if(XineramaIsActive(dpy))
|
|
if(XineramaIsActive(dpy))
|
|
|
info = XineramaQueryScreens(dpy, &n);
|
|
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 */
|
|
|
|
|
|
|
+ flags = (Bool *)malloc(sizeof(Bool) * n);
|
|
|
|
|
+ for(i = 0; i < n; i++)
|
|
|
|
|
+ flags[i] = False;
|
|
|
|
|
+ /* next double-loop seeks any combination of retrieved Xinerama info
|
|
|
|
|
+ * with existing monitors, this is used to avoid unnecessary
|
|
|
|
|
+ * re-allocations of monitor structs */
|
|
|
|
|
+ for(i = 0, nn = n; i < n; i++)
|
|
|
|
|
+ for(j = 0, m = mons; m; m = m->next, j++)
|
|
|
|
|
+ if(!flags[j]) {
|
|
|
|
|
+ if((flags[j] = (
|
|
|
|
|
+ info[i].x_org == m->mx
|
|
|
|
|
+ && info[i].y_org == m->my
|
|
|
|
|
+ && info[i].width == m->mw
|
|
|
|
|
+ && info[i].height == m->mh)
|
|
|
|
|
+ ))
|
|
|
|
|
+ --nn;
|
|
|
|
|
+ }
|
|
|
|
|
+ if(nn == 0) { /* no need to re-allocate monitors */
|
|
|
|
|
+ j = 0;
|
|
|
|
|
+ for(i = 0, m = mons; m; m = m->next, i++) {
|
|
|
|
|
+ m->num = info[i].screen_number;
|
|
|
|
|
+ if(info[i].x_org != m->mx
|
|
|
|
|
+ || info[i].y_org != m->my
|
|
|
|
|
+ || info[i].width != m->mw
|
|
|
|
|
+ || info[i].height != m->mh)
|
|
|
|
|
+ {
|
|
|
|
|
+ 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;
|
|
|
|
|
+ updatebarpos(m);
|
|
|
|
|
+ j++;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ XFree(info);
|
|
|
|
|
+ free(flags);
|
|
|
|
|
+ return j > 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ /* next algorithm only considers unique geometries as separate screens */
|
|
|
|
|
+ for(i = 0; i < n; i++)
|
|
|
|
|
+ flags[i] = False; /* used for ignoring certain monitors */
|
|
|
|
|
+ for(i = 0, nn = n; i < n; i++)
|
|
|
|
|
+ for(j = 0; j < n; j++)
|
|
|
|
|
+ if(i != j && !flags[i]) {
|
|
|
|
|
+ if((flags[i] = (
|
|
|
|
|
+ info[i].x_org == info[j].x_org
|
|
|
|
|
+ && info[i].y_org == info[j].y_org
|
|
|
|
|
+ && info[i].width == info[j].width
|
|
|
|
|
+ && info[i].height == info[j].height)
|
|
|
|
|
+ ))
|
|
|
|
|
+ --nn;
|
|
|
|
|
+ }
|
|
|
#endif /* XINERAMA */
|
|
#endif /* XINERAMA */
|
|
|
/* allocate monitor(s) for the new geometry setup */
|
|
/* allocate monitor(s) for the new geometry setup */
|
|
|
- for(i = 0; i < n; i++) {
|
|
|
|
|
|
|
+ for(i = 0; i < nn; i++) {
|
|
|
if(!(m = (Monitor *)malloc(sizeof(Monitor))))
|
|
if(!(m = (Monitor *)malloc(sizeof(Monitor))))
|
|
|
die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
|
|
die("fatal: could not malloc() %u bytes\n", sizeof(Monitor));
|
|
|
m->next = newmons;
|
|
m->next = newmons;
|
|
@@ -1720,14 +1768,18 @@ updategeom(void) {
|
|
|
/* initialise monitor(s) */
|
|
/* initialise monitor(s) */
|
|
|
#ifdef XINERAMA
|
|
#ifdef XINERAMA
|
|
|
if(XineramaIsActive(dpy)) {
|
|
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;
|
|
|
|
|
|
|
+ for(i = 0, m = newmons; m && i < n; i++) {
|
|
|
|
|
+ if(!flags[i]) { /* only use screens that aren't dublettes */
|
|
|
|
|
+ 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;
|
|
|
|
|
+ m = m->next;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
XFree(info);
|
|
XFree(info);
|
|
|
|
|
+ free(flags);
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
#endif /* XINERAMA */
|
|
#endif /* XINERAMA */
|
|
@@ -1767,6 +1819,7 @@ updategeom(void) {
|
|
|
cleanupmons();
|
|
cleanupmons();
|
|
|
selmon = mons = newmons;
|
|
selmon = mons = newmons;
|
|
|
selmon = wintomon(root);
|
|
selmon = wintomon(root);
|
|
|
|
|
+ return True;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
void
|