dwm

[fork] dynamic window manager
Log | Files | Refs | README | LICENSE

commit 10bc0ce912eb99fec49d954c80d92e04429ed0ee
parent e8792d95a12c85f9e660e192cd2c6260a01a3c5e
Author: Anselm R. Garbe <garbeam@gmail.com>
Date:   Thu, 16 Aug 2007 17:55:55 +0200

made tag/view/toggle{tag,view} work on pointer to tags-array, there was the need to define Key key[] not static to do this. split focusclient into focusnext/prev, fixed config.*.h's
Diffstat:
Mconfig.arg.h | 78+++++++++++++++++++++++++++++++++++++++---------------------------------------
Mconfig.default.h | 78+++++++++++++++++++++++++++++++++++++++---------------------------------------
Mdwm.h | 3++-
Mevent.c | 20++++++++------------
Mlayout.c | 34+++++++++++++++++++++-------------
Mtag.c | 26++++++++++++++++++--------
6 files changed, 127 insertions(+), 112 deletions(-)

diff --git a/config.arg.h b/config.arg.h @@ -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 }, \ }; diff --git a/config.default.h b/config.default.h @@ -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 @@ -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 @@ -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; diff --git 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 @@ -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();