+void
+settags(Client *c)
+{
+ char classinst[256];
+ unsigned int i, j;
+ regmatch_t tmp;
+ Bool matched = False;
+ XClassHint ch;
+
+ if(XGetClassHint(dpy, c->win, &ch)) {
+ snprintf(classinst, sizeof(classinst), "%s:%s",
+ ch.res_class ? ch.res_class : "",
+ ch.res_name ? ch.res_name : "");
+ for(i = 0; !matched && i < len; i++)
+ if(rreg[i].clregex && !regexec(rreg[i].clregex, classinst, 1, &tmp, 0)) {
+ c->isfloat = rule[i].isfloat;
+ for(j = 0; rreg[i].tregex && j < ntags; j++) {
+ if(!regexec(rreg[i].tregex, tags[j], 1, &tmp, 0)) {
+ matched = True;
+ c->tags[j] = True;
+ }
+ }
+ }
+ if(ch.res_class)
+ XFree(ch.res_class);
+ if(ch.res_name)
+ XFree(ch.res_name);
+ }
+ if(!matched)
+ for(i = 0; i < ntags; i++)
+ c->tags[i] = seltag[i];
+}
+
+void
+togglemode(Arg *arg)
+{
+ arrange = arrange == dofloat ? dotile : dofloat;
+ arrange(NULL);
+}
+
+void
+view(Arg *arg)
+{
+ unsigned int i;
+
+ for(i = 0; i < ntags; i++)
+ seltag[i] = False;
+ seltag[arg->i] = True;
+ arrange(NULL);
+ drawall();
+}
+
+void
+toggleview(Arg *arg)
+{
+ unsigned int i;
+
+ seltag[arg->i] = !seltag[arg->i];
+ for(i = 0; !seltag[i] && i < ntags; i++);
+ if(i == ntags)
+ seltag[arg->i] = True; /* cannot toggle last view */
+ arrange(NULL);
+ drawall();
+}
+
+void
+viewnext(Arg *arg)
+{
+ unsigned int i;
+
+ for(i = 0; !seltag[i]; i++);
+ arg->i = (i < ntags-1) ? i+1 : 0;
+ view(arg);
+}
+
+void
+viewprev(Arg *arg)
+{
+ unsigned int i;
+
+ for(i = 0; !seltag[i]; i++);
+ arg->i = (i > 0) ? i-1 : ntags-1;
+ view(arg);
+}