X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=1909d4baa85ee7df9f4e532753e927a81835e041;hp=59722d344a5475e359ebe8131a1bbd8b2652d2bb;hb=5c4913e9838534e880a1334ddc76c80810019f62;hpb=d702f392742afee69a33fea91494acf8b7153c88 diff --git a/dwm.c b/dwm.c index 59722d3..1909d4b 100644 --- a/dwm.c +++ b/dwm.c @@ -1,4 +1,4 @@ -/* TODO: cleanup nexttiled, ISVISIBLE, etc */ +#define XINULATOR /* debug, simulates dual head */ /* See LICENSE file for copyright and license details. * * dynamic window manager is designed like any other X client as well. It is @@ -45,7 +45,7 @@ #define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) #define CLEANMASK(mask) (mask & ~(numlockmask|LockMask)) #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH)) -#define ISVISIBLE(M, C) ((M) == (C->mon) && (C->tags & M->tagset[M->seltags])) +#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) #define LENGTH(X) (sizeof X / sizeof X[0]) #define MAX(A, B) ((A) > (B) ? (A) : (B)) #define MIN(A, B) ((A) < (B) ? (A) : (B)) @@ -189,7 +189,7 @@ static void mappingnotify(XEvent *e); static void maprequest(XEvent *e); static void monocle(Monitor *m); static void movemouse(const Arg *arg); -static Client *nexttiled(Monitor *m, Client *c); +static Client *nexttiled(Client *c); static void propertynotify(XEvent *e); static void quit(const Arg *arg); static void resize(Client *c, int x, int y, int w, int h); @@ -376,14 +376,14 @@ arrange(void) { void attach(Client *c) { - c->next = selmon->clients; - selmon->clients = c; + c->next = c->mon->clients; + c->mon->clients = c; } void attachstack(Client *c) { - c->snext = selmon->stack; - selmon->stack = c; + c->snext = c->mon->stack; + c->mon->stack = c; } void @@ -550,7 +550,7 @@ configurerequest(XEvent *e) { c->y = sy + (sh / 2 - c->h / 2); /* center in y direction */ if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) configure(c); - if(ISVISIBLE((c->mon), c)) + if(ISVISIBLE(c)) XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); } else @@ -756,8 +756,8 @@ expose(XEvent *e) { void focus(Client *c) { - if(!c || !ISVISIBLE((c->mon), c)) - for(c = selmon->stack; c && !ISVISIBLE(selmon, c); c = c->snext); + if(!c || !ISVISIBLE(c)) + for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); if(selmon->sel && selmon->sel != c) { grabbuttons(selmon->sel, False); XSetWindowBorder(dpy, selmon->sel->win, dc.norm[ColBorder]); @@ -808,17 +808,17 @@ focusstack(const Arg *arg) { if(!selmon->sel) return; if(arg->i > 0) { - for(c = selmon->sel->next; c && !ISVISIBLE(selmon, c); c = c->next); + for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); if(!c) - for(c = selmon->clients; c && !ISVISIBLE(selmon, c); c = c->next); + for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next); } else { for(i = selmon->clients; i != selmon->sel; i = i->next) - if(ISVISIBLE(selmon, i)) + if(ISVISIBLE(i)) c = i; if(!c) for(; i; i = i->next) - if(ISVISIBLE(selmon, i)) + if(ISVISIBLE(i)) c = i; } if(c) { @@ -1045,8 +1045,8 @@ manage(Window w, XWindowAttributes *wa) { c->y = sy + sh - HEIGHT(c); c->x = MAX(c->x, sx); /* only fix client y-offset, if the client center might cover the bar */ - c->y = MAX(c->y, ((selmon->by == 0) && (c->x + (c->w / 2) >= selmon->wx) - && (c->x + (c->w / 2) < selmon->wx + selmon->ww)) ? bh : sy); + c->y = MAX(c->y, ((c->mon->by == 0) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : sy); c->bw = borderpx; } @@ -1102,7 +1102,7 @@ void monocle(Monitor *m) { Client *c; - for(c = nexttiled(m, selmon->clients); c; c = nexttiled(m, c->next)) + 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); } @@ -1158,9 +1158,8 @@ movemouse(const Arg *arg) { } Client * -nexttiled(Monitor *m, Client *c) { - // TODO: m handling - for(; c && (c->isfloating || !ISVISIBLE(m, c)); c = c->next); +nexttiled(Client *c) { + for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); return c; } @@ -1272,15 +1271,15 @@ restack(Monitor *m) { XWindowChanges wc; drawbars(); - if(!selmon->sel) + if(!m->sel) return; - if(m == selmon && (selmon->sel->isfloating || !lt[m->sellt]->arrange)) - XRaiseWindow(dpy, selmon->sel->win); + if(m->sel->isfloating || !lt[m->sellt]->arrange) + XRaiseWindow(dpy, m->sel->win); if(lt[m->sellt]->arrange) { wc.stack_mode = Below; wc.sibling = m->barwin; for(c = m->stack; c; c = c->snext) - if(!c->isfloating && ISVISIBLE(m, c)) { + if(!c->isfloating && ISVISIBLE(c)) { XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); wc.sibling = c->win; } @@ -1432,7 +1431,7 @@ void showhide(Client *c) { if(!c) return; - if(ISVISIBLE((c->mon), c)) { /* show clients top down */ + if(ISVISIBLE(c)) { /* show clients top down */ XMoveWindow(dpy, c->win, c->x, c->y); if(!lt[c->mon->sellt]->arrange || c->isfloating) resize(c, c->x, c->y, c->w, c->h); @@ -1476,11 +1475,20 @@ tag(const Arg *arg) { void tagmon(const Arg *arg) { unsigned int i; + Client *c; Monitor *m; + if(!(c = selmon->sel)) + return; for(i = 0, m = mons; m; m = m->next, i++) if(i == arg->ui) { - selmon->sel->m = m; + detach(c); + detachstack(c); + c->mon = m; + attach(c); + attachstack(c); + selmon->sel = selmon->stack; + m->sel = c; arrange(); break; } @@ -1504,12 +1512,12 @@ tile(Monitor *m) { unsigned int i, n; Client *c; - for(n = 0, c = nexttiled(m, m->clients); c; c = nexttiled(m, c->next), n++); + for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); if(n == 0) return; /* master */ - c = nexttiled(m, m->clients); + c = nexttiled(m->clients); mw = m->mfact * m->ww; resize(c, m->wx, m->wy, (n == 1 ? m->ww : mw) - 2 * c->bw, m->wh - 2 * c->bw); @@ -1524,7 +1532,7 @@ tile(Monitor *m) { if(h < bh) h = m->wh; - for(i = 0, c = nexttiled(m, c->next); c; c = nexttiled(m, c->next), i++) { + for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) { resize(c, x, y, w - 2 * c->bw, /* remainder */ ((i + 1 == n) ? m->wy + m->wh - y - 2 * c->bw : h - 2 * c->bw)); if(h != m->wh) @@ -1585,8 +1593,10 @@ unmanage(Client *c) { XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ detach(c); detachstack(c); - if(selmon->sel == c) + if(c->mon->sel == c) { + c->mon->sel = c->mon->stack; focus(NULL); + } XUngrabButton(dpy, AnyButton, AnyModifier, c->win); setclientstate(c, WithdrawnState); free(c); @@ -1643,7 +1653,9 @@ updategeom(void) { Client *c; Monitor *newmons = NULL, *m, *tm; -#ifdef XINERAMA +#ifdef XINULATOR + n = 2; +#elif defined(XINERAMA) XineramaScreenInfo *info = NULL; if(XineramaIsActive(dpy)) @@ -1657,7 +1669,23 @@ updategeom(void) { } /* initialise monitor(s) */ -#ifdef XINERAMA +#ifdef XINULATOR + if(1) { + m = newmons; + m->screen_number = 0; + m->wx = sx; + m->my = m->wy = sy; + m->ww = sw; + m->mh = m->wh = sh / 2; + m = newmons->next; + m->screen_number = 1; + m->wx = sx; + m->my = m->wy = sy + sh / 2; + m->ww = sw; + m->mh = m->wh = sh / 2; + } + else +#elif defined(XINERAMA) if(XineramaIsActive(dpy)) { for(i = 0, m = newmons; m; m = m->next, i++) { m->screen_number = info[i].screen_number; @@ -1696,7 +1724,7 @@ updategeom(void) { for(tm = mons; tm; tm = tm->next) if(tm->screen_number == m->screen_number) { m->clients = tm->clients; - m->stack = tm->stack; + m->sel = m->stack = tm->stack; tm->clients = NULL; tm->stack = NULL; for(c = m->clients; c; c = c->next) @@ -1706,18 +1734,12 @@ updategeom(void) { /* reassign left over clients of disappeared monitors */ for(tm = mons; tm; tm = tm->next) { - while(tm->clients) { - c = tm->clients->next; - tm->clients->next = newmons->clients; - tm->clients->mon = newmons; - newmons->clients = tm->clients; - tm->clients = c; - } - while(tm->stack) { - c = tm->stack->snext; - tm->stack->snext = newmons->stack; - newmons->stack = tm->stack; - tm->stack = c; + while((c = tm->clients)) { + detach(c); + detachstack(c); + c->mon = newmons; + attach(c); + attachstack(c); } } @@ -1883,8 +1905,8 @@ zoom(const Arg *arg) { if(!lt[selmon->sellt]->arrange || lt[selmon->sellt]->arrange == monocle || (selmon->sel && selmon->sel->isfloating)) return; - if(c == nexttiled(selmon, selmon->clients)) - if(!c || !(c = nexttiled(selmon, c->next))) + if(c == nexttiled(selmon->clients)) + if(!c || !(c = nexttiled(c->next))) return; detach(c); attach(c);