遵循来自
main()
的dwm源代码,在checkotherwm
内
xerrorxlib = XSetErrorHandler(xerrorstart);
,其中
xerrorxlib
定义为
static int (*xerrorxlib)(Display *, XErrorEvent *);
,将
xerrorxlib
(全局变量)设置为 NULL
,因为这是第一次调用 XSetErrorHandler
,因此没有先前的处理程序要返回。然后打了几个电话之后,就有了
XSetErrorHandler(xerror);
其中
xerror
定义为:
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_GrabButton && ee->error_code == BadAccess)
|| (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 */
}
注意
return xerrorxlib(dpy, ee);
。这怎么不报错呢?是不是 xerrorxlib
NULL
因此这个评估结果为 NULL(dpy, ee)
?
XSetErrorHandler 将返回之前返回的错误处理程序。先前的错误处理程序不等于用户定义的处理程序。所以 xerrorxlib 等于之前的 Xlib 错误处理程序。