equal
deleted
inserted
replaced
15 /* class instance tags floating */ |
15 /* class instance tags floating */ |
16 { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, |
16 { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, |
17 }; |
17 }; |
18 |
18 |
19 Client * |
19 Client * |
20 next(Client *c) |
20 getnext(Client *c) |
21 { |
21 { |
22 for(; c && !c->tags[tsel]; c = c->next); |
22 for(; c && !c->tags[tsel]; c = c->next); |
23 return c; |
23 return c; |
24 } |
24 } |
25 |
25 |
26 void |
26 void |
27 ban_client(Client *c) |
27 ban(Client *c) |
28 { |
28 { |
29 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
29 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
30 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); |
30 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); |
31 } |
31 } |
32 |
32 |
46 c->ty = c->y; |
46 c->ty = c->y; |
47 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); |
48 } |
48 } |
49 |
49 |
50 void |
50 void |
51 update_name(Client *c) |
51 settitle(Client *c) |
52 { |
52 { |
53 XTextProperty name; |
53 XTextProperty name; |
54 int n; |
54 int n; |
55 char **list = NULL; |
55 char **list = NULL; |
56 |
56 |
74 XFree(name.value); |
74 XFree(name.value); |
75 resize_title(c); |
75 resize_title(c); |
76 } |
76 } |
77 |
77 |
78 void |
78 void |
79 update_size(Client *c) |
79 setsize(Client *c) |
80 { |
80 { |
81 XSizeHints size; |
81 XSizeHints size; |
82 long msize; |
82 long msize; |
83 if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) |
83 if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) |
84 size.flags = PSize; |
84 size.flags = PSize; |
112 else |
112 else |
113 c->grav = NorthWestGravity; |
113 c->grav = NorthWestGravity; |
114 } |
114 } |
115 |
115 |
116 void |
116 void |
117 craise(Client *c) |
117 higher(Client *c) |
118 { |
118 { |
119 XRaiseWindow(dpy, c->win); |
119 XRaiseWindow(dpy, c->win); |
120 XRaiseWindow(dpy, c->title); |
120 XRaiseWindow(dpy, c->title); |
121 } |
121 } |
122 |
122 |
134 XEvent ev; |
134 XEvent ev; |
135 |
135 |
136 XFlush(dpy); |
136 XFlush(dpy); |
137 sel = c; |
137 sel = c; |
138 if(old && old != c) |
138 if(old && old != c) |
139 draw_client(old); |
139 drawtitle(old); |
140 draw_client(c); |
140 drawtitle(c); |
141 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
141 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
142 XFlush(dpy); |
142 XFlush(dpy); |
143 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
143 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
144 } |
144 } |
145 |
145 |
194 c->ty = c->y += bh; |
194 c->ty = c->y += bh; |
195 c->tw = c->w = wa->width; |
195 c->tw = c->w = wa->width; |
196 c->h = wa->height; |
196 c->h = wa->height; |
197 c->th = bh; |
197 c->th = bh; |
198 c->border = 1; |
198 c->border = 1; |
199 c->proto = win_proto(c->win); |
199 c->proto = proto(c->win); |
200 update_size(c); |
200 setsize(c); |
201 XSelectInput(dpy, c->win, |
201 XSelectInput(dpy, c->win, |
202 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
202 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
203 XGetTransientForHint(dpy, c->win, &trans); |
203 XGetTransientForHint(dpy, c->win, &trans); |
204 twa.override_redirect = 1; |
204 twa.override_redirect = 1; |
205 twa.background_pixmap = ParentRelative; |
205 twa.background_pixmap = ParentRelative; |
208 c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, |
208 c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, |
209 0, DefaultDepth(dpy, screen), CopyFromParent, |
209 0, DefaultDepth(dpy, screen), CopyFromParent, |
210 DefaultVisual(dpy, screen), |
210 DefaultVisual(dpy, screen), |
211 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); |
211 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); |
212 |
212 |
213 update_name(c); |
213 settitle(c); |
214 init_tags(c); |
214 init_tags(c); |
215 |
215 |
216 for(l = &clients; *l; l = &(*l)->next); |
216 for(l = &clients; *l; l = &(*l)->next); |
217 c->next = *l; /* *l == nil */ |
217 c->next = *l; /* *l == nil */ |
218 *l = c; |
218 *l = c; |
234 XMapRaised(dpy, c->win); |
234 XMapRaised(dpy, c->win); |
235 XMapRaised(dpy, c->title); |
235 XMapRaised(dpy, c->title); |
236 focus(c); |
236 focus(c); |
237 } |
237 } |
238 else { |
238 else { |
239 ban_client(c); |
239 ban(c); |
240 XMapRaised(dpy, c->win); |
240 XMapRaised(dpy, c->win); |
241 XMapRaised(dpy, c->title); |
241 XMapRaised(dpy, c->title); |
242 } |
242 } |
243 } |
243 } |
244 |
244 |
337 XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); |
337 XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); |
338 XFlush(dpy); |
338 XFlush(dpy); |
339 } |
339 } |
340 |
340 |
341 static int |
341 static int |
342 dummy_error_handler(Display *dsply, XErrorEvent *err) |
342 dummy_xerror(Display *dsply, XErrorEvent *err) |
343 { |
343 { |
344 return 0; |
344 return 0; |
345 } |
345 } |
346 |
346 |
347 void |
347 void |
348 unmanage(Client *c) |
348 unmanage(Client *c) |
349 { |
349 { |
350 Client **l; |
350 Client **l; |
351 |
351 |
352 XGrabServer(dpy); |
352 XGrabServer(dpy); |
353 XSetErrorHandler(dummy_error_handler); |
353 XSetErrorHandler(dummy_xerror); |
354 |
354 |
355 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
355 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
356 XDestroyWindow(dpy, c->title); |
356 XDestroyWindow(dpy, c->title); |
357 |
357 |
358 for(l = &clients; *l && *l != c; l = &(*l)->next); |
358 for(l = &clients; *l && *l != c; l = &(*l)->next); |
364 sel = sel->revert ? sel->revert : clients; |
364 sel = sel->revert ? sel->revert : clients; |
365 |
365 |
366 free(c); |
366 free(c); |
367 |
367 |
368 XFlush(dpy); |
368 XFlush(dpy); |
369 XSetErrorHandler(error_handler); |
369 XSetErrorHandler(xerror); |
370 XUngrabServer(dpy); |
370 XUngrabServer(dpy); |
371 arrange(NULL); |
371 arrange(NULL); |
372 if(sel) |
372 if(sel) |
373 focus(sel); |
373 focus(sel); |
374 } |
374 } |