Introduction
Introduction Statistics Contact Development Disclaimer Help
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
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.