implemented viewextend and added M-S-C-n shortcuts for extending the current view... updated man page (works great!) nice feature
292ccc4c
8 file(s) · +100 −68
| 18 | 18 | ||
| 19 | 19 | #define KEYS \ |
|
| 20 | 20 | static Key key[] = { \ |
|
| 21 | - | /* modifier key function arguments */ \ |
|
| 22 | - | { MODKEY, XK_1, view, { .i = 0 } }, \ |
|
| 23 | - | { MODKEY, XK_2, view, { .i = 1 } }, \ |
|
| 24 | - | { MODKEY, XK_3, view, { .i = 2 } }, \ |
|
| 25 | - | { MODKEY, XK_h, viewprev, { 0 } }, \ |
|
| 26 | - | { MODKEY, XK_j, focusnext, { 0 } }, \ |
|
| 27 | - | { MODKEY, XK_k, focusprev, { 0 } }, \ |
|
| 28 | - | { MODKEY, XK_l, viewnext, { 0 } }, \ |
|
| 29 | - | { MODKEY, XK_m, togglemax, { 0 } }, \ |
|
| 30 | - | { MODKEY, XK_p, spawn, \ |
|
| 21 | + | /* modifier key function arguments */ \ |
|
| 22 | + | { MODKEY, XK_1, view, { .i = 0 } }, \ |
|
| 23 | + | { MODKEY, XK_2, view, { .i = 1 } }, \ |
|
| 24 | + | { MODKEY, XK_3, view, { .i = 2 } }, \ |
|
| 25 | + | { MODKEY, XK_h, viewprev, { 0 } }, \ |
|
| 26 | + | { MODKEY, XK_j, focusnext, { 0 } }, \ |
|
| 27 | + | { MODKEY, XK_k, focusprev, { 0 } }, \ |
|
| 28 | + | { MODKEY, XK_l, viewnext, { 0 } }, \ |
|
| 29 | + | { MODKEY, XK_m, togglemax, { 0 } }, \ |
|
| 30 | + | { MODKEY, XK_p, spawn, \ |
|
| 31 | 31 | { .cmd = "exec `ls -lL /usr/bin /usr/local/bin 2>/dev/null | " \ |
|
| 32 | 32 | "awk 'NF>2 && $1 ~ /^[^d].*x/ {print $NF}' | sort | uniq | dmenu`" } }, \ |
|
| 33 | - | { MODKEY, XK_space, togglemode, { 0 } }, \ |
|
| 34 | - | { MODKEY, XK_Return, zoom, { 0 } }, \ |
|
| 35 | - | { MODKEY|ControlMask, XK_1, appendtag, { .i = 0 } }, \ |
|
| 36 | - | { MODKEY|ControlMask, XK_2, appendtag, { .i = 1 } }, \ |
|
| 37 | - | { MODKEY|ControlMask, XK_3, appendtag, { .i = 2 } }, \ |
|
| 38 | - | { MODKEY|ShiftMask, XK_1, replacetag, { .i = 0 } }, \ |
|
| 39 | - | { MODKEY|ShiftMask, XK_2, replacetag, { .i = 1 } }, \ |
|
| 40 | - | { MODKEY|ShiftMask, XK_3, replacetag, { .i = 2 } }, \ |
|
| 41 | - | { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ |
|
| 42 | - | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ |
|
| 43 | - | { MODKEY|ShiftMask, XK_Return, spawn, \ |
|
| 33 | + | { MODKEY, XK_space, togglemode, { 0 } }, \ |
|
| 34 | + | { MODKEY, XK_Return, zoom, { 0 } }, \ |
|
| 35 | + | { MODKEY|ControlMask, XK_1, appendtag, { .i = 0 } }, \ |
|
| 36 | + | { MODKEY|ControlMask, XK_2, appendtag, { .i = 1 } }, \ |
|
| 37 | + | { MODKEY|ControlMask, XK_3, appendtag, { .i = 2 } }, \ |
|
| 38 | + | { MODKEY|ShiftMask, XK_1, replacetag, { .i = 0 } }, \ |
|
| 39 | + | { MODKEY|ShiftMask, XK_2, replacetag, { .i = 1 } }, \ |
|
| 40 | + | { MODKEY|ShiftMask, XK_3, replacetag, { .i = 2 } }, \ |
|
| 41 | + | { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ |
|
| 42 | + | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ |
|
| 43 | + | { MODKEY|ShiftMask, XK_Return, spawn, \ |
|
| 44 | 44 | { .cmd = "exec urxvt +sb -tr -bg black -fg '#eeeeee' -cr '#eeeeee' +sb " \ |
|
| 45 | 45 | "-fn '-*-terminus-medium-*-*-*-12-*-*-*-*-*-iso10646-*'" } }, \ |
|
| 46 | + | { MODKEY|ControlMask|ShiftMask, XK_1, viewextend, { .i = 0 } }, \ |
|
| 47 | + | { MODKEY|ShiftMask, XK_2, viewextend, { .i = 1 } }, \ |
|
| 48 | + | { MODKEY|ShiftMask, XK_3, viewextend, { .i = 2 } }, \ |
|
| 46 | 49 | }; |
|
| 47 | 50 | ||
| 48 | 51 | #define RULES \ |
| 18 | 18 | ||
| 19 | 19 | #define KEYS \ |
|
| 20 | 20 | static Key key[] = { \ |
|
| 21 | - | /* modifier key function arguments */ \ |
|
| 22 | - | { MODKEY, XK_0, view, { .i = 0 } }, \ |
|
| 23 | - | { MODKEY, XK_1, view, { .i = 1 } }, \ |
|
| 24 | - | { MODKEY, XK_2, view, { .i = 2 } }, \ |
|
| 25 | - | { MODKEY, XK_3, view, { .i = 3 } }, \ |
|
| 26 | - | { MODKEY, XK_4, view, { .i = 4 } }, \ |
|
| 27 | - | { MODKEY, XK_h, viewprev, { 0 } }, \ |
|
| 28 | - | { MODKEY, XK_j, focusnext, { 0 } }, \ |
|
| 29 | - | { MODKEY, XK_k, focusprev, { 0 } }, \ |
|
| 30 | - | { MODKEY, XK_l, viewnext, { 0 } }, \ |
|
| 31 | - | { MODKEY, XK_m, togglemax, { 0 } }, \ |
|
| 32 | - | { MODKEY, XK_space, togglemode, { 0 } }, \ |
|
| 33 | - | { MODKEY, XK_Return, zoom, { 0 } }, \ |
|
| 34 | - | { MODKEY|ControlMask, XK_0, appendtag, { .i = 0 } }, \ |
|
| 35 | - | { MODKEY|ControlMask, XK_1, appendtag, { .i = 1 } }, \ |
|
| 36 | - | { MODKEY|ControlMask, XK_2, appendtag, { .i = 2 } }, \ |
|
| 37 | - | { MODKEY|ControlMask, XK_3, appendtag, { .i = 3 } }, \ |
|
| 38 | - | { MODKEY|ControlMask, XK_4, appendtag, { .i = 4 } }, \ |
|
| 39 | - | { MODKEY|ShiftMask, XK_0, replacetag, { .i = 0 } }, \ |
|
| 40 | - | { MODKEY|ShiftMask, XK_1, replacetag, { .i = 1 } }, \ |
|
| 41 | - | { MODKEY|ShiftMask, XK_2, replacetag, { .i = 2 } }, \ |
|
| 42 | - | { MODKEY|ShiftMask, XK_3, replacetag, { .i = 3 } }, \ |
|
| 43 | - | { MODKEY|ShiftMask, XK_4, replacetag, { .i = 4 } }, \ |
|
| 44 | - | { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ |
|
| 45 | - | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ |
|
| 46 | - | { MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \ |
|
| 21 | + | /* modifier key function arguments */ \ |
|
| 22 | + | { MODKEY, XK_0, view, { .i = 0 } }, \ |
|
| 23 | + | { MODKEY, XK_1, view, { .i = 1 } }, \ |
|
| 24 | + | { MODKEY, XK_2, view, { .i = 2 } }, \ |
|
| 25 | + | { MODKEY, XK_3, view, { .i = 3 } }, \ |
|
| 26 | + | { MODKEY, XK_4, view, { .i = 4 } }, \ |
|
| 27 | + | { MODKEY, XK_h, viewprev, { 0 } }, \ |
|
| 28 | + | { MODKEY, XK_j, focusnext, { 0 } }, \ |
|
| 29 | + | { MODKEY, XK_k, focusprev, { 0 } }, \ |
|
| 30 | + | { MODKEY, XK_l, viewnext, { 0 } }, \ |
|
| 31 | + | { MODKEY, XK_m, togglemax, { 0 } }, \ |
|
| 32 | + | { MODKEY, XK_space, togglemode, { 0 } }, \ |
|
| 33 | + | { MODKEY, XK_Return, zoom, { 0 } }, \ |
|
| 34 | + | { MODKEY|ControlMask, XK_0, appendtag, { .i = 0 } }, \ |
|
| 35 | + | { MODKEY|ControlMask, XK_1, appendtag, { .i = 1 } }, \ |
|
| 36 | + | { MODKEY|ControlMask, XK_2, appendtag, { .i = 2 } }, \ |
|
| 37 | + | { MODKEY|ControlMask, XK_3, appendtag, { .i = 3 } }, \ |
|
| 38 | + | { MODKEY|ControlMask, XK_4, appendtag, { .i = 4 } }, \ |
|
| 39 | + | { MODKEY|ShiftMask, XK_0, replacetag, { .i = 0 } }, \ |
|
| 40 | + | { MODKEY|ShiftMask, XK_1, replacetag, { .i = 1 } }, \ |
|
| 41 | + | { MODKEY|ShiftMask, XK_2, replacetag, { .i = 2 } }, \ |
|
| 42 | + | { MODKEY|ShiftMask, XK_3, replacetag, { .i = 3 } }, \ |
|
| 43 | + | { MODKEY|ShiftMask, XK_4, replacetag, { .i = 4 } }, \ |
|
| 44 | + | { MODKEY|ShiftMask, XK_c, killclient, { 0 } }, \ |
|
| 45 | + | { MODKEY|ShiftMask, XK_q, quit, { 0 } }, \ |
|
| 46 | + | { MODKEY|ShiftMask, XK_Return, spawn, { .cmd = "exec xterm" } }, \ |
|
| 47 | + | { MODKEY|ControlMask|ShiftMask, XK_0, viewextend, { .i = 0 } }, \ |
|
| 48 | + | { MODKEY|ControlMask|ShiftMask, XK_1, viewextend, { .i = 1 } }, \ |
|
| 49 | + | { MODKEY|ControlMask|ShiftMask, XK_2, viewextend, { .i = 2 } }, \ |
|
| 50 | + | { MODKEY|ControlMask|ShiftMask, XK_3, viewextend, { .i = 3 } }, \ |
|
| 51 | + | { MODKEY|ControlMask|ShiftMask, XK_4, viewextend, { .i = 4 } }, \ |
|
| 47 | 52 | }; |
|
| 48 | 53 | ||
| 49 | 54 | #define RULES \ |
| 109 | 109 | dc.x += dc.w; |
|
| 110 | 110 | dc.w = textw(tags[i]); |
|
| 111 | 111 | if(istile) |
|
| 112 | - | drawtext(tags[i], tsel[i]); |
|
| 112 | + | drawtext(tags[i], seltag[i]); |
|
| 113 | 113 | else |
|
| 114 | - | drawtext(tags[i], !tsel[i]); |
|
| 114 | + | drawtext(tags[i], !seltag[i]); |
|
| 115 | 115 | } |
|
| 116 | 116 | x = dc.x + dc.w; |
|
| 117 | 117 | dc.w = textw(stext); |
| 36 | 36 | .B Standard input |
|
| 37 | 37 | is read and displayed in the status text area. |
|
| 38 | 38 | .TP |
|
| 39 | - | .B Button[1-3] |
|
| 40 | - | click on a tag label focuses that tag. |
|
| 39 | + | .B Button[1,3] |
|
| 40 | + | click on a tag label focuses that |
|
| 41 | + | .B tag. |
|
| 42 | + | .TP |
|
| 43 | + | .B Button2 |
|
| 44 | + | click on a tag label (un)extends the current |
|
| 45 | + | .B tag. |
|
| 41 | 46 | .TP |
|
| 42 | 47 | .B Button[1,4] |
|
| 43 | - | click on the bar focuses the previous tag. |
|
| 48 | + | click on the bar focuses the previous |
|
| 49 | + | .B tag. |
|
| 44 | 50 | .TP |
|
| 45 | 51 | .B Button[2,5] |
|
| 46 | - | click on the bar focuses the next tag. |
|
| 52 | + | click on the bar focuses the next |
|
| 53 | + | .B tag. |
|
| 47 | 54 | .SS Keyboard commands |
|
| 48 | 55 | .TP |
|
| 49 | 56 | .B Mod1-Return |
|
| 108 | 115 | .B nth tag |
|
| 109 | 116 | to current |
|
| 110 | 117 | .B window. |
|
| 118 | + | .TP |
|
| 119 | + | .B Mod1-Control-Shift-[0..n] |
|
| 120 | + | (Un)extends |
|
| 121 | + | .B nth tag |
|
| 122 | + | with current |
|
| 123 | + | .B tag. |
|
| 111 | 124 | .SS Mouse commands |
|
| 112 | 125 | .TP |
|
| 113 | 126 | .B Mod1-Button1 |
|
| 74 | 74 | extern void (*handler[LASTEvent])(XEvent *); |
|
| 75 | 75 | extern void (*arrange)(Arg *); |
|
| 76 | 76 | extern Atom wmatom[WMLast], netatom[NetLast]; |
|
| 77 | - | extern Bool running, issel, *tsel; |
|
| 77 | + | extern Bool running, issel, *seltag; |
|
| 78 | 78 | extern Client *clients, *sel; |
|
| 79 | 79 | extern Cursor cursor[CurLast]; |
|
| 80 | 80 | extern DC dc; |
|
| 128 | 128 | extern void settags(Client *c); |
|
| 129 | 129 | extern void togglemode(Arg *arg); |
|
| 130 | 130 | extern void view(Arg *arg); |
|
| 131 | + | extern void viewextend(Arg *arg); |
|
| 131 | 132 | extern void viewnext(Arg *arg); |
|
| 132 | 133 | extern void viewprev(Arg *arg); |
|
| 133 | 134 | ||
| 108 | 108 | for(a.i = 0; a.i < ntags; a.i++) { |
|
| 109 | 109 | x += textw(tags[a.i]); |
|
| 110 | 110 | if(ev->x < x) { |
|
| 111 | - | if(ev->button == Button3) { |
|
| 112 | - | tsel[a.i] = True; |
|
| 113 | - | arrange(NULL); |
|
| 114 | - | drawall(); |
|
| 115 | - | } |
|
| 111 | + | if(ev->button == Button3) |
|
| 112 | + | viewextend(&a); |
|
| 116 | 113 | else |
|
| 117 | 114 | view(&a); |
|
| 118 | 115 | return; |
| 83 | 83 | /* extern */ |
|
| 84 | 84 | ||
| 85 | 85 | char stext[1024]; |
|
| 86 | - | Bool *tsel; |
|
| 86 | + | Bool *seltag; |
|
| 87 | 87 | int screen, sx, sy, sw, sh, bx, by, bw, bh, mw; |
|
| 88 | 88 | unsigned int ntags; |
|
| 89 | 89 | Atom wmatom[WMLast], netatom[NetLast]; |
|
| 213 | 213 | initrregs(); |
|
| 214 | 214 | ||
| 215 | 215 | for(ntags = 0; tags[ntags]; ntags++); |
|
| 216 | - | tsel = emallocz(sizeof(Bool) * ntags); |
|
| 217 | - | tsel[DEFTAG] = True; |
|
| 216 | + | seltag = emallocz(sizeof(Bool) * ntags); |
|
| 217 | + | seltag[DEFTAG] = True; |
|
| 218 | 218 | ||
| 219 | 219 | /* style */ |
|
| 220 | 220 | dc.bg = getcolor(BGCOLOR); |
|
| 181 | 181 | unsigned int i; |
|
| 182 | 182 | ||
| 183 | 183 | for(i = 0; i < ntags; i++) |
|
| 184 | - | if(c->tags[i] && tsel[i]) |
|
| 184 | + | if(c->tags[i] && seltag[i]) |
|
| 185 | 185 | return True; |
|
| 186 | 186 | return False; |
|
| 187 | 187 | } |
|
| 229 | 229 | } |
|
| 230 | 230 | if(!matched) |
|
| 231 | 231 | for(i = 0; i < ntags; i++) |
|
| 232 | - | c->tags[i] = tsel[i]; |
|
| 232 | + | c->tags[i] = seltag[i]; |
|
| 233 | 233 | } |
|
| 234 | 234 | ||
| 235 | 235 | void |
|
| 245 | 245 | unsigned int i; |
|
| 246 | 246 | ||
| 247 | 247 | for(i = 0; i < ntags; i++) |
|
| 248 | - | tsel[i] = False; |
|
| 249 | - | tsel[arg->i] = True; |
|
| 248 | + | seltag[i] = False; |
|
| 249 | + | seltag[arg->i] = True; |
|
| 250 | + | arrange(NULL); |
|
| 251 | + | drawall(); |
|
| 252 | + | } |
|
| 253 | + | ||
| 254 | + | void |
|
| 255 | + | viewextend(Arg *arg) |
|
| 256 | + | { |
|
| 257 | + | unsigned int i; |
|
| 258 | + | ||
| 259 | + | seltag[arg->i] = !seltag[arg->i]; |
|
| 260 | + | for(i = 0; !seltag[i] && i < ntags; i++); |
|
| 261 | + | if(i == ntags) |
|
| 262 | + | seltag[arg->i] = True; /* cannot toggle last view */ |
|
| 250 | 263 | arrange(NULL); |
|
| 251 | 264 | drawall(); |
|
| 252 | 265 | } |
|
| 256 | 269 | { |
|
| 257 | 270 | unsigned int i; |
|
| 258 | 271 | ||
| 259 | - | for(i = 0; !tsel[i]; i++); |
|
| 272 | + | for(i = 0; !seltag[i]; i++); |
|
| 260 | 273 | arg->i = (i < ntags-1) ? i+1 : 0; |
|
| 261 | 274 | view(arg); |
|
| 262 | 275 | } |
|
| 266 | 279 | { |
|
| 267 | 280 | unsigned int i; |
|
| 268 | 281 | ||
| 269 | - | for(i = 0; !tsel[i]; i++); |
|
| 282 | + | for(i = 0; !seltag[i]; i++); |
|
| 270 | 283 | arg->i = (i > 0) ? i-1 : ntags-1; |
|
| 271 | 284 | view(arg); |
|
| 272 | 285 | } |
|