aewl

view tag.c @ 541:08d3d329270a

using MASTER 600 again, it is definately better, and using urxvtc for the moment (it doesn't flickers on refreshes, but this is not because of Marc Lehmann, it is because of the original rxvt code)
author arg@mig29
date Thu, 26 Oct 2006 12:13:41 +0200
parents 651f2c868b31
children 797e27162b43
line source
1 /* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com>
2 * See LICENSE file for license details.
3 */
4 #include "dwm.h"
5 #include <regex.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <string.h>
9 #include <sys/types.h>
10 #include <X11/Xutil.h>
13 typedef struct {
14 const char *clpattern;
15 const char *tpattern;
16 Bool isfloat;
17 } Rule;
19 typedef struct {
20 regex_t *clregex;
21 regex_t *tregex;
22 } RReg;
24 /* static */
26 TAGS
27 RULES
29 static RReg *rreg = NULL;
30 static unsigned int len = 0;
32 /* extern */
34 Client *
35 getnext(Client *c) {
36 for(; c && !isvisible(c); c = c->next);
37 return c;
38 }
40 Client *
41 getprev(Client *c) {
42 for(; c && !isvisible(c); c = c->prev);
43 return c;
44 }
46 void
47 initrregs(void) {
48 unsigned int i;
49 regex_t *reg;
51 if(rreg)
52 return;
53 len = sizeof(rule) / sizeof(rule[0]);
54 rreg = emallocz(len * sizeof(RReg));
55 for(i = 0; i < len; i++) {
56 if(rule[i].clpattern) {
57 reg = emallocz(sizeof(regex_t));
58 if(regcomp(reg, rule[i].clpattern, 0))
59 free(reg);
60 else
61 rreg[i].clregex = reg;
62 }
63 if(rule[i].tpattern) {
64 reg = emallocz(sizeof(regex_t));
65 if(regcomp(reg, rule[i].tpattern, 0))
66 free(reg);
67 else
68 rreg[i].tregex = reg;
69 }
70 }
71 }
73 void
74 settags(Client *c, Client *trans) {
75 char prop[512];
76 unsigned int i, j;
77 regmatch_t tmp;
78 Bool matched = trans != NULL;
79 XClassHint ch;
81 if(matched) {
82 for(i = 0; i < ntags; i++)
83 c->tags[i] = trans->tags[i];
84 }
85 else if(XGetClassHint(dpy, c->win, &ch)) {
86 snprintf(prop, sizeof(prop), "%s:%s:%s",
87 ch.res_class ? ch.res_class : "",
88 ch.res_name ? ch.res_name : "", c->name);
89 for(i = 0; !matched && i < len; i++)
90 if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, 1, &tmp, 0)) {
91 c->isfloat = rule[i].isfloat;
92 for(j = 0; rreg[i].tregex && j < ntags; j++) {
93 if(!regexec(rreg[i].tregex, tags[j], 1, &tmp, 0)) {
94 matched = True;
95 c->tags[j] = True;
96 }
97 }
98 }
99 if(ch.res_class)
100 XFree(ch.res_class);
101 if(ch.res_name)
102 XFree(ch.res_name);
103 }
104 if(!matched)
105 for(i = 0; i < ntags; i++)
106 c->tags[i] = seltag[i];
107 for(c->weight = 0; c->weight < ntags && !c->tags[c->weight]; c->weight++);
108 }
110 void
111 tag(Arg *arg) {
112 unsigned int i;
114 if(!sel)
115 return;
116 for(i = 0; i < ntags; i++)
117 sel->tags[i] = False;
118 sel->tags[arg->i] = True;
119 sel->weight = arg->i;
120 arrange();
121 }
123 void
124 toggletag(Arg *arg) {
125 unsigned int i;
127 if(!sel)
128 return;
129 sel->tags[arg->i] = !sel->tags[arg->i];
130 for(i = 0; i < ntags && !sel->tags[i]; i++);
131 if(i == ntags)
132 sel->tags[arg->i] = True;
133 sel->weight = (i == ntags) ? arg->i : i;
134 arrange();
135 }