+/* There's no way to check accesses to destroyed windows, thus those cases are
+ * ignored (especially on UnmapNotify's). Other types of errors call Xlibs
+ * default error handler, which may call exit.
+ */
+int
+xerror(Display *dpy, XErrorEvent *ee) {
+ if(ee->error_code == BadWindow
+ || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch)
+ || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable)
+ || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable)
+ || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable)
+ || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch)
+ || (ee->request_code == X_GrabKey && ee->error_code == BadAccess)
+ || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable))
+ return 0;
+ fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n",
+ ee->request_code, ee->error_code);
+ return xerrorxlib(dpy, ee); /* may call exit */
+}
+
+int
+main(int argc, char *argv[]) {
+ char *p;
+ int r, xfd;
+ fd_set rd;
+ XEvent ev;
+
+ if(argc == 2 && !strncmp("-v", argv[1], 3))
+ eprint("dwm-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n");
+ else if(argc != 1)
+ eprint("usage: dwm [-v]\n");
+ setlocale(LC_CTYPE, "");
+ if(!(dpy = XOpenDisplay(0)))
+ eprint("dwm: cannot open display\n");
+ xfd = ConnectionNumber(dpy);
+ screen = DefaultScreen(dpy);
+ root = RootWindow(dpy, screen);
+ otherwm = False;
+ XSetErrorHandler(xerrorstart);
+ /* this causes an error if some other window manager is running */
+ XSelectInput(dpy, root, SubstructureRedirectMask);
+ XSync(dpy, False);
+ if(otherwm)
+ eprint("dwm: another window manager is already running\n");
+
+ XSync(dpy, False);
+ XSetErrorHandler(NULL);
+ xerrorxlib = XSetErrorHandler(xerror);
+ XSync(dpy, False);
+ setup();
+ drawstatus();
+ scan();
+
+ /* main event loop, also reads status text from stdin */
+ XSync(dpy, False);
+ readin = True;