+ if(!sel || !isvisible(sel))
+ sel = getnext(clients);
+ if(sel)
+ focus(sel);
+ else
+ XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
+ restack();
+}
+
+Client *
+getnext(Client *c)
+{
+ for(; c && !isvisible(c); c = c->next);
+ return c;
+}
+
+Client *
+getprev(Client *c)
+{
+ for(; c && !isvisible(c); c = c->prev);
+ return c;
+}
+
+void
+initrregs()
+{
+ unsigned int i;
+ regex_t *reg;
+
+ if(rreg)
+ return;
+ len = sizeof(rule) / sizeof(rule[0]);
+ rreg = emallocz(len * sizeof(RReg));
+
+ for(i = 0; i < len; i++) {
+ if(rule[i].clpattern) {
+ reg = emallocz(sizeof(regex_t));
+ if(regcomp(reg, rule[i].clpattern, 0))
+ free(reg);
+ else
+ rreg[i].clregex = reg;
+ }
+ if(rule[i].tpattern) {
+ reg = emallocz(sizeof(regex_t));
+ if(regcomp(reg, rule[i].tpattern, 0))
+ free(reg);
+ else
+ rreg[i].tregex = reg;
+ }
+ }
+}
+
+Bool
+isvisible(Client *c)
+{
+ unsigned int i;
+
+ for(i = 0; i < ntags; i++)
+ if(c->tags[i] && seltag[i])
+ return True;
+ return False;
+}
+
+void
+restack()
+{
+ static unsigned int nwins = 0;
+ static Window *wins = NULL;
+ unsigned int f, fi, m, mi, n;
+ Client *c;
+ XEvent ev;
+
+ for(f = 0, m = 0, c = clients; c; c = c->next)
+ if(isvisible(c)) {
+ if(c->isfloat || arrange == dofloat)
+ f++;
+ else
+ m++;