} Layout;
struct Monitor {
- const char *ltsymbol;
+ char ltsymbol[16];
float mfact;
int num;
int by; /* bar geometry */
static void buttonpress(XEvent *e);
static void checkotherwm(void);
static void cleanup(void);
-static void cleanupmons(void);
+static void cleanupmon(Monitor *mon);
static void clearurgent(Client *c);
static void configure(Client *c);
static void configurenotify(XEvent *e);
showhide(m->stack);
focus(NULL);
for(m = mons; m; m = m->next) {
- m->ltsymbol = m->lt[m->sellt]->symbol;
+ strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol);
if(m->lt[m->sellt]->arrange)
m->lt[m->sellt]->arrange(m);
restack(m);
XFreeCursor(dpy, cursor[CurNormal]);
XFreeCursor(dpy, cursor[CurResize]);
XFreeCursor(dpy, cursor[CurMove]);
- cleanupmons();
+ while(mons)
+ cleanupmon(mons);
XSync(dpy, False);
XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime);
}
void
-cleanupmons(void) {
+cleanupmon(Monitor *mon) {
Monitor *m;
- while(mons) {
- m = mons->next;
- XUnmapWindow(dpy, mons->barwin);
- XDestroyWindow(dpy, mons->barwin);
- free(mons);
- mons = m;
+ if(mon == mons)
+ mons = mons->next;
+ else {
+ for(m = mons; m && m->next != mon; m = m->next);
+ m->next = mon->next;
}
+ XUnmapWindow(dpy, mon->barwin);
+ XDestroyWindow(dpy, mon->barwin);
+ free(mon);
}
void
m->topbar = topbar;
m->lt[0] = &layouts[0];
m->lt[1] = &layouts[1 % LENGTH(layouts)];
- m->ltsymbol = layouts[0].symbol;
+ strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol);
return m;
}
void
monocle(Monitor *m) {
- static char ntext[8];
unsigned int n = 0;
Client *c;
for(c = m->clients; c; c = c->next)
if(ISVISIBLE(c))
n++;
- if(n > 0) { /* override layout symbol */
- snprintf(ntext, sizeof ntext, "[%d]", n);
- m->ltsymbol = ntext;
- }
+ if(n > 0) /* override layout symbol */
+ snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n);
for(c = nexttiled(m->clients); c; c = nexttiled(c->next))
resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, False);
}
#ifdef XINERAMA
if(XineramaIsActive(dpy)) {
int i, j, n, nn;
+ Client *c;
Monitor *m;
XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn);
XineramaScreenInfo *unique = NULL;
|| unique[i].width != m->mw || unique[i].height != m->mh))
{
dirty = True;
- m->num = unique[i].screen_number;
+ m->num = i;
m->mx = m->wx = unique[i].x_org;
m->my = m->wy = unique[i].y_org;
m->mw = m->ww = unique[i].width;
updatebarpos(m);
}
}
- else { /* less monitors available */
- cleanup();
- setup();
+ else { /* less monitors available nn < n */
+ for(i = nn; i < n; i++) {
+ for(m = mons; m && m->next; m = m->next);
+ while(m->clients) {
+ dirty = True;
+ c = m->clients;
+ m->clients = c->next;
+ detachstack(c);
+ c->mon = mons;
+ attach(c);
+ attachstack(c);
+ }
+ if(m == selmon)
+ selmon = mons;
+ cleanupmon(m);
+ }
}
free(unique);
}