added antoszka's viewprev patch with some minor modifications, restored Client->tags as Bool *, however kept the static initialization of ntags and seltags (prevtags) - this seems to be the best compromise
Anselm R. Garbe garbeam@gmail.com
Wed, 10 Oct 2007 18:39:28 +0200
3 files changed,
35 insertions(+),
22 deletions(-)
M
config.def.h
→
config.def.h
@@ -49,6 +49,7 @@ { MODKEY, XK_h, setmwfact, "-0.05" }, \
{ MODKEY, XK_l, setmwfact, "+0.05" }, \ { MODKEY, XK_m, togglemax, NULL }, \ { MODKEY, XK_Return, zoom, NULL }, \ + { MODKEY, XK_Tab, viewprevtag, NULL }, \ { MODKEY|ShiftMask, XK_space, togglefloating, NULL }, \ { MODKEY|ShiftMask, XK_c, killclient, NULL }, \ { MODKEY, XK_0, view, NULL }, \
M
dwm.c
→
dwm.c
@@ -58,6 +58,22 @@
/* typedefs */ typedef struct Client Client; +struct Client { + char name[256]; + int x, y, w, h; + int rx, ry, rw, rh; /* revert geometry */ + int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int minax, maxax, minay, maxay; + long flags; + unsigned int border, oldborder; + Bool isbanned, isfixed, ismax, isfloating, wasfloating; + Bool *tags; + Client *next; + Client *prev; + Client *snext; + Window win; +}; + typedef struct { int x, y, w, h; unsigned long norm[ColLast];@@ -170,6 +186,7 @@ void updatebarpos(void);
void updatesizehints(Client *c); void updatetitle(Client *c); void view(const char *arg); +void viewprevtag(const char *arg); /* views previous selected tags */ int xerror(Display *dpy, XErrorEvent *ee); int xerrordummy(Display *dsply, XErrorEvent *ee); int xerrorstart(Display *dsply, XErrorEvent *ee);@@ -219,22 +236,7 @@
/* Statically define the number of tags. */ unsigned int ntags = sizeof tags / sizeof tags[0]; Bool seltags[sizeof tags / sizeof tags[0]] = {[0] = True}; - -struct Client { - char name[256]; - int x, y, w, h; - int rx, ry, rw, rh; /* revert geometry */ - int basew, baseh, incw, inch, maxw, maxh, minw, minh; - int minax, maxax, minay, maxay; - long flags; - unsigned int border, oldborder; - Bool isbanned, isfixed, ismax, isfloating, wasfloating; - Bool tags[sizeof tags / sizeof tags[0]]; - Client *next; - Client *prev; - Client *snext; - Window win; -}; +Bool prevtags[sizeof tags / sizeof tags[0]] = {[0] = True}; /* functions*/ void@@ -265,8 +267,7 @@ XFree(ch.res_class);
if(ch.res_name) XFree(ch.res_name); if(!matched) - for(i = 0; i < ntags; i++) - c->tags[i] = seltags[i]; + memcpy(c->tags, seltags, sizeof seltags); } void@@ -1002,13 +1003,13 @@ }
void manage(Window w, XWindowAttributes *wa) { - unsigned int i; Client *c, *t = NULL; Window trans; Status rettrans; XWindowChanges wc; c = emallocz(sizeof(Client)); + c->tags = emallocz(sizeof seltags); c->win = w; c->x = wa->x; c->y = wa->y;@@ -1043,8 +1044,7 @@ updatetitle(c);
if((rettrans = XGetTransientForHint(dpy, w, &trans) == Success)) for(t = clients; t && t->win != trans; t = t->next); if(t) - for(i = 0; i < ntags; i++) - c->tags[i] = t->tags[i]; + memcpy(c->tags, t->tags, sizeof seltags); applyrules(c); if(!c->isfloating) c->isfloating = (rettrans == Success) || c->isfixed;@@ -1702,6 +1702,7 @@ if(sel == c)
focus(NULL); XUngrabButton(dpy, AnyButton, AnyModifier, c->win); setclientstate(c, WithdrawnState); + free(c->tags); free(c); XSync(dpy, False); XSetErrorHandler(xerror);@@ -1838,11 +1839,22 @@ void
view(const char *arg) { unsigned int i; + memcpy(prevtags, seltags, sizeof seltags); for(i = 0; i < ntags; i++) seltags[i] = arg == NULL; i = idxoftag(arg); if(i >= 0 && i < ntags) seltags[i] = True; + arrange(); +} + +void +viewprevtag(const char *arg) { + static Bool tmptags[sizeof tags / sizeof tags[0]]; + + memcpy(tmptags, seltags, sizeof seltags); + memcpy(seltags, prevtags, sizeof seltags); + memcpy(prevtags, tmptags, sizeof seltags); arrange(); }