diff -r 87f70c4d5b0d config.def.h --- a/config.def.h Sun Nov 25 17:25:56 2007 -0500 +++ b/config.def.h Sun Nov 25 17:16:45 2007 -0500 @@ -52,6 +52,9 @@ Key keys[] = { { MODKEY, XK_Tab, viewprevtag, NULL }, { MODKEY|ShiftMask, XK_space, togglefloating, NULL }, { MODKEY|ShiftMask, XK_c, killclient, NULL }, + { MODKEY, XK_q, setclimit, "1" }, \ + { MODKEY, XK_w, setclimit, "2" }, \ + { MODKEY, XK_a, setclimit, "3" }, \ { MODKEY, XK_0, view, NULL }, { MODKEY, XK_1, view, tags[0] }, { MODKEY, XK_2, view, tags[1] }, diff -r 87f70c4d5b0d dwm.c --- a/dwm.c Sun Nov 25 17:25:56 2007 -0500 +++ b/dwm.c Sun Nov 25 17:16:45 2007 -0500 @@ -168,6 +168,7 @@ void run(void); void run(void); void scan(void); void setclientstate(Client *c, long state); +void setclimit(const char *arg); void setlayout(const char *arg); void setmwfact(const char *arg); void setup(void); @@ -196,6 +197,8 @@ void zoom(const char *arg); /* variables */ char stext[256]; +char climitstext[8] = {0,}; +int climit = -1; double mwfact; int screen, sx, sy, sw, sh, wax, way, waw, wah; int (*xerrorxlib)(Display *, XErrorEvent *); @@ -535,6 +538,10 @@ void void drawbar(void) { int i, x; + char buf[sizeof stext + sizeof climitstext]; + + strncpy(buf, climitstext, sizeof climitstext); + strncat(buf, stext, sizeof stext); dc.x = dc.y = 0; for(i = 0; i < LENGTH(tags); i++) { @@ -552,13 +559,13 @@ drawbar(void) { dc.w = blw; drawtext(layout->symbol, dc.norm); x = dc.x + dc.w; - dc.w = textw(stext); + dc.w = textw(buf); dc.x = sw - dc.w; if(dc.x < x) { dc.x = x; dc.w = sw - x; } - drawtext(stext, dc.norm); + drawtext(buf, dc.norm); if((dc.w = dc.x - x) > bh) { dc.x = x; if(sel) { @@ -733,6 +740,9 @@ focusnext(const char *arg) { focus(c); restack(); } + /* Enhanced monocle */ + if (climit == 1) + arrange(); } void @@ -750,6 +760,9 @@ focusprev(const char *arg) { focus(c); restack(); } + /* Enhanced monocle */ + if (climit == 1) + arrange(); } Client * @@ -1341,7 +1354,6 @@ run(void) { readin = True; offset = 0; len = sizeof stext - 1; - buf[len] = stext[len] = '\0'; /* 0-terminator is never touched */ while(running) { FD_ZERO(&rd); if(readin) @@ -1359,7 +1371,7 @@ run(void) { readin = False; break; case 0: - strncpy(stext, "EOF", 4); + strncpy(stext, "EOF", len); readin = False; break; default: @@ -1422,6 +1434,15 @@ setclientstate(Client *c, long state) { } void +setclimit(const char *arg) { + if (climit == -1) + climit = atoi(arg); + else + climit = -1; + arrange(); +} + +void setlayout(const char *arg) { unsigned int i; @@ -1614,11 +1635,37 @@ void void tile(void) { unsigned int i, n, nx, ny, nw, nh, mw, th; - Client *c, *mc; + Client *c, *mc, *t; domwfact = dozoom = True; for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) n++; + + /* client limit */ + if(climit != -1) { + if (n > climit) { + snprintf(climitstext, sizeof climitstext, "{%d} ", n - climit); + n = climit; + }else + snprintf(climitstext, sizeof climitstext, "{} "); + + /* Enhanced monocle */ + if (climit == 1) { + if (sel && isvisible(sel)) + t = sel; + else /* Find client from selection history */ + for(t = stack; t && !isvisible(t); t = t->next); + for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++) { + if (c != t) { + ban(c); + continue; + } + } + if(t) resize(t, wax, way, waw - 2*t->border, wah - 2*t->border, False); + return; + } + }else + climitstext[0] = '\0'; /* window geoms */ mw = (n == 1) ? waw : mwfact * waw; @@ -1630,6 +1677,10 @@ tile(void) { ny = way; nw = 0; /* gcc stupidity requires this */ for(i = 0, c = mc = nexttiled(clients); c; c = nexttiled(c->next), i++) { + if (climit != -1 && i >= climit) { + ban(c); + continue; + } c->ismax = False; if(i == 0) { /* master */ nw = mw - 2 * c->border;