shift-tools.c - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) 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 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 }