这个 dwm 源代码片段如何不抛出错误?

问题描述 投票:0回答:1

遵循来自

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)

c xlib window-managers x-dwm
1个回答
0
投票

XSetErrorHandler 将返回之前返回的错误处理程序。先前的错误处理程序不等于用户定义的处理程序。所以 xerrorxlib 等于之前的 Xlib 错误处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.