Mercurial > aewl
comparison main.c @ 75:f08271b7cb20
rearranged several stuff
author | Anselm R. Garbe <garbeam@wmii.de> |
---|---|
date | Sat, 15 Jul 2006 16:30:50 +0200 |
parents | 5370ef170cc9 |
children | 4bd49f404f10 |
comparison
equal
deleted
inserted
replaced
74:5370ef170cc9 | 75:f08271b7cb20 |
---|---|
41 | 41 |
42 DC dc = {0}; | 42 DC dc = {0}; |
43 Client *clients = NULL; | 43 Client *clients = NULL; |
44 Client *sel = NULL; | 44 Client *sel = NULL; |
45 | 45 |
46 static Bool other_wm_running; | 46 static Bool otherwm; |
47 static const char version[] = | 47 static const char version[] = |
48 "dwm-" VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; | 48 "dwm-" VERSION ", (C)opyright MMVI Anselm R. Garbe\n"; |
49 static int (*x_xerror) (Display *, XErrorEvent *); | 49 static int (*xerrorxlib)(Display *, XErrorEvent *); |
50 | 50 |
51 static void | 51 static void |
52 usage() { error("usage: dwm [-v]\n"); } | 52 usage() { eprint("usage: dwm [-v]\n"); } |
53 | 53 |
54 static void | 54 static void |
55 scan_wins() | 55 scan() |
56 { | 56 { |
57 unsigned int i, num; | 57 unsigned int i, num; |
58 Window *wins; | 58 Window *wins; |
59 XWindowAttributes wa; | 59 XWindowAttributes wa; |
60 Window d1, d2; | 60 Window d1, d2; |
71 } | 71 } |
72 if(wins) | 72 if(wins) |
73 XFree(wins); | 73 XFree(wins); |
74 } | 74 } |
75 | 75 |
76 static void | |
77 cleanup() | |
78 { | |
79 while(sel) { | |
80 resize(sel, True); | |
81 unmanage(sel); | |
82 } | |
83 XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); | |
84 } | |
85 | |
86 void | |
87 quit(Arg *arg) | |
88 { | |
89 running = False; | |
90 } | |
91 | |
76 static int | 92 static int |
77 win_property(Window w, Atom a, Atom t, long l, unsigned char **prop) | 93 win_property(Window w, Atom a, Atom t, long l, unsigned char **prop) |
78 { | 94 { |
79 Atom real; | 95 Atom real; |
80 int format; | 96 int format; |
92 } | 108 } |
93 return res; | 109 return res; |
94 } | 110 } |
95 | 111 |
96 int | 112 int |
97 proto(Window w) | 113 getproto(Window w) |
98 { | 114 { |
99 unsigned char *protocols; | 115 unsigned char *protocols; |
100 long res; | 116 long res; |
101 int protos = 0; | 117 int protos = 0; |
102 int i; | 118 int i; |
127 XSendEvent(dpy, w, False, NoEventMask, &e); | 143 XSendEvent(dpy, w, False, NoEventMask, &e); |
128 XFlush(dpy); | 144 XFlush(dpy); |
129 } | 145 } |
130 | 146 |
131 /* | 147 /* |
148 * Startup Error handler to check if another window manager | |
149 * is already running. | |
150 */ | |
151 static int | |
152 xerrorstart(Display *dsply, XErrorEvent *ee) | |
153 { | |
154 otherwm = True; | |
155 return -1; | |
156 } | |
157 | |
158 /* | |
132 * There's no way to check accesses to destroyed windows, thus | 159 * There's no way to check accesses to destroyed windows, thus |
133 * those cases are ignored (especially on UnmapNotify's). | 160 * those cases are ignored (especially on UnmapNotify's). |
134 * Other types of errors call Xlib's default error handler, which | 161 * Other types of errors call Xlib's default error handler, which |
135 * calls exit(). | 162 * calls exit(). |
136 */ | 163 */ |
137 int | 164 int |
138 xerror(Display *dpy, XErrorEvent *error) | 165 xerror(Display *dpy, XErrorEvent *ee) |
139 { | 166 { |
140 if(error->error_code == BadWindow | 167 if(ee->error_code == BadWindow |
141 || (error->request_code == X_SetInputFocus | 168 || (ee->request_code == X_SetInputFocus |
142 && error->error_code == BadMatch) | 169 && ee->error_code == BadMatch) |
143 || (error->request_code == X_PolyText8 | 170 || (ee->request_code == X_PolyText8 |
144 && error->error_code == BadDrawable) | 171 && ee->error_code == BadDrawable) |
145 || (error->request_code == X_PolyFillRectangle | 172 || (ee->request_code == X_PolyFillRectangle |
146 && error->error_code == BadDrawable) | 173 && ee->error_code == BadDrawable) |
147 || (error->request_code == X_PolySegment | 174 || (ee->request_code == X_PolySegment |
148 && error->error_code == BadDrawable) | 175 && ee->error_code == BadDrawable) |
149 || (error->request_code == X_ConfigureWindow | 176 || (ee->request_code == X_ConfigureWindow |
150 && error->error_code == BadMatch) | 177 && ee->error_code == BadMatch) |
151 || (error->request_code == X_GrabKey | 178 || (ee->request_code == X_GrabKey |
152 && error->error_code == BadAccess)) | 179 && ee->error_code == BadAccess)) |
153 return 0; | 180 return 0; |
154 fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", | 181 fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", |
155 error->request_code, error->error_code); | 182 ee->request_code, ee->error_code); |
156 return x_xerror(dpy, error); /* may call exit() */ | 183 return xerrorxlib(dpy, ee); /* may call exit() */ |
157 } | |
158 | |
159 /* | |
160 * Startup Error handler to check if another window manager | |
161 * is already running. | |
162 */ | |
163 static int | |
164 startup_xerror(Display *dpy, XErrorEvent *error) | |
165 { | |
166 other_wm_running = True; | |
167 return -1; | |
168 } | |
169 | |
170 static void | |
171 cleanup() | |
172 { | |
173 while(sel) { | |
174 resize(sel, True); | |
175 unmanage(sel); | |
176 } | |
177 XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); | |
178 } | |
179 | |
180 void | |
181 quit(Arg *arg) | |
182 { | |
183 running = False; | |
184 } | 184 } |
185 | 185 |
186 int | 186 int |
187 main(int argc, char *argv[]) | 187 main(int argc, char *argv[]) |
188 { | 188 { |
206 } | 206 } |
207 } | 207 } |
208 | 208 |
209 dpy = XOpenDisplay(0); | 209 dpy = XOpenDisplay(0); |
210 if(!dpy) | 210 if(!dpy) |
211 error("dwm: cannot connect X server\n"); | 211 eprint("dwm: cannot connect X server\n"); |
212 | 212 |
213 screen = DefaultScreen(dpy); | 213 screen = DefaultScreen(dpy); |
214 root = RootWindow(dpy, screen); | 214 root = RootWindow(dpy, screen); |
215 | 215 |
216 /* check if another WM is already running */ | 216 /* check if another WM is already running */ |
217 other_wm_running = False; | 217 otherwm = False; |
218 XSetErrorHandler(startup_xerror); | 218 XSetErrorHandler(xerrorstart); |
219 /* this causes an error if some other WM is running */ | 219 /* this causes an error if some other WM is running */ |
220 XSelectInput(dpy, root, SubstructureRedirectMask); | 220 XSelectInput(dpy, root, SubstructureRedirectMask); |
221 XFlush(dpy); | 221 XFlush(dpy); |
222 | 222 |
223 if(other_wm_running) | 223 if(otherwm) |
224 error("dwm: another window manager is already running\n"); | 224 eprint("dwm: another window manager is already running\n"); |
225 | 225 |
226 XSetErrorHandler(0); | 226 XSetErrorHandler(0); |
227 x_xerror = XSetErrorHandler(xerror); | 227 xerrorxlib = XSetErrorHandler(xerror); |
228 | 228 |
229 /* init atoms */ | 229 /* init atoms */ |
230 wm_atom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); | 230 wm_atom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); |
231 wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); | 231 wm_atom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); |
232 net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); | 232 net_atom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); |
276 wa.cursor = cursor[CurNormal]; | 276 wa.cursor = cursor[CurNormal]; |
277 | 277 |
278 XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); | 278 XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); |
279 | 279 |
280 strcpy(stext, "dwm-"VERSION); | 280 strcpy(stext, "dwm-"VERSION); |
281 scan_wins(); | 281 scan(); |
282 | 282 |
283 /* main event loop, reads status text from stdin as well */ | 283 /* main event loop, reads status text from stdin as well */ |
284 Mainloop: | 284 Mainloop: |
285 while(running) { | 285 while(running) { |
286 FD_ZERO(&rd); | 286 FD_ZERO(&rd); |
290 | 290 |
291 i = select(ConnectionNumber(dpy) + 1, &rd, 0, 0, 0); | 291 i = select(ConnectionNumber(dpy) + 1, &rd, 0, 0, 0); |
292 if(i == -1 && errno == EINTR) | 292 if(i == -1 && errno == EINTR) |
293 continue; | 293 continue; |
294 if(i < 0) | 294 if(i < 0) |
295 error("select failed\n"); | 295 eprint("select failed\n"); |
296 else if(i > 0) { | 296 else if(i > 0) { |
297 if(FD_ISSET(ConnectionNumber(dpy), &rd)) { | 297 if(FD_ISSET(ConnectionNumber(dpy), &rd)) { |
298 while(XPending(dpy)) { | 298 while(XPending(dpy)) { |
299 XNextEvent(dpy, &ev); | 299 XNextEvent(dpy, &ev); |
300 if(handler[ev.type]) | 300 if(handler[ev.type]) |