| shift-tools.c - sites - public wiki contents of suckless.org | |
| git clone git://git.suckless.org/sites | |
| Log | |
| Files | |
| Refs | |
| --- | |
| shift-tools.c (2437B) | |
| --- | |
| 1 void | |
| 2 shift(unsigned int *tag, int i) | |
| 3 { | |
| 4 if (i > 0) /* left circular shift */ | |
| 5 *tag = ((*tag << i) | (*tag >> (LENGTH(tags) - i))); | |
| 6 else /* right circular shift */ | |
| 7 *tag = (*tag >> (- i) | *tag << (LENGTH(tags) + i)); | |
| 8 } | |
| 9 | |
| 10 /* send a window to the next/prev tag */ | |
| 11 void | |
| 12 shifttag(const Arg *arg) | |
| 13 { | |
| 14 Arg shifted = { .ui = selmon->tagset[selmon->seltags] }; | |
| 15 | |
| 16 if (!selmon->clients) | |
| 17 return; | |
| 18 | |
| 19 shift(&shifted.ui, arg->i); | |
| 20 tag(&shifted); | |
| 21 } | |
| 22 | |
| 23 /* send a window to the next/prev tag that has a client, else it moves i… | |
| 24 * the next/prev one. */ | |
| 25 void | |
| 26 shifttagclients(const Arg *arg) | |
| 27 { | |
| 28 Arg shifted = { .ui = selmon->tagset[selmon->seltags] }; | |
| 29 Client *c; | |
| 30 unsigned int tagmask = 0; | |
| 31 | |
| 32 for (c = selmon->clients; c; c = c->next) | |
| 33 tagmask = tagmask | c->tags; | |
| 34 | |
| 35 do | |
| 36 shift(&shifted.ui, arg->i); | |
| 37 while (tagmask && !(shifted.ui & tagmask)); | |
| 38 | |
| 39 tag(&shifted); | |
| 40 } | |
| 41 | |
| 42 /* view the next/prev tag */ | |
| 43 void | |
| 44 shiftview(const Arg *arg) | |
| 45 { | |
| 46 Arg shifted = { .ui = selmon->tagset[selmon->seltags] }; | |
| 47 | |
| 48 shift(&shifted.ui, arg->i); | |
| 49 view(&shifted); | |
| 50 } | |
| 51 | |
| 52 /* view the next/prev tag that has a client, else view the next/prev tag… | |
| 53 void | |
| 54 shiftviewclients(const Arg *arg) | |
| 55 { | |
| 56 Arg shifted = { .ui = selmon->tagset[selmon->seltags] }; | |
| 57 Client *c; | |
| 58 unsigned int tagmask = 0; | |
| 59 | |
| 60 for (c = selmon->clients; c; c = c->next) | |
| 61 tagmask = tagmask | c->tags; | |
| 62 | |
| 63 do | |
| 64 shift(&shifted.ui, arg->i); | |
| 65 while (tagmask && !(shifted.ui & tagmask)); | |
| 66 | |
| 67 view(&shifted); | |
| 68 } | |
| 69 | |
| 70 /* move the active window to the next/prev tag and view it's new tag */ | |
| 71 void | |
| 72 shiftboth(const Arg *arg) | |
| 73 { | |
| 74 Arg shifted = { .ui = selmon->tagset[selmon->seltags] }; | |
| 75 | |
| 76 shift(&shifted.ui, arg->i); | |
| 77 tag(&shifted); | |
| 78 view(&shifted); | |
| 79 } | |
| 80 | |
| 81 /* swaptags: https://dwm.suckless.org/patches/swaptags, used below */ | |
| 82 void | |
| 83 swaptags(const Arg *arg) | |
| 84 { | |
| 85 Client *c; | |
| 86 unsigned int newtag = arg->ui & TAGMASK; | |
| 87 unsigned int curtag = selmon->tagset[selmon->seltags]; | |
| 88 | |
| 89 if (newtag == curtag || !curtag || (curtag & (curtag-1))) | |
| 90 return; | |
| 91 | |
| 92 for (c = selmon->clients; c != NULL; c = c->next) { | |
| 93 if ((c->tags & newtag) || (c->tags & curtag)) | |
| 94 c->tags ^= curtag ^ newtag; | |
| 95 if (!c->tags) | |
| 96 c->tags = newtag; | |
| 97 } | |
| 98 | |
| 99 //uncomment to 'view' the new swaped tag | |
| 100 //selmon->tagset[selmon->seltags] = newtag; | |
| 101 | |
| 102 focus(NULL); | |
| 103 arrange(selmon); | |
| 104 } | |
| 105 | |
| 106 /* swaps "tags" (all the clients on it) with the next/prev tag */ | |
| 107 void | |
| 108 shiftswaptags(const Arg *arg) | |
| 109 { | |
| 110 Arg shifted = { .ui = selmon->tagset[selmon->seltags] }; | |
| 111 | |
| 112 shift(&shifted.ui, arg->i); | |
| 113 swaptags(&shifted); | |
| 114 } |