summaryrefslogtreecommitdiff
path: root/shiftview.c
blob: fa53db07a9cc1dad36298fc9b07a83f92c7cd7c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// "arg->i" stores the number of tags to shift right (positive value)
//          or left (negative value)
void
shiftview(const Arg *arg)
{
	Arg a;
	Client *c;
	bool visible = false;
	int i = arg->i;
	int count = 0;
	int nextseltags, curseltags = selmon->tagset[selmon->seltags];

	do {
		if (i > 0) // left circular shift
            nextseltags = (curseltags << i) | (curseltags >> (TAGCOUNT - i));
        else // right circular shift
			nextseltags = curseltags >> (-i) | (curseltags << (TAGCOUNT + i));

        // Check if the tag is visible
        wl_list_for_each(c, &clients, link) {
            if (c->mon == selmon && nextseltags & c->tags) {
                visible = true;
                break;
            }
        }

		i += arg->i;
    } while (!visible && ++count <= TAGCOUNT);

    if (count <= TAGCOUNT) {
        a.i = nextseltags;
        view(&a);
    }
}