only cycle through active tags
* or left (negative value)
*/
void
-shiftview(const Arg *arg) {
- Arg shifted;
+shiftview(const Arg *arg)
+{
+ Arg a;
+ Client *c;
+ unsigned visible = 0;
+ int i = arg->i;
+ int count = 0;
+ int nextseltags, curseltags = selmon->tagset[selmon->seltags];
- if(arg->i > 0) // left circular shift
- shifted.ui = (selmon->tagset[selmon->seltags] << arg->i)
- | (selmon->tagset[selmon->seltags] >> (LENGTH(tags) - arg->i));
+ do {
+ if(i > 0) // left circular shift
+ nextseltags = (curseltags << i) | (curseltags >> (LENGTH(tags) - i));
else // right circular shift
- shifted.ui = selmon->tagset[selmon->seltags] >> (- arg->i)
- | selmon->tagset[selmon->seltags] << (LENGTH(tags) + arg->i);
+ nextseltags = curseltags >> (- i) | (curseltags << (LENGTH(tags) + i));
- view(&shifted);
+ // Check if tag is visible
+ for (c = selmon->clients; c && !visible; c = c->next)
+ if (nextseltags & c->tags) {
+ visible = 1;
+ break;
+ }
+ i += arg->i;
+ } while (!visible && ++count < 10);
+
+ if (count < 10) {
+ a.i = nextseltags;
+ view(&a);
+ }
}
