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 }