Mercurial > dwm-meillo
annotate 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 |
rev | line source |
---|---|
5 | 1 /* |
2 * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | |
3 * See LICENSE file for license details. | |
4 */ | |
5 | |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
6 #include <stdlib.h> |
51 | 7 #include <stdio.h> |
5 | 8 #include <string.h> |
9 #include <X11/Xatom.h> | |
32 | 10 #include <X11/Xutil.h> |
5 | 11 |
43 | 12 #include "dwm.h" |
5 | 13 |
51 | 14 static Rule rule[] = { |
53 | 15 /* class instance tags floating */ |
16 { "Firefox-bin", "Gecko", { [Twww] = "www" }, False }, | |
51 | 17 }; |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
18 |
73 | 19 Client * |
49
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
20 next(Client *c) |
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
21 { |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
22 for(; c && !c->tags[tsel]; c = c->next); |
49
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
23 return c; |
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
24 } |
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
25 |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
26 void |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
27 ban_client(Client *c) |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
28 { |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
29 XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
30 XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty); |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
31 } |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
32 |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
33 static void |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
34 resize_title(Client *c) |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
35 { |
31 | 36 int i; |
37 | |
38 c->tw = 0; | |
39 for(i = 0; i < TLast; i++) | |
40 if(c->tags[i]) | |
73 | 41 c->tw += textw(c->tags[i]); |
42 c->tw += textw(c->name); | |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
43 if(c->tw > c->w) |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
44 c->tw = c->w + 2; |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
45 c->tx = c->x + c->w - c->tw + 2; |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
46 c->ty = c->y; |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
47 XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th); |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
48 } |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
49 |
13
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
50 void |
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
51 update_name(Client *c) |
5 | 52 { |
53 XTextProperty name; | |
54 int n; | |
7 | 55 char **list = NULL; |
5 | 56 |
57 name.nitems = 0; | |
58 c->name[0] = 0; | |
59 XGetTextProperty(dpy, c->win, &name, net_atom[NetWMName]); | |
60 if(!name.nitems) | |
61 XGetWMName(dpy, c->win, &name); | |
62 if(!name.nitems) | |
63 return; | |
64 if(name.encoding == XA_STRING) | |
65 strncpy(c->name, (char *)name.value, sizeof(c->name)); | |
66 else { | |
67 if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success | |
68 && n > 0 && *list) | |
69 { | |
70 strncpy(c->name, *list, sizeof(c->name)); | |
71 XFreeStringList(list); | |
72 } | |
73 } | |
74 XFree(name.value); | |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
75 resize_title(c); |
5 | 76 } |
77 | |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
78 void |
20 | 79 update_size(Client *c) |
80 { | |
81 XSizeHints size; | |
82 long msize; | |
83 if(!XGetWMNormalHints(dpy, c->win, &size, &msize) || !size.flags) | |
84 size.flags = PSize; | |
85 c->flags = size.flags; | |
21
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
86 if(c->flags & PBaseSize) { |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
87 c->basew = size.base_width; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
88 c->baseh = size.base_height; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
89 } |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
90 else |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
91 c->basew = c->baseh = 0; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
92 if(c->flags & PResizeInc) { |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
93 c->incw = size.width_inc; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
94 c->inch = size.height_inc; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
95 } |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
96 else |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
97 c->incw = c->inch = 0; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
98 if(c->flags & PMaxSize) { |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
99 c->maxw = size.max_width; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
100 c->maxh = size.max_height; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
101 } |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
102 else |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
103 c->maxw = c->maxh = 0; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
104 if(c->flags & PMinSize) { |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
105 c->minw = size.min_width; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
106 c->minh = size.min_height; |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
107 } |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
108 else |
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
109 c->minw = c->minh = 0; |
29 | 110 if(c->flags & PWinGravity) |
111 c->grav = size.win_gravity; | |
112 else | |
113 c->grav = NorthWestGravity; | |
20 | 114 } |
115 | |
116 void | |
32 | 117 craise(Client *c) |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
118 { |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
119 XRaiseWindow(dpy, c->win); |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
120 XRaiseWindow(dpy, c->title); |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
121 } |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
122 |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
123 void |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
124 lower(Client *c) |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
125 { |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
126 XLowerWindow(dpy, c->title); |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
127 XLowerWindow(dpy, c->win); |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
128 } |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
129 |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
130 void |
13
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
131 focus(Client *c) |
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
132 { |
52
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
133 Client *old = sel; |
63
f14858218641
searching for a better way to discard enter notifies
Anselm R. Garbe <garbeam@wmii.de>
parents:
62
diff
changeset
|
134 XEvent ev; |
52
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
135 |
63
f14858218641
searching for a better way to discard enter notifies
Anselm R. Garbe <garbeam@wmii.de>
parents:
62
diff
changeset
|
136 XFlush(dpy); |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
137 sel = c; |
52
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
138 if(old && old != c) |
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
139 draw_client(old); |
27
f96fb3fd8203
added grid mode on Mod1Mask g
Anselm R. Garbe <garbeam@wmii.de>
parents:
26
diff
changeset
|
140 draw_client(c); |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
141 XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); |
13
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
142 XFlush(dpy); |
63
f14858218641
searching for a better way to discard enter notifies
Anselm R. Garbe <garbeam@wmii.de>
parents:
62
diff
changeset
|
143 while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); |
13
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
144 } |
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
145 |
51 | 146 static void |
147 init_tags(Client *c) | |
148 { | |
149 XClassHint ch; | |
150 static unsigned int len = rule ? sizeof(rule) / sizeof(rule[0]) : 0; | |
151 unsigned int i, j; | |
152 Bool matched = False; | |
153 | |
154 if(!len) { | |
155 c->tags[tsel] = tags[tsel]; | |
156 return; | |
157 } | |
158 | |
159 if(XGetClassHint(dpy, c->win, &ch)) { | |
160 if(ch.res_class && ch.res_name) { | |
161 for(i = 0; i < len; i++) | |
162 if(!strncmp(rule[i].class, ch.res_class, sizeof(rule[i].class)) | |
163 && !strncmp(rule[i].instance, ch.res_name, sizeof(rule[i].instance))) | |
164 { | |
165 for(j = 0; j < TLast; j++) | |
166 c->tags[j] = rule[i].tags[j]; | |
53 | 167 c->floating = rule[i].floating; |
51 | 168 matched = True; |
169 break; | |
170 } | |
171 } | |
172 if(ch.res_class) | |
173 XFree(ch.res_class); | |
174 if(ch.res_name) | |
175 XFree(ch.res_name); | |
176 } | |
177 | |
178 if(!matched) | |
179 c->tags[tsel] = tags[tsel]; | |
180 } | |
181 | |
13
5cc5e55a132d
added protocol killing stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
10
diff
changeset
|
182 void |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
183 manage(Window w, XWindowAttributes *wa) |
5 | 184 { |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
185 Client *c, **l; |
5 | 186 XSetWindowAttributes twa; |
53 | 187 Window trans; |
5 | 188 |
189 c = emallocz(sizeof(Client)); | |
190 c->win = w; | |
22
bd3a44353916
fixed several other stuff, coming closer to something useful
Anselm R. Garbe <garbeam@wmii.de>
parents:
21
diff
changeset
|
191 c->tx = c->x = wa->x; |
bd3a44353916
fixed several other stuff, coming closer to something useful
Anselm R. Garbe <garbeam@wmii.de>
parents:
21
diff
changeset
|
192 c->ty = c->y = wa->y; |
57
f005d46462e8
implemented bar for dwm (I miss status text), I plan that status text is read from stdin in dwm
Anselm R. Garbe <garbeam@wmii.de>
parents:
55
diff
changeset
|
193 if(c->y < bh) |
f005d46462e8
implemented bar for dwm (I miss status text), I plan that status text is read from stdin in dwm
Anselm R. Garbe <garbeam@wmii.de>
parents:
55
diff
changeset
|
194 c->ty = c->y += bh; |
22
bd3a44353916
fixed several other stuff, coming closer to something useful
Anselm R. Garbe <garbeam@wmii.de>
parents:
21
diff
changeset
|
195 c->tw = c->w = wa->width; |
20 | 196 c->h = wa->height; |
57
f005d46462e8
implemented bar for dwm (I miss status text), I plan that status text is read from stdin in dwm
Anselm R. Garbe <garbeam@wmii.de>
parents:
55
diff
changeset
|
197 c->th = bh; |
29 | 198 c->border = 1; |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
199 c->proto = win_proto(c->win); |
20 | 200 update_size(c); |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
201 XSelectInput(dpy, c->win, |
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
202 StructureNotifyMask | PropertyChangeMask | EnterWindowMask); |
53 | 203 XGetTransientForHint(dpy, c->win, &trans); |
5 | 204 twa.override_redirect = 1; |
205 twa.background_pixmap = ParentRelative; | |
23 | 206 twa.event_mask = ExposureMask; |
5 | 207 |
22
bd3a44353916
fixed several other stuff, coming closer to something useful
Anselm R. Garbe <garbeam@wmii.de>
parents:
21
diff
changeset
|
208 c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th, |
20 | 209 0, DefaultDepth(dpy, screen), CopyFromParent, |
5 | 210 DefaultVisual(dpy, screen), |
211 CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa); | |
31 | 212 |
21
3ef108a5ca0a
implemented draw_client stuff
Anselm R. Garbe <garbeam@wmii.de>
parents:
20
diff
changeset
|
213 update_name(c); |
51 | 214 init_tags(c); |
49
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
215 |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
216 for(l = &clients; *l; l = &(*l)->next); |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
217 c->next = *l; /* *l == nil */ |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
218 *l = c; |
49
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
219 |
19
b5510d0c6d43
added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents:
18
diff
changeset
|
220 XGrabButton(dpy, Button1, Mod1Mask, c->win, False, ButtonPressMask, |
b5510d0c6d43
added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents:
18
diff
changeset
|
221 GrabModeAsync, GrabModeSync, None, None); |
b5510d0c6d43
added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents:
18
diff
changeset
|
222 XGrabButton(dpy, Button2, Mod1Mask, c->win, False, ButtonPressMask, |
b5510d0c6d43
added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents:
18
diff
changeset
|
223 GrabModeAsync, GrabModeSync, None, None); |
b5510d0c6d43
added basic mouse support (actually we don't need more)
Anselm R. Garbe <garbeam@wmii.de>
parents:
18
diff
changeset
|
224 XGrabButton(dpy, Button3, Mod1Mask, c->win, False, ButtonPressMask, |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
225 GrabModeAsync, GrabModeSync, None, None); |
53 | 226 |
227 if(!c->floating) | |
228 c->floating = trans | |
229 || ((c->maxw == c->minw) && (c->maxh == c->minh)); | |
230 | |
46
58307ad56ec1
added xlock command (I need it regularly)
Anselm R. Garbe <garbeam@wmii.de>
parents:
45
diff
changeset
|
231 arrange(NULL); |
60
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
232 /* mapping the window now prevents flicker */ |
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
233 if(c->tags[tsel]) { |
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
234 XMapRaised(dpy, c->win); |
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
235 XMapRaised(dpy, c->title); |
51 | 236 focus(c); |
60
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
237 } |
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
238 else { |
51 | 239 ban_client(c); |
60
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
240 XMapRaised(dpy, c->win); |
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
241 XMapRaised(dpy, c->title); |
24f9c674d03f
made stdin reader more robust
Anselm R. Garbe <garbeam@wmii.de>
parents:
57
diff
changeset
|
242 } |
5 | 243 } |
9
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
244 |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
245 void |
29 | 246 gravitate(Client *c, Bool invert) |
247 { | |
248 int dx = 0, dy = 0; | |
249 | |
250 switch(c->grav) { | |
251 case StaticGravity: | |
252 case NorthWestGravity: | |
253 case NorthGravity: | |
254 case NorthEastGravity: | |
255 dy = c->border; | |
256 break; | |
257 case EastGravity: | |
258 case CenterGravity: | |
259 case WestGravity: | |
260 dy = -(c->h / 2) + c->border; | |
261 break; | |
262 case SouthEastGravity: | |
263 case SouthGravity: | |
264 case SouthWestGravity: | |
265 dy = -c->h; | |
266 break; | |
267 default: | |
268 break; | |
269 } | |
270 | |
271 switch (c->grav) { | |
272 case StaticGravity: | |
273 case NorthWestGravity: | |
274 case WestGravity: | |
275 case SouthWestGravity: | |
276 dx = c->border; | |
277 break; | |
278 case NorthGravity: | |
279 case CenterGravity: | |
280 case SouthGravity: | |
281 dx = -(c->w / 2) + c->border; | |
282 break; | |
283 case NorthEastGravity: | |
284 case EastGravity: | |
285 case SouthEastGravity: | |
286 dx = -(c->w + c->border); | |
287 break; | |
288 default: | |
289 break; | |
290 } | |
291 | |
292 if(invert) { | |
293 dx = -dx; | |
294 dy = -dy; | |
295 } | |
296 c->x += dx; | |
297 c->y += dy; | |
298 } | |
299 | |
31 | 300 |
29 | 301 void |
52
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
302 resize(Client *c, Bool inc) |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
303 { |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
304 XConfigureEvent e; |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
305 |
52
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
306 if(inc) { |
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
307 if(c->incw) |
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
308 c->w -= (c->w - c->basew) % c->incw; |
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
309 if(c->inch) |
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
310 c->h -= (c->h - c->baseh) % c->inch; |
d18f6dd0cf23
fixed several things, nearly feature complete
Anselm R. Garbe <garbeam@wmii.de>
parents:
51
diff
changeset
|
311 } |
67
a0272d97ec7c
fixed crash on zoom if only 1 client exists
Anselm R. Garbe <garbeam@wmii.de>
parents:
66
diff
changeset
|
312 if(c->x > sw) /* might happen on restart */ |
a0272d97ec7c
fixed crash on zoom if only 1 client exists
Anselm R. Garbe <garbeam@wmii.de>
parents:
66
diff
changeset
|
313 c->x = sw - c->w; |
a0272d97ec7c
fixed crash on zoom if only 1 client exists
Anselm R. Garbe <garbeam@wmii.de>
parents:
66
diff
changeset
|
314 if(c->y > sh) |
a0272d97ec7c
fixed crash on zoom if only 1 client exists
Anselm R. Garbe <garbeam@wmii.de>
parents:
66
diff
changeset
|
315 c->ty = c->y = sh - c->h; |
31 | 316 if(c->minw && c->w < c->minw) |
317 c->w = c->minw; | |
318 if(c->minh && c->h < c->minh) | |
319 c->h = c->minh; | |
320 if(c->maxw && c->w > c->maxw) | |
321 c->w = c->maxw; | |
322 if(c->maxh && c->h > c->maxh) | |
323 c->h = c->maxh; | |
26
e8f627998d6f
simplified several portions of code through replacing rect structs with x,y,h,w counterparts (much more readable)
Anselm R. Garbe <garbeam@wmii.de>
parents:
23
diff
changeset
|
324 resize_title(c); |
55 | 325 XSetWindowBorderWidth(dpy, c->win, 1); |
20 | 326 XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
327 e.type = ConfigureNotify; |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
328 e.event = c->win; |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
329 e.window = c->win; |
20 | 330 e.x = c->x; |
331 e.y = c->y; | |
332 e.width = c->w; | |
333 e.height = c->h; | |
29 | 334 e.border_width = c->border; |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
335 e.above = None; |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
336 e.override_redirect = False; |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
337 XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e); |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
338 XFlush(dpy); |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
339 } |
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
340 |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
341 static int |
33
e90449e03167
new stuff (some warning elimination)
Anselm R. Garbe <garbeam@wmii.de>
parents:
32
diff
changeset
|
342 dummy_error_handler(Display *dsply, XErrorEvent *err) |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
343 { |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
344 return 0; |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
345 } |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
346 |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
347 void |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
348 unmanage(Client *c) |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
349 { |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
350 Client **l; |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
351 |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
352 XGrabServer(dpy); |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
353 XSetErrorHandler(dummy_error_handler); |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
354 |
18
1efa34c6e1b6
added mouse-based resizals
Anselm R. Garbe <garbeam@wmii.de>
parents:
16
diff
changeset
|
355 XUngrabButton(dpy, AnyButton, AnyModifier, c->win); |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
356 XDestroyWindow(dpy, c->title); |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
357 |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
358 for(l = &clients; *l && *l != c; l = &(*l)->next); |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
359 *l = c->next; |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
360 for(l = &clients; *l; l = &(*l)->next) |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
361 if((*l)->revert == c) |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
362 (*l)->revert = NULL; |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
363 if(sel == c) |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
364 sel = sel->revert ? sel->revert : clients; |
49
466591c2f967
implemented tagging a client
Anselm R. Garbe <garbeam@wmii.de>
parents:
46
diff
changeset
|
365 |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
366 free(c); |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
367 |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
368 XFlush(dpy); |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
369 XSetErrorHandler(error_handler); |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
370 XUngrabServer(dpy); |
46
58307ad56ec1
added xlock command (I need it regularly)
Anselm R. Garbe <garbeam@wmii.de>
parents:
45
diff
changeset
|
371 arrange(NULL); |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
372 if(sel) |
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
373 focus(sel); |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
374 } |
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
375 |
23 | 376 Client * |
377 gettitle(Window w) | |
378 { | |
379 Client *c; | |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
380 for(c = clients; c; c = c->next) |
23 | 381 if(c->title == w) |
382 return c; | |
383 return NULL; | |
384 } | |
10
703255003abb
changed how manage client works
Anselm R. Garbe <garbeam@wmii.de>
parents:
9
diff
changeset
|
385 |
9
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
386 Client * |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
387 getclient(Window w) |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
388 { |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
389 Client *c; |
50
148f25ed0ad7
several other additions/fixes, dwm is quite usable already
Anselm R. Garbe <garbeam@wmii.de>
parents:
49
diff
changeset
|
390 for(c = clients; c; c = c->next) |
9
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
391 if(c->win == w) |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
392 return c; |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
393 return NULL; |
d567f430a81d
fixed several stuff (gridwm gets better and better)
Anselm R. Garbe <garbeam@wmii.de>
parents:
7
diff
changeset
|
394 } |