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