| timplemented different version of updategeom - dwm - [fork] customized build of… | |
| git clone git://src.adamsgaard.dk/dwm | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit 07ad2981337c9154fe84078454e646771b5a3425 | |
| parent f0a4845e7dec3a4c7316311fcf1108148bb29730 | |
| Author: Anselm R Garbe <[email protected]> | |
| Date: Mon, 21 Sep 2009 19:51:17 +0100 | |
| implemented different version of updategeom | |
| Diffstat: | |
| M config.mk | 8 ++++---- | |
| M dwm.c | 234 +++++++++++------------------… | |
| 2 files changed, 89 insertions(+), 153 deletions(-) | |
| --- | |
| diff --git a/config.mk b/config.mk | |
| t@@ -20,10 +20,10 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 ${XINERAMALIBS} | |
| # flags | |
| CPPFLAGS = -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS} | |
| -#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} | |
| -CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} | |
| -#LDFLAGS = -g ${LIBS} | |
| -LDFLAGS = -s ${LIBS} | |
| +CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS} | |
| +#CFLAGS = -std=c99 -pedantic -Wall -Os ${INCS} ${CPPFLAGS} | |
| +LDFLAGS = -g ${LIBS} | |
| +#LDFLAGS = -s ${LIBS} | |
| # Solaris | |
| #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\" | |
| diff --git a/dwm.c b/dwm.c | |
| t@@ -163,6 +163,7 @@ static void clearurgent(Client *c); | |
| static void configure(Client *c); | |
| static void configurenotify(XEvent *e); | |
| static void configurerequest(XEvent *e); | |
| +static Monitor *createmon(void); | |
| static void destroynotify(XEvent *e); | |
| static void detach(Client *c); | |
| static void detachstack(Client *c); | |
| t@@ -592,6 +593,22 @@ configurerequest(XEvent *e) { | |
| XSync(dpy, False); | |
| } | |
| +Monitor * | |
| +createmon(void) { | |
| + Monitor *m; | |
| + | |
| + if(!(m = (Monitor *)calloc(1, sizeof(Monitor)))) | |
| + die("fatal: could not malloc() %u bytes\n", sizeof(Monitor)); | |
| + m->tagset[0] = m->tagset[1] = 1; | |
| + m->mfact = mfact; | |
| + m->showbar = showbar; | |
| + m->topbar = topbar; | |
| + m->lt[0] = &layouts[0]; | |
| + m->lt[1] = &layouts[1 % LENGTH(layouts)]; | |
| + m->ltsymbol = layouts[0].symbol; | |
| + return m; | |
| +} | |
| + | |
| void | |
| destroynotify(XEvent *e) { | |
| Client *c; | |
| t@@ -1005,6 +1022,19 @@ isprotodel(Client *c) { | |
| return ret; | |
| } | |
| +#ifdef XINERAMA | |
| +static Bool | |
| +isuniquegeom(XineramaScreenInfo *unique, size_t len, XineramaScreenInfo *info)… | |
| + unsigned int i; | |
| + | |
| + for(i = 0; i < len; i++) | |
| + if(unique[i].x_org == info->x_org && unique[i].y_org == info->… | |
| + && unique[i].width == info->width && unique[i].height == info-… | |
| + return False; | |
| + return True; | |
| +} | |
| +#endif /* XINERAMA */ | |
| + | |
| void | |
| keypress(XEvent *e) { | |
| unsigned int i; | |
| t@@ -1695,165 +1725,71 @@ updatebarpos(Monitor *m) { | |
| Bool | |
| updategeom(void) { | |
| - int i, j, nn = 1, n = 1; | |
| - Client *c; | |
| - Monitor *newmons = NULL, *m = NULL, *tm; | |
| - | |
| - /* TODO: | |
| - * This function needs to be seriously re-designed: | |
| - * | |
| - * #ifdef XINERAMA | |
| - * 1. Determine number of already existing monitors n | |
| - * 2. Determine number of monitors Xinerama reports nn | |
| - * 3. if(n <= nn) { | |
| - * if(n < nn) { | |
| - * append nn-n monitors to current struct | |
| - * flag dirty | |
| - * } | |
| - * for(i = 0; i < nn; i++) { | |
| - * if(oldgeom != newgeom) { | |
| - * apply newgeom; | |
| - * flag dirty; | |
| - * } | |
| - * } | |
| - * } | |
| - * else { | |
| - * detach all clients | |
| - * destroy current monitor struct | |
| - * create new monitor struct | |
| - * attach all clients to first monitor | |
| - * flag dirty; | |
| - * } | |
| - * return dirty flag to caller | |
| - * if dirty is seen by caller: | |
| - * re-arrange bars/pixmaps | |
| - * arrange() | |
| - * #else | |
| - * don't share between XINERAMA and non-XINERAMA handling if it gets | |
| - * too ugly | |
| - * #endif | |
| - */ | |
| -#ifdef XINERAMA | |
| - XineramaScreenInfo *info = NULL; | |
| - Bool *flags = NULL; | |
| - | |
| - if(XineramaIsActive(dpy)) | |
| - info = XineramaQueryScreens(dpy, &n); | |
| - 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 */ | |
| - /* allocate monitor(s) for the new geometry setup */ | |
| - for(i = 0; i < nn; i++) { | |
| - if(!(m = (Monitor *)malloc(sizeof(Monitor)))) | |
| - die("fatal: could not malloc() %u bytes\n", sizeof(Mon… | |
| - m->next = newmons; | |
| - newmons = m; | |
| - } | |
| - /* initialise monitor(s) */ | |
| + Bool dirty = False; | |
| + | |
| #ifdef XINERAMA | |
| if(XineramaIsActive(dpy)) { | |
| - for(i = 0, m = newmons; m && i < n; i++) { | |
| - if(!flags[i]) { /* only use screens that aren't dublet… | |
| - 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; | |
| + int i, j, n, nn; | |
| + Monitor *m; | |
| + XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); | |
| + XineramaScreenInfo *unique = NULL; | |
| + | |
| + info = XineramaQueryScreens(dpy, &nn); | |
| + for(n = 0, m = mons; m; m = m->next, n++); | |
| + /* only consider unique geometries as separate screens */ | |
| + if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScre… | |
| + die("fatal: could not malloc() %u bytes\n", sizeof(Xin… | |
| + for(i = 0, j = 0; i < nn; i++) | |
| + if(isuniquegeom(unique, j, &info[i])) | |
| + memcpy(&unique[j++], &info[i], sizeof(Xinerama… | |
| + XFree(info); | |
| + nn = j; | |
| + if(n <= nn) { | |
| + for(i = 0; i < (nn - n); i++) { /* new monitors availa… | |
| + for(m = mons; m && m->next; m = m->next); | |
| + if(m) | |
| + m->next = createmon(); | |
| + else | |
| + mons = createmon(); | |
| } | |
| + for(i = 0, m = mons; i < nn && m; m = m->next, i++) | |
| + if(i >= n | |
| + || (unique[i].x_org != m->mx || unique[i].y_or… | |
| + || unique[i].width != m->mw || unique[i].h… | |
| + { | |
| + dirty = True; | |
| + m->num = unique[i].screen_number; | |
| + m->mx = m->wx = unique[i].x_org; | |
| + m->my = m->wy = unique[i].y_org; | |
| + m->mw = m->ww = unique[i].width; | |
| + m->mh = m->wh = unique[i].height; | |
| + updatebarpos(m); | |
| + } | |
| } | |
| - XFree(info); | |
| - free(flags); | |
| + else { /* less monitors available */ | |
| + cleanup(); | |
| + setup(); | |
| + } | |
| + free(unique); | |
| } | |
| else | |
| #endif /* XINERAMA */ | |
| /* default monitor setup */ | |
| { | |
| - m->num = 0; | |
| - m->mx = m->wx = 0; | |
| - m->my = m->wy = 0; | |
| - m->mw = m->ww = sw; | |
| - m->mh = m->wh = sh; | |
| - } | |
| - /* bar geometry setup */ | |
| - for(m = newmons; m; m = m->next) { | |
| - m->sel = m->stack = m->clients = NULL; | |
| - m->seltags = 0; | |
| - m->sellt = 0; | |
| - m->tagset[0] = m->tagset[1] = 1; | |
| - m->mfact = mfact; | |
| - m->showbar = showbar; | |
| - m->topbar = topbar; | |
| - m->lt[0] = &layouts[0]; | |
| - m->lt[1] = &layouts[1 % LENGTH(layouts)]; | |
| - m->ltsymbol = layouts[0].symbol; | |
| - updatebarpos(m); | |
| - } | |
| - /* reassign left over clients of disappeared monitors */ | |
| - for(tm = mons; tm; tm = tm->next) | |
| - while(tm->clients) { | |
| - c = tm->clients; | |
| - tm->clients = c->next; | |
| - detachstack(c); | |
| - c->mon = newmons; | |
| - attach(c); | |
| - attachstack(c); | |
| + if(!mons) | |
| + mons = createmon(); | |
| + if(mons->mw != sw || mons->mh != sh) { | |
| + dirty = True; | |
| + mons->mw = mons->ww = sw; | |
| + mons->mh = mons->wh = sh; | |
| + updatebarpos(mons); | |
| } | |
| - /* select focused monitor */ | |
| - cleanupmons(); | |
| - selmon = mons = newmons; | |
| - selmon = wintomon(root); | |
| - return True; | |
| + } | |
| + if(dirty) { | |
| + selmon = mons; | |
| + selmon = wintomon(root); | |
| + } | |
| + return dirty; | |
| } | |
| void |