57 xerrordummy(Display *dsply, XErrorEvent *ee) { |
57 xerrordummy(Display *dsply, XErrorEvent *ee) { |
58 return 0; |
58 return 0; |
59 } |
59 } |
60 |
60 |
61 /* extern functions */ |
61 /* extern functions */ |
62 |
|
63 void |
|
64 ban(Client *c) { |
|
65 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
|
66 XMoveWindow(dpy, c->twin, c->tx + 2 * sw, c->ty); |
|
67 } |
|
68 |
62 |
69 void |
63 void |
70 configure(Client *c) { |
64 configure(Client *c) { |
71 XEvent synev; |
65 XEvent synev; |
72 |
66 |
143 |
127 |
144 void |
128 void |
145 manage(Window w, XWindowAttributes *wa) { |
129 manage(Window w, XWindowAttributes *wa) { |
146 Client *c; |
130 Client *c; |
147 Window trans; |
131 Window trans; |
148 XSetWindowAttributes twa; |
|
149 |
132 |
150 c = emallocz(sizeof(Client)); |
133 c = emallocz(sizeof(Client)); |
151 c->tags = emallocz(ntags * sizeof(Bool)); |
134 c->tags = emallocz(ntags * sizeof(Bool)); |
152 c->win = w; |
135 c->win = w; |
153 c->border = 0; |
136 c->border = 0; |
154 c->x = c->tx = wa->x; |
137 c->x = wa->x; |
155 c->y = c->ty = wa->y; |
138 c->y = wa->y; |
156 c->w = c->tw = wa->width; |
139 c->w = wa->width; |
157 c->h = wa->height; |
140 c->h = wa->height; |
158 c->th = bh; |
|
159 updatesizehints(c); |
141 updatesizehints(c); |
160 if(c->x + c->w + 2 * BORDERPX > sw) |
142 if(c->x + c->w + 2 * BORDERPX > sw) |
161 c->x = sw - c->w - 2 * BORDERPX; |
143 c->x = sw - c->w - 2 * BORDERPX; |
162 if(c->x < sx) |
144 if(c->x < sx) |
163 c->x = sx; |
145 c->x = sx; |
167 c->y = bh; |
149 c->y = bh; |
168 c->proto = getproto(c->win); |
150 c->proto = getproto(c->win); |
169 XSelectInput(dpy, c->win, |
151 XSelectInput(dpy, c->win, |
170 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
152 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
171 XGetTransientForHint(dpy, c->win, &trans); |
153 XGetTransientForHint(dpy, c->win, &trans); |
172 twa.override_redirect = 1; |
|
173 twa.background_pixmap = ParentRelative; |
|
174 twa.event_mask = ExposureMask | EnterWindowMask; |
|
175 c->twin = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, |
|
176 0, DefaultDepth(dpy, screen), CopyFromParent, |
|
177 DefaultVisual(dpy, screen), |
|
178 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); |
|
179 grabbuttons(c, False); |
154 grabbuttons(c, False); |
180 updatetitle(c); |
155 updatetitle(c); |
181 settags(c, getclient(trans)); |
156 settags(c, getclient(trans)); |
182 if(!c->isfloat) |
157 if(!c->isfloat) |
183 c->isfloat = trans || c->isfixed; |
158 c->isfloat = trans || c->isfixed; |
184 resizetitle(c); |
|
185 if(clients) |
159 if(clients) |
186 clients->prev = c; |
160 clients->prev = c; |
187 c->next = clients; |
161 c->next = clients; |
188 c->snext = stack; |
162 c->snext = stack; |
189 stack = clients = c; |
163 stack = clients = c; |
190 ban(c); |
164 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
191 XMapWindow(dpy, c->win); |
165 XMapWindow(dpy, c->win); |
192 XMapWindow(dpy, c->twin); |
|
193 if(isvisible(c)) |
166 if(isvisible(c)) |
194 focus(c); |
167 focus(c); |
195 arrange(); |
168 arrange(); |
196 } |
169 } |
197 |
170 |
238 else |
210 else |
239 wc.border_width = BORDERPX; |
211 wc.border_width = BORDERPX; |
240 XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc); |
212 XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc); |
241 configure(c); |
213 configure(c); |
242 XSync(dpy, False); |
214 XSync(dpy, False); |
243 } |
|
244 |
|
245 void |
|
246 resizetitle(Client *c) { |
|
247 c->tw = textw(c->name); |
|
248 if(c->tw > c->w) |
|
249 c->tw = c->w + 2 * BORDERPX; |
|
250 c->tx = c->x + c->w - c->tw + 2 * BORDERPX; |
|
251 c->ty = c->y; |
|
252 if(isvisible(c)) |
|
253 XMoveResizeWindow(dpy, c->twin, c->tx, c->ty, c->tw, c->th); |
|
254 else |
|
255 XMoveResizeWindow(dpy, c->twin, c->tx + 2 * sw, c->ty, c->tw, c->th); |
|
256 } |
215 } |
257 |
216 |
258 void |
217 void |
259 updatesizehints(Client *c) { |
218 updatesizehints(Client *c) { |
260 long msize; |
219 long msize; |
329 if(sel == c) { |
288 if(sel == c) { |
330 for(nc = stack; nc && !isvisible(nc); nc = nc->snext); |
289 for(nc = stack; nc && !isvisible(nc); nc = nc->snext); |
331 focus(nc); |
290 focus(nc); |
332 } |
291 } |
333 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
292 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
334 XDestroyWindow(dpy, c->twin); |
|
335 free(c->tags); |
293 free(c->tags); |
336 free(c); |
294 free(c); |
337 XSync(dpy, False); |
295 XSync(dpy, False); |
338 XSetErrorHandler(xerror); |
296 XSetErrorHandler(xerror); |
339 XUngrabServer(dpy); |
297 XUngrabServer(dpy); |