shift-tools-scratchpads.c - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
shift-tools-scratchpads.c (4274B)
---
1 /* Sends a window to the next/prev tag */
2 void
3 shifttag(const Arg *arg)
4 {
5 Arg shifted;
6 shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
7
8
9 if (arg->i > 0) /* left circular shift */
10 shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i))) & ~SPTAGMASK;
11 else /* right circular shift */
12 shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i)) & ~SPTAGMASK;
13 tag(&shifted);
14 }
15 /* Sends a window to the next/prev tag that has a client, else it moves it to the next/prev one. */
16 void
17 shifttagclients(const Arg *arg)
18 {
19
20 Arg shifted;
21 Client *c;
22 unsigned int tagmask = 0;
23 shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
24
25 for (c = selmon->clients; c; c = c->next)
26 if (!(c->tags & SPTAGMASK))
27 tagmask = tagmask | c->tags;
28
29
30 if (arg->i > 0) /* left circular shift */
31 do {
32 shifted.ui = (shifted.ui << arg->i)
33 | (shifted.ui >> (LENGTH(tags) - arg->i));
34 shifted.ui &= ~SPTAGMASK;
35 } while (tagmask && !(shifted.ui & tagmask));
36 else /* right circular shift */
37 do {
38 shifted.ui = (shifted.ui >> (- arg->i)
39 | shifted.ui << (LENGTH(tags) + arg->i));
40 shifted.ui &= ~SPTAGMASK;
41 } while (tagmask && !(shifted.ui & tagmask));
42 tag(&shifted);
43 }
44 /* Navigate to the next/prev tag */
45 void
46 shiftview(const Arg *arg)
47 {
48 Arg shifted;
49 shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
50
51 if (arg->i > 0) {/* left circular shift */
52 shifted.ui = (shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i));
53 shifted.ui &= ~SPTAGMASK;
54 } else { /* right circular shift */
55 shifted.ui = (shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i));
56 shifted.ui &= ~SPTAGMASK;
57 }
58 view(&shifted);
59 }
60 /* Navigate to the next/prev tag that has a client, else moves it to the next/prev tag */
61 void
62 shiftviewclients(const Arg *arg)
63 {
64 Arg shifted;
65 Client *c;
66 unsigned int tagmask = 0;
67 shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
68
69 for (c = selmon->clients; c; c = c->next)
70 if (!(c->tags & SPTAGMASK))
71 tagmask = tagmask | c->tags;
72
73
74 if (arg->i > 0) /* left circular shift */
75 do {
76 shifted.ui = (shifted.ui << arg->i)
77 | (shifted.ui >> (LENGTH(tags) - arg->i));
78 shifted.ui &= ~SPTAGMASK;
79 } while (tagmask && !(shifted.ui & tagmask));
80 else /* right circular shift */
81 do {
82 shifted.ui = (shifted.ui >> (- arg->i)
83 | shifted.ui << (LENGTH(tags) + arg->i));
84 shifted.ui &= ~SPTAGMASK;
85 } while (tagmask && !(shifted.ui & tagmask));
86 view(&shifted);
87 }
88 /* move the current active window to the next/prev tag and view it. More like following the window */
89 void
90 shiftboth(const Arg *arg)
91 {
92 Arg shifted;
93 shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
94
95 if (arg->i > 0) /* left circular shift */
96 shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i))) & ~SPTAGMASK;
97 else /* right circular shift */
98 shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i))) & ~SPTAGMASK;
99 tag(&shifted);
100 view(&shifted);
101 }
102 //helper function for shiftswaptags found on:
103 //https://github.com/moizifty/DWM-Build/blob/65379c62640788881486401a0d8c79333751b02f/config.h#L48
104 // modified to work with scratchpad
105 void
106 swaptags(const Arg *arg)
107 {
108 Client *c;
109 unsigned int newtag = arg->ui & TAGMASK;
110 unsigned int curtag = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
111
112 if (newtag == curtag || !curtag || (curtag & (curtag-1)))
113 return;
114
115 for (c = selmon->clients; c != NULL; c = c->next) {
116 if ((c->tags & newtag) || (c->tags & curtag))
117 c->tags ^= curtag ^ newtag;
118
119 if (!c->tags)
120 c->tags = newtag;
121 }
122
123 //move to the swaped tag
124 //selmon->tagset[selmon->seltags] = newtag;
125
126 focus(NULL);
127 arrange(selmon);
128 }
129 /* swaps "tags" (all the clients) with the next/prev tag. */
130 void
131 shiftswaptags(const Arg *arg)
132 {
133 Arg shifted;
134 shifted.ui = selmon->tagset[selmon->seltags] & ~SPTAGMASK;
135
136 if (arg->i > 0) /* left circular shift */
137 shifted.ui = ((shifted.ui << arg->i) | (shifted.ui >> (LENGTH(tags) - arg->i))) & ~SPTAGMASK;
138 else /* right circular shift */
139 shifted.ui = ((shifted.ui >> (- arg->i) | shifted.ui << (LENGTH(tags) + arg->i))) & ~SPTAGMASK;
140 swaptags(&shifted);
141 // uncomment if you also want to "go" (view) the tag where the the clients are going
142 //view(&shifted);
143 }