Mercurial > aewl
annotate 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 | a5567a0d3011 |
children | 797e27162b43 |
rev | line source |
---|---|
532
651f2c868b31
code polishing, removed unnecessary newlines
Anselm R. Garbe <arg@10kloc.org>
parents:
487
diff
changeset
|
1 /* (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> |
75 | 2 * See LICENSE file for license details. |
3 */ | |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
4 #include "dwm.h" |
114 | 5 #include <regex.h> |
6 #include <stdio.h> | |
191 | 7 #include <stdlib.h> |
75 | 8 #include <string.h> |
114 | 9 #include <sys/types.h> |
75 | 10 #include <X11/Xutil.h> |
11 | |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
12 |
114 | 13 typedef struct { |
191 | 14 const char *clpattern; |
15 const char *tpattern; | |
114 | 16 Bool isfloat; |
17 } Rule; | |
18 | |
191 | 19 typedef struct { |
20 regex_t *clregex; | |
21 regex_t *tregex; | |
22 } RReg; | |
23 | |
24 /* static */ | |
25 | |
146
f328ce9c558c
centralized/externalized configuration to config.h
arg@10ksloc.org
parents:
144
diff
changeset
|
26 TAGS |
f328ce9c558c
centralized/externalized configuration to config.h
arg@10ksloc.org
parents:
144
diff
changeset
|
27 RULES |
84
052fe7498930
ordered variables in structs and source files alphabetically
Anselm R. Garbe <garbeam@wmii.de>
parents:
80
diff
changeset
|
28 |
191 | 29 static RReg *rreg = NULL; |
30 static unsigned int len = 0; | |
31 | |
125 | 32 /* extern */ |
33 | |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
34 Client * |
461
9d23330a5268
removed a bunch of lines through making function signatures more consistent with my style ( { does not belong to a new line, if function args are single-lined)
Anselm R. Garbe <arg@10kloc.org>
parents:
441
diff
changeset
|
35 getnext(Client *c) { |
261
d6fd632d861c
implement multi-tag selection through button3 click on the specific tag
Anselm R.Garbe <arg@10ksloc.org>
parents:
240
diff
changeset
|
36 for(; c && !isvisible(c); c = c->next); |
93
c498da7520c7
added heretag command which allows to tag a client of a foreign tag with current tag
Anselm R. Garbe <garbeam@wmii.de>
parents:
84
diff
changeset
|
37 return c; |
c498da7520c7
added heretag command which allows to tag a client of a foreign tag with current tag
Anselm R. Garbe <garbeam@wmii.de>
parents:
84
diff
changeset
|
38 } |
c498da7520c7
added heretag command which allows to tag a client of a foreign tag with current tag
Anselm R. Garbe <garbeam@wmii.de>
parents:
84
diff
changeset
|
39 |
127
1480e19f6377
using double-linked list in order to get correct prev focus handling
arg@10ksloc.org
parents:
125
diff
changeset
|
40 Client * |
461
9d23330a5268
removed a bunch of lines through making function signatures more consistent with my style ( { does not belong to a new line, if function args are single-lined)
Anselm R. Garbe <arg@10kloc.org>
parents:
441
diff
changeset
|
41 getprev(Client *c) { |
261
d6fd632d861c
implement multi-tag selection through button3 click on the specific tag
Anselm R.Garbe <arg@10ksloc.org>
parents:
240
diff
changeset
|
42 for(; c && !isvisible(c); c = c->prev); |
127
1480e19f6377
using double-linked list in order to get correct prev focus handling
arg@10ksloc.org
parents:
125
diff
changeset
|
43 return c; |
1480e19f6377
using double-linked list in order to get correct prev focus handling
arg@10ksloc.org
parents:
125
diff
changeset
|
44 } |
1480e19f6377
using double-linked list in order to get correct prev focus handling
arg@10ksloc.org
parents:
125
diff
changeset
|
45 |
93
c498da7520c7
added heretag command which allows to tag a client of a foreign tag with current tag
Anselm R. Garbe <garbeam@wmii.de>
parents:
84
diff
changeset
|
46 void |
487 | 47 initrregs(void) { |
191 | 48 unsigned int i; |
49 regex_t *reg; | |
50 | |
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 } | |
72 | |
270
dacd3f3c5823
implemented restack behavior (floats are on top in tiled mode)
Anselm R.Garbe <arg@10ksloc.org>
parents:
267
diff
changeset
|
73 void |
461
9d23330a5268
removed a bunch of lines through making function signatures more consistent with my style ( { does not belong to a new line, if function args are single-lined)
Anselm R. Garbe <arg@10kloc.org>
parents:
441
diff
changeset
|
74 settags(Client *c, Client *trans) { |
336
2a65e8b3d21a
implemented class:inst:title matching
Anselm R. Garbe <arg@10kloc.org>
parents:
327
diff
changeset
|
75 char prop[512]; |
191 | 76 unsigned int i, j; |
114 | 77 regmatch_t tmp; |
431
a230e4432bb7
moved transient_for tag inheritance to settags
Anselm R. Garbe <arg@10kloc.org>
parents:
430
diff
changeset
|
78 Bool matched = trans != NULL; |
114 | 79 XClassHint ch; |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
80 |
431
a230e4432bb7
moved transient_for tag inheritance to settags
Anselm R. Garbe <arg@10kloc.org>
parents:
430
diff
changeset
|
81 if(matched) { |
a230e4432bb7
moved transient_for tag inheritance to settags
Anselm R. Garbe <arg@10kloc.org>
parents:
430
diff
changeset
|
82 for(i = 0; i < ntags; i++) |
a230e4432bb7
moved transient_for tag inheritance to settags
Anselm R. Garbe <arg@10kloc.org>
parents:
430
diff
changeset
|
83 c->tags[i] = trans->tags[i]; |
a230e4432bb7
moved transient_for tag inheritance to settags
Anselm R. Garbe <arg@10kloc.org>
parents:
430
diff
changeset
|
84 } |
a230e4432bb7
moved transient_for tag inheritance to settags
Anselm R. Garbe <arg@10kloc.org>
parents:
430
diff
changeset
|
85 else if(XGetClassHint(dpy, c->win, &ch)) { |
336
2a65e8b3d21a
implemented class:inst:title matching
Anselm R. Garbe <arg@10kloc.org>
parents:
327
diff
changeset
|
86 snprintf(prop, sizeof(prop), "%s:%s:%s", |
114 | 87 ch.res_class ? ch.res_class : "", |
336
2a65e8b3d21a
implemented class:inst:title matching
Anselm R. Garbe <arg@10kloc.org>
parents:
327
diff
changeset
|
88 ch.res_name ? ch.res_name : "", c->name); |
191 | 89 for(i = 0; !matched && i < len; i++) |
336
2a65e8b3d21a
implemented class:inst:title matching
Anselm R. Garbe <arg@10kloc.org>
parents:
327
diff
changeset
|
90 if(rreg[i].clregex && !regexec(rreg[i].clregex, prop, 1, &tmp, 0)) { |
191 | 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 } | |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
97 } |
114 | 98 } |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
99 if(ch.res_class) |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
100 XFree(ch.res_class); |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
101 if(ch.res_name) |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
102 XFree(ch.res_name); |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
103 } |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
104 if(!matched) |
261
d6fd632d861c
implement multi-tag selection through button3 click on the specific tag
Anselm R.Garbe <arg@10ksloc.org>
parents:
240
diff
changeset
|
105 for(i = 0; i < ntags; i++) |
262
d659a2dce2b5
implemented viewextend and added M-S-C-n shortcuts for extending the current view... updated man page (works great!) nice feature
Anselm R.Garbe <arg@10ksloc.org>
parents:
261
diff
changeset
|
106 c->tags[i] = seltag[i]; |
441
785bad5f21dd
does this preserve z order for anthony?
Anselm R. Garbe <arg@10kloc.org>
parents:
440
diff
changeset
|
107 for(c->weight = 0; c->weight < ntags && !c->tags[c->weight]; c->weight++); |
76
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
108 } |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
109 |
4bd49f404f10
proceeded with cleaning up, sorting functions, etc
Anselm R. Garbe <garbeam@wmii.de>
parents:
75
diff
changeset
|
110 void |
461
9d23330a5268
removed a bunch of lines through making function signatures more consistent with my style ( { does not belong to a new line, if function args are single-lined)
Anselm R. Garbe <arg@10kloc.org>
parents:
441
diff
changeset
|
111 tag(Arg *arg) { |
284
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
112 unsigned int i; |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
113 |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
114 if(!sel) |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
115 return; |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
116 for(i = 0; i < ntags; i++) |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
117 sel->tags[i] = False; |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
118 sel->tags[arg->i] = True; |
441
785bad5f21dd
does this preserve z order for anthony?
Anselm R. Garbe <arg@10kloc.org>
parents:
440
diff
changeset
|
119 sel->weight = arg->i; |
533
a5567a0d3011
do* has no Arg arument anymore (never called directly)
Anselm R. Garbe <arg@10kloc.org>
parents:
532
diff
changeset
|
120 arrange(); |
284
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
121 } |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
122 |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
123 void |
461
9d23330a5268
removed a bunch of lines through making function signatures more consistent with my style ( { does not belong to a new line, if function args are single-lined)
Anselm R. Garbe <arg@10kloc.org>
parents:
441
diff
changeset
|
124 toggletag(Arg *arg) { |
284
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
125 unsigned int i; |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
126 |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
127 if(!sel) |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
128 return; |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
129 sel->tags[arg->i] = !sel->tags[arg->i]; |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
130 for(i = 0; i < ntags && !sel->tags[i]; i++); |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
131 if(i == ntags) |
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
132 sel->tags[arg->i] = True; |
441
785bad5f21dd
does this preserve z order for anthony?
Anselm R. Garbe <arg@10kloc.org>
parents:
440
diff
changeset
|
133 sel->weight = (i == ntags) ? arg->i : i; |
533
a5567a0d3011
do* has no Arg arument anymore (never called directly)
Anselm R. Garbe <arg@10kloc.org>
parents:
532
diff
changeset
|
134 arrange(); |
284
5f5c56e104de
changed replacetag into toggletag
Anselm R.Garbe <arg@10ksloc.org>
parents:
277
diff
changeset
|
135 } |