JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
made tag/view/toggle{tag,view} work on pointer to tags-array, there was the need...
authorAnselm R. Garbe <garbeam@gmail.com>
Thu, 16 Aug 2007 15:55:55 +0000 (17:55 +0200)
committerAnselm R. Garbe <garbeam@gmail.com>
Thu, 16 Aug 2007 15:55:55 +0000 (17:55 +0200)
config.arg.h
config.default.h
dwm.h
event.c
layout.c
tag.c

index 18be75b..ca23b24 100644 (file)
@@ -37,7 +37,7 @@ static Layout layout[] = { \
 /* key definitions */
 #define MODKEY                 Mod1Mask
 #define KEYS \
-static Key key[] = { \
+Key key[] = { \
        /* modifier                     key             function        argument */ \
        { MODKEY,                       XK_p,           spawn, \
                "exe=`dmenu_path | dmenu -fn '"FONT"' -nb '"NORMBGCOLOR"' -nf '"NORMFGCOLOR"'" \
@@ -46,8 +46,8 @@ static Key key[] = { \
                "exec urxvtcd -tr -bg '#111' -fg '#eee' -cr '#eee' +sb -fn '"FONT"'" }, \
        { MODKEY,                       XK_space,       setlayout,      NULL }, \
        { MODKEY,                       XK_b,           togglebar,      NULL }, \
-       { MODKEY,                       XK_j,           focusclient,    "1" }, \
-       { MODKEY,                       XK_k,           focusclient,    "-1" }, \
+       { MODKEY,                       XK_j,           focusnext,      NULL }, \
+       { MODKEY,                       XK_k,           focusprev,      NULL }, \
        { MODKEY,                       XK_h,           addtomwfact,    "-0.05" }, \
        { MODKEY,                       XK_l,           addtomwfact,    "0.05" }, \
        { MODKEY,                       XK_m,           togglemax,      NULL }, \
@@ -55,42 +55,42 @@ static Key key[] = { \
        { MODKEY|ShiftMask,             XK_space,       togglefloating, NULL }, \
        { MODKEY|ShiftMask,             XK_c,           killclient,     NULL }, \
        { MODKEY,                       XK_0,           view,           NULL }, \
-       { MODKEY,                       XK_1,           view,           "0" }, \
-       { MODKEY,                       XK_2,           view,           "1" }, \
-       { MODKEY,                       XK_3,           view,           "2" }, \
-       { MODKEY,                       XK_4,           view,           "3" }, \
-       { MODKEY,                       XK_5,           view,           "4" }, \
-       { MODKEY,                       XK_6,           view,           "5" }, \
-       { MODKEY,                       XK_7,           view,           "6" }, \
-       { MODKEY,                       XK_8,           view,           "7" }, \
-       { MODKEY,                       XK_9,           view,           "8" }, \
-       { MODKEY|ControlMask,           XK_1,           toggleview,     "0" }, \
-       { MODKEY|ControlMask,           XK_2,           toggleview,     "1" }, \
-       { MODKEY|ControlMask,           XK_3,           toggleview,     "2" }, \
-       { MODKEY|ControlMask,           XK_4,           toggleview,     "3" }, \
-       { MODKEY|ControlMask,           XK_5,           toggleview,     "4" }, \
-       { MODKEY|ControlMask,           XK_6,           toggleview,     "5" }, \
-       { MODKEY|ControlMask,           XK_7,           toggleview,     "6" }, \
-       { MODKEY|ControlMask,           XK_8,           toggleview,     "7" }, \
-       { MODKEY|ControlMask,           XK_9,           toggleview,     "8" }, \
+       { MODKEY,                       XK_1,           view,           tags[0] }, \
+       { MODKEY,                       XK_2,           view,           tags[1] }, \
+       { MODKEY,                       XK_3,           view,           tags[2] }, \
+       { MODKEY,                       XK_4,           view,           tags[3] }, \
+       { MODKEY,                       XK_5,           view,           tags[4] }, \
+       { MODKEY,                       XK_6,           view,           tags[5] }, \
+       { MODKEY,                       XK_7,           view,           tags[6] }, \
+       { MODKEY,                       XK_8,           view,           tags[7] }, \
+       { MODKEY,                       XK_9,           view,           tags[8] }, \
+       { MODKEY|ControlMask,           XK_1,           toggleview,     tags[0] }, \
+       { MODKEY|ControlMask,           XK_2,           toggleview,     tags[1] }, \
+       { MODKEY|ControlMask,           XK_3,           toggleview,     tags[2] }, \
+       { MODKEY|ControlMask,           XK_4,           toggleview,     tags[3] }, \
+       { MODKEY|ControlMask,           XK_5,           toggleview,     tags[4] }, \
+       { MODKEY|ControlMask,           XK_6,           toggleview,     tags[5] }, \
+       { MODKEY|ControlMask,           XK_7,           toggleview,     tags[6] }, \
+       { MODKEY|ControlMask,           XK_8,           toggleview,     tags[7] }, \
+       { MODKEY|ControlMask,           XK_9,           toggleview,     tags[8] }, \
        { MODKEY|ShiftMask,             XK_0,           tag,            NULL }, \
-       { MODKEY|ShiftMask,             XK_1,           tag,            "0" }, \
-       { MODKEY|ShiftMask,             XK_2,           tag,            "1" }, \
-       { MODKEY|ShiftMask,             XK_3,           tag,            "2" }, \
-       { MODKEY|ShiftMask,             XK_4,           tag,            "3" }, \
-       { MODKEY|ShiftMask,             XK_5,           tag,            "4" }, \
-       { MODKEY|ShiftMask,             XK_6,           tag,            "5" }, \
-       { MODKEY|ShiftMask,             XK_7,           tag,            "6" }, \
-       { MODKEY|ShiftMask,             XK_8,           tag,            "7" }, \
-       { MODKEY|ShiftMask,             XK_9,           tag,            "8" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_1,           toggletag,      "0" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_2,           toggletag,      "1" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_3,           toggletag,      "2" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_4,           toggletag,      "3" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_5,           toggletag,      "4" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_6,           toggletag,      "5" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_7,           toggletag,      "6" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_8,           toggletag,      "7" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_9,           toggletag,      "8" }, \
+       { MODKEY|ShiftMask,             XK_1,           tag,            tags[0] }, \
+       { MODKEY|ShiftMask,             XK_2,           tag,            tags[1] }, \
+       { MODKEY|ShiftMask,             XK_3,           tag,            tags[2] }, \
+       { MODKEY|ShiftMask,             XK_4,           tag,            tags[3] }, \
+       { MODKEY|ShiftMask,             XK_5,           tag,            tags[4] }, \
+       { MODKEY|ShiftMask,             XK_6,           tag,            tags[5] }, \
+       { MODKEY|ShiftMask,             XK_7,           tag,            tags[6] }, \
+       { MODKEY|ShiftMask,             XK_8,           tag,            tags[7] }, \
+       { MODKEY|ShiftMask,             XK_9,           tag,            tags[8] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_1,           toggletag,      tags[0] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_2,           toggletag,      tags[1] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_3,           toggletag,      tags[2] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_4,           toggletag,      tags[3] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_5,           toggletag,      tags[4] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_6,           toggletag,      tags[5] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_7,           toggletag,      tags[6] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_8,           toggletag,      tags[7] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_9,           toggletag,      tags[8] }, \
        { MODKEY|ShiftMask,             XK_q,           quit,           NULL }, \
 };
index dcf13e3..878e0a4 100644 (file)
@@ -38,14 +38,14 @@ static Layout layout[] = { \
 /* key definitions */
 #define MODKEY                 Mod1Mask
 #define KEYS \
-static Key key[] = { \
+Key key[] = { \
        /* modifier                     key             function        argument */ \
        { MODKEY|ShiftMask,             XK_Return,      spawn,          "exec xterm" }, \
        { MODKEY,                       XK_p,           spawn,          "exe=`dmenu_path | dmenu` && exec $exe" }, \
        { MODKEY,                       XK_space,       setlayout,      NULL }, \
        { MODKEY,                       XK_b,           togglebar,      NULL }, \
-       { MODKEY,                       XK_j,           focusclient,    "1" }, \
-       { MODKEY,                       XK_k,           focusclient,    "-1" }, \
+       { MODKEY,                       XK_j,           focusnext,      NULL }, \
+       { MODKEY,                       XK_k,           focusprev,      NULL }, \
        { MODKEY,                       XK_h,           addtomwfact,    "-0.05" }, \
        { MODKEY,                       XK_l,           addtomwfact,    "0.05" }, \
        { MODKEY,                       XK_m,           togglemax,      NULL }, \
@@ -53,42 +53,42 @@ static Key key[] = { \
        { MODKEY|ShiftMask,             XK_space,       togglefloating, NULL }, \
        { MODKEY|ShiftMask,             XK_c,           killclient,     NULL }, \
        { MODKEY,                       XK_0,           view,           NULL }, \
-       { MODKEY,                       XK_1,           view,           "0" }, \
-       { MODKEY,                       XK_2,           view,           "1" }, \
-       { MODKEY,                       XK_3,           view,           "2" }, \
-       { MODKEY,                       XK_4,           view,           "3" }, \
-       { MODKEY,                       XK_5,           view,           "4" }, \
-       { MODKEY,                       XK_6,           view,           "5" }, \
-       { MODKEY,                       XK_7,           view,           "6" }, \
-       { MODKEY,                       XK_8,           view,           "7" }, \
-       { MODKEY,                       XK_9,           view,           "8" }, \
-       { MODKEY|ControlMask,           XK_1,           toggleview,     "0" }, \
-       { MODKEY|ControlMask,           XK_2,           toggleview,     "1" }, \
-       { MODKEY|ControlMask,           XK_3,           toggleview,     "2" }, \
-       { MODKEY|ControlMask,           XK_4,           toggleview,     "3" }, \
-       { MODKEY|ControlMask,           XK_5,           toggleview,     "4" }, \
-       { MODKEY|ControlMask,           XK_6,           toggleview,     "5" }, \
-       { MODKEY|ControlMask,           XK_7,           toggleview,     "6" }, \
-       { MODKEY|ControlMask,           XK_8,           toggleview,     "7" }, \
-       { MODKEY|ControlMask,           XK_9,           toggleview,     "8" }, \
+       { MODKEY,                       XK_1,           view,           tags[0] }, \
+       { MODKEY,                       XK_2,           view,           tags[1] }, \
+       { MODKEY,                       XK_3,           view,           tags[2] }, \
+       { MODKEY,                       XK_4,           view,           tags[3] }, \
+       { MODKEY,                       XK_5,           view,           tags[4] }, \
+       { MODKEY,                       XK_6,           view,           tags[5] }, \
+       { MODKEY,                       XK_7,           view,           tags[6] }, \
+       { MODKEY,                       XK_8,           view,           tags[7] }, \
+       { MODKEY,                       XK_9,           view,           tags[8] }, \
+       { MODKEY|ControlMask,           XK_1,           toggleview,     tags[0] }, \
+       { MODKEY|ControlMask,           XK_2,           toggleview,     tags[1] }, \
+       { MODKEY|ControlMask,           XK_3,           toggleview,     tags[2] }, \
+       { MODKEY|ControlMask,           XK_4,           toggleview,     tags[3] }, \
+       { MODKEY|ControlMask,           XK_5,           toggleview,     tags[4] }, \
+       { MODKEY|ControlMask,           XK_6,           toggleview,     tags[5] }, \
+       { MODKEY|ControlMask,           XK_7,           toggleview,     tags[6] }, \
+       { MODKEY|ControlMask,           XK_8,           toggleview,     tags[7] }, \
+       { MODKEY|ControlMask,           XK_9,           toggleview,     tags[8] }, \
        { MODKEY|ShiftMask,             XK_0,           tag,            NULL }, \
-       { MODKEY|ShiftMask,             XK_1,           tag,            "0" }, \
-       { MODKEY|ShiftMask,             XK_2,           tag,            "1" }, \
-       { MODKEY|ShiftMask,             XK_3,           tag,            "2" }, \
-       { MODKEY|ShiftMask,             XK_4,           tag,            "3" }, \
-       { MODKEY|ShiftMask,             XK_5,           tag,            "4" }, \
-       { MODKEY|ShiftMask,             XK_6,           tag,            "5" }, \
-       { MODKEY|ShiftMask,             XK_7,           tag,            "6" }, \
-       { MODKEY|ShiftMask,             XK_8,           tag,            "7" }, \
-       { MODKEY|ShiftMask,             XK_9,           tag,            "8" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_1,           toggletag,      "0" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_2,           toggletag,      "1" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_3,           toggletag,      "2" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_4,           toggletag,      "3" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_5,           toggletag,      "4" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_6,           toggletag,      "5" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_7,           toggletag,      "6" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_8,           toggletag,      "7" }, \
-       { MODKEY|ControlMask|ShiftMask, XK_9,           toggletag,      "8" }, \
+       { MODKEY|ShiftMask,             XK_1,           tag,            tags[0] }, \
+       { MODKEY|ShiftMask,             XK_2,           tag,            tags[1] }, \
+       { MODKEY|ShiftMask,             XK_3,           tag,            tags[2] }, \
+       { MODKEY|ShiftMask,             XK_4,           tag,            tags[3] }, \
+       { MODKEY|ShiftMask,             XK_5,           tag,            tags[4] }, \
+       { MODKEY|ShiftMask,             XK_6,           tag,            tags[5] }, \
+       { MODKEY|ShiftMask,             XK_7,           tag,            tags[6] }, \
+       { MODKEY|ShiftMask,             XK_8,           tag,            tags[7] }, \
+       { MODKEY|ShiftMask,             XK_9,           tag,            tags[8] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_1,           toggletag,      tags[0] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_2,           toggletag,      tags[1] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_3,           toggletag,      tags[2] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_4,           toggletag,      tags[3] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_5,           toggletag,      tags[4] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_6,           toggletag,      tags[5] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_7,           toggletag,      tags[6] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_8,           toggletag,      tags[7] }, \
+       { MODKEY|ControlMask|ShiftMask, XK_9,           toggletag,      tags[8] }, \
        { MODKEY|ShiftMask,             XK_q,           quit,           NULL }, \
 };
diff --git a/dwm.h b/dwm.h
index 509b845..0786dab 100644 (file)
--- a/dwm.h
+++ b/dwm.h
@@ -114,7 +114,8 @@ void grabkeys(void);                        /* grab all keys defined in config.h */
 
 /* layout.c */
 void arrange(void);                    /* arranges all windows depending on the layout in use */
-void focusclient(const char *arg);     /* focuses next(1)/previous(-1) visible client */
+void focusnext(const char *arg);       /* focuses next visible client */
+void focusprev(const char *arg);       /* focuses prev visible client */
 const char *getsymbol(void);           /* returns symbol of enabled layout */
 Bool isfloating(void);                 /* returns True if floating layout is enabled */
 Bool isarrange(void (*func)());                /* returns True if func is the layout function in use */
diff --git a/event.c b/event.c
index b8a16a7..4e240e2 100644 (file)
--- a/event.c
+++ b/event.c
@@ -1,6 +1,5 @@
 /* See LICENSE file for copyright and license details. */
 #include "dwm.h"
-#include <stdio.h>
 #include <stdlib.h>
 #include <X11/keysym.h>
 #include <X11/Xatom.h>
@@ -15,8 +14,6 @@ typedef struct {
        const char *arg;
 } Key;
 
-KEYS
-
 #define CLEANMASK(mask)                (mask & ~(numlockmask | LockMask))
 #define MOUSEMASK              (BUTTONMASK | PointerMotionMask)
 
@@ -112,29 +109,26 @@ resizemouse(Client *c) {
 
 static void
 buttonpress(XEvent *e) {
-       static char buf[32];
        unsigned int i, x;
        Client *c;
        XButtonPressedEvent *ev = &e->xbutton;
 
-       buf[0] = 0;
        if(barwin == ev->window) {
                x = 0;
                for(i = 0; i < ntags; i++) {
                        x += textw(tags[i]);
                        if(ev->x < x) {
-                               snprintf(buf, sizeof buf, "%d", i);
                                if(ev->button == Button1) {
                                        if(ev->state & MODKEY)
-                                               tag(buf);
+                                               tag(tags[i]);
                                        else
-                                               view(buf);
+                                               view(tags[i]);
                                }
                                else if(ev->button == Button3) {
                                        if(ev->state & MODKEY)
-                                               toggletag(buf);
+                                               toggletag(tags[i]);
                                        else
-                                               toggleview(buf);
+                                               toggleview(tags[i]);
                                }
                                return;
                        }
@@ -257,7 +251,8 @@ expose(XEvent *e) {
 
 static void
 keypress(XEvent *e) {
-       static unsigned int len = sizeof key / sizeof key[0];
+       KEYS
+       unsigned int len = sizeof key / sizeof key[0];
        unsigned int i;
        KeySym keysym;
        XKeyEvent *ev = &e->xkey;
@@ -362,7 +357,8 @@ void (*handler[LASTEvent]) (XEvent *) = {
 
 void
 grabkeys(void) {
-       static unsigned int len = sizeof key / sizeof key[0];
+       KEYS
+       unsigned int len = sizeof key / sizeof key[0];
        unsigned int i;
        KeyCode code;
 
index 4fb0be3..c467080 100644 (file)
--- a/layout.c
+++ b/layout.c
@@ -42,22 +42,30 @@ arrange(void) {
 }
 
 void
-focusclient(const char *arg) {
+focusnext(const char *arg) {
        Client *c;
-   
-       if(!sel || !arg)
+
+       if(!sel)
                return;
-       if(atoi(arg) < 0) {
-               for(c = sel->prev; c && !isvisible(c); c = c->prev);
-               if(!c) {
-                       for(c = clients; c && c->next; c = c->next);
-                       for(; c && !isvisible(c); c = c->prev);
-               }
+       for(c = sel->next; c && !isvisible(c); c = c->next);
+       if(!c)
+               for(c = clients; c && !isvisible(c); c = c->next);
+       if(c) {
+               focus(c);
+               restack();
        }
-       else {
-               for(c = sel->next; c && !isvisible(c); c = c->next);
-               if(!c)
-                       for(c = clients; c && !isvisible(c); c = c->next);
+}
+
+void
+focusprev(const char *arg) {
+       Client *c;
+
+       if(!sel)
+               return;
+       for(c = sel->prev; c && !isvisible(c); c = c->prev);
+       if(!c) {
+               for(c = clients; c && c->next; c = c->next);
+               for(; c && !isvisible(c); c = c->prev);
        }
        if(c) {
                focus(c);
diff --git a/tag.c b/tag.c
index 4aeadc2..cf983b8 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -40,6 +40,16 @@ persistconfig(Client *c) {
                        PropModeReplace, (unsigned char *)prop, i);
 }
 
+static unsigned int
+idxoftag(const char *tag) {
+       unsigned int i;
+
+       for(i = 0; i < ntags; i++)
+               if(tags[i] == tag)
+                       return i;
+       return 0;
+}
+
 /* extern */
 
 void
@@ -135,13 +145,13 @@ settags(Client *c, Client *trans) {
 
 void
 tag(const char *arg) {
-       int i;
+       unsigned int i;
 
        if(!sel)
                return;
        for(i = 0; i < ntags; i++)
                sel->tags[i] = arg == NULL;
-       i = arg ? atoi(arg) : 0;
+       i = idxoftag(arg);
        if(i >= 0 && i < ntags)
                sel->tags[i] = True;
        persistconfig(sel);
@@ -162,11 +172,11 @@ togglefloating(const char *arg) {
 
 void
 toggletag(const char *arg) {
-       int i, j;
+       unsigned int i, j;
 
        if(!sel)
                return;
-       i = arg ? atoi(arg) : 0;
+       i = idxoftag(arg);
        sel->tags[i] = !sel->tags[i];
        for(j = 0; j < ntags && !sel->tags[j]; j++);
        if(j == ntags)
@@ -177,9 +187,9 @@ toggletag(const char *arg) {
 
 void
 toggleview(const char *arg) {
-       int i, j;
+       unsigned int i, j;
 
-       i = arg ? atoi(arg) : 0;
+       i = idxoftag(arg);
        seltag[i] = !seltag[i];
        for(j = 0; j < ntags && !seltag[j]; j++);
        if(j == ntags)
@@ -189,11 +199,11 @@ toggleview(const char *arg) {
 
 void
 view(const char *arg) {
-       int i;
+       unsigned int i;
 
        for(i = 0; i < ntags; i++)
                seltag[i] = arg == NULL;
-       i = arg ? atoi(arg) : 0;
+       i = idxoftag(arg);
        if(i >= 0 && i < ntags)
                seltag[i] = True;
        arrange();