Mercurial > dwm-meillo
comparison client.c @ 73:c2ddb9dbbd10
rearranged
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Fri, 14 Jul 2006 22:33:38 +0200 |
parents | 7681ef838201 |
children | 5370ef170cc9 |
comparison
equal
deleted
inserted
replaced
72:d0eb0bb63c40 | 73:c2ddb9dbbd10 |
---|---|
9 #include <X11/Xatom.h> | 9 #include <X11/Xatom.h> |
10 #include <X11/Xutil.h> | 10 #include <X11/Xutil.h> |
11 | 11 |
12 #include "dwm.h" | 12 #include "dwm.h" |
13 | 13 |
14 void (*arrange)(Arg *) = tiling; | |
15 | |
16 static Rule rule[] = { | 14 static Rule rule[] = { |
17 /* class instance tags floating */ | 15 /* class instance tags floating */ |
18 { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, | 16 { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, |
19 }; | 17 }; |
20 | 18 |
21 static Client * | 19 Client * |
22 next(Client *c) | 20 next(Client *c) |
23 { | 21 { |
24 for(; c && !c->tags[tsel]; c = c->next); | 22 for(; c && !c->tags[tsel]; c = c->next); |
25 return c; | 23 return c; |
26 } | 24 } |
27 | 25 |
28 void | 26 void |
29 zoom(Arg *arg) | |
30 { | |
31 Client **l, *c; | |
32 | |
33 if(!sel) | |
34 return; | |
35 | |
36 if(sel == next(clients) && sel->next) { | |
37 if((c = next(sel->next))) | |
38 sel = c; | |
39 } | |
40 | |
41 for(l = &clients; *l && *l != sel; l = &(*l)->next); | |
42 *l = sel->next; | |
43 | |
44 sel->next = clients; /* pop */ | |
45 clients = sel; | |
46 arrange(NULL); | |
47 focus(sel); | |
48 } | |
49 | |
50 void | |
51 max(Arg *arg) | |
52 { | |
53 if(!sel) | |
54 return; | |
55 sel->x = sx; | |
56 sel->y = sy + bh; | |
57 sel->w = sw - 2 * sel->border; | |
58 sel->h = sh - 2 * sel->border - bh; | |
59 craise(sel); | |
60 resize(sel, False); | |
61 } | |
62 | |
63 void | |
64 view(Arg *arg) | |
65 { | |
66 Client *c; | |
67 | |
68 tsel = arg->i; | |
69 arrange(NULL); | |
70 | |
71 for(c = clients; c; c = next(c->next)) | |
72 draw_client(c); | |
73 draw_bar(); | |
74 } | |
75 | |
76 void | |
77 tappend(Arg *arg) | |
78 { | |
79 if(!sel) | |
80 return; | |
81 | |
82 sel->tags[arg->i] = tags[arg->i]; | |
83 arrange(NULL); | |
84 } | |
85 | |
86 void | |
87 ttrunc(Arg *arg) | |
88 { | |
89 int i; | |
90 if(!sel) | |
91 return; | |
92 | |
93 for(i = 0; i < TLast; i++) | |
94 sel->tags[i] = NULL; | |
95 tappend(arg); | |
96 } | |
97 | |
98 static void | |
99 ban_client(Client *c) | 27 ban_client(Client *c) |
100 { | 28 { |
101 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); | 29 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
102 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); | 30 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); |
103 } | |
104 | |
105 void | |
106 floating(Arg *arg) | |
107 { | |
108 Client *c; | |
109 | |
110 arrange = floating; | |
111 for(c = clients; c; c = c->next) { | |
112 if(c->tags[tsel]) | |
113 resize(c, True); | |
114 else | |
115 ban_client(c); | |
116 } | |
117 if(sel && !sel->tags[tsel]) { | |
118 if((sel = next(clients))) { | |
119 craise(sel); | |
120 focus(sel); | |
121 } | |
122 } | |
123 draw_bar(); | |
124 } | |
125 | |
126 void | |
127 tiling(Arg *arg) | |
128 { | |
129 Client *c; | |
130 int n, i, w, h; | |
131 | |
132 w = sw - mw; | |
133 arrange = tiling; | |
134 for(n = 0, c = clients; c; c = c->next) | |
135 if(c->tags[tsel] && !c->floating) | |
136 n++; | |
137 | |
138 if(n > 1) | |
139 h = (sh - bh) / (n - 1); | |
140 else | |
141 h = sh - bh; | |
142 | |
143 for(i = 0, c = clients; c; c = c->next) { | |
144 if(c->tags[tsel]) { | |
145 if(c->floating) { | |
146 craise(c); | |
147 resize(c, True); | |
148 continue; | |
149 } | |
150 if(n == 1) { | |
151 c->x = sx; | |
152 c->y = sy + bh; | |
153 c->w = sw - 2 * c->border; | |
154 c->h = sh - 2 * c->border - bh; | |
155 } | |
156 else if(i == 0) { | |
157 c->x = sx; | |
158 c->y = sy + bh; | |
159 c->w = mw - 2 * c->border; | |
160 c->h = sh - 2 * c->border - bh; | |
161 } | |
162 else { | |
163 c->x = sx + mw; | |
164 c->y = sy + (i - 1) * h + bh; | |
165 c->w = w - 2 * c->border; | |
166 c->h = h - 2 * c->border; | |
167 } | |
168 resize(c, False); | |
169 i++; | |
170 } | |
171 else | |
172 ban_client(c); | |
173 } | |
174 if(!sel || (sel && !sel->tags[tsel])) { | |
175 if((sel = next(clients))) { | |
176 craise(sel); | |
177 focus(sel); | |
178 } | |
179 } | |
180 draw_bar(); | |
181 } | |
182 | |
183 void | |
184 prevc(Arg *arg) | |
185 { | |
186 Client *c; | |
187 | |
188 if(!sel) | |
189 return; | |
190 | |
191 if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { | |
192 craise(c); | |
193 focus(c); | |
194 } | |
195 } | |
196 | |
197 void | |
198 nextc(Arg *arg) | |
199 { | |
200 Client *c; | |
201 | |
202 if(!sel) | |
203 return; | |
204 | |
205 if(!(c = next(sel->next))) | |
206 c = next(clients); | |
207 if(c) { | |
208 craise(c); | |
209 c->revert = sel; | |
210 focus(c); | |
211 } | |
212 } | |
213 | |
214 void | |
215 ckill(Arg *arg) | |
216 { | |
217 if(!sel) | |
218 return; | |
219 if(sel->proto & WM_PROTOCOL_DELWIN) | |
220 send_message(sel->win, wm_atom[WMProtocols], wm_atom[WMDelete]); | |
221 else | |
222 XKillClient(dpy, sel->win); | |
223 } | 31 } |
224 | 32 |
225 static void | 33 static void |
226 resize_title(Client *c) | 34 resize_title(Client *c) |
227 { | 35 { |
228 int i; | 36 int i; |
229 | 37 |
230 c->tw = 0; | 38 c->tw = 0; |
231 for(i = 0; i < TLast; i++) | 39 for(i = 0; i < TLast; i++) |
232 if(c->tags[i]) | 40 if(c->tags[i]) |
233 c->tw += textw(c->tags[i]) + dc.font.height; | 41 c->tw += textw(c->tags[i]); |
234 c->tw += textw(c->name) + dc.font.height; | 42 c->tw += textw(c->name); |
235 if(c->tw > c->w) | 43 if(c->tw > c->w) |
236 c->tw = c->w + 2; | 44 c->tw = c->w + 2; |
237 c->tx = c->x + c->w - c->tw + 2; | 45 c->tx = c->x + c->w - c->tw + 2; |
238 c->ty = c->y; | 46 c->ty = c->y; |
239 XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); | 47 XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); |
582 for(c = clients; c; c = c->next) | 390 for(c = clients; c; c = c->next) |
583 if(c->win == w) | 391 if(c->win == w) |
584 return c; | 392 return c; |
585 return NULL; | 393 return NULL; |
586 } | 394 } |
587 | |
588 void | |
589 draw_client(Client *c) | |
590 { | |
591 int i; | |
592 if(c == sel) { | |
593 draw_bar(); | |
594 XUnmapWindow(dpy, c->title); | |
595 XSetWindowBorder(dpy, c->win, dc.fg); | |
596 return; | |
597 } | |
598 | |
599 XSetWindowBorder(dpy, c->win, dc.bg); | |
600 XMapWindow(dpy, c->title); | |
601 | |
602 dc.x = dc.y = 0; | |
603 | |
604 dc.w = 0; | |
605 for(i = 0; i < TLast; i++) { | |
606 if(c->tags[i]) { | |
607 dc.x += dc.w; | |
608 dc.w = textw(c->tags[i]) + dc.font.height; | |
609 drawtext(c->tags[i], False, True); | |
610 } | |
611 } | |
612 dc.x += dc.w; | |
613 dc.w = textw(c->name) + dc.font.height; | |
614 drawtext(c->name, False, True); | |
615 XCopyArea(dpy, dc.drawable, c->title, dc.gc, | |
616 0, 0, c->tw, c->th, 0, 0); | |
617 XFlush(dpy); | |
618 } |