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 it to 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 }