XLib断开回调

时间:2018-11-20 16:02:07

标签: xlib xrandr

我使用XLib和XRand来获取有关嵌入式系统上连接的显示器的一些信息。

class Foo {
private:
    Display *_display{};

public:
    Foo() {
        _display = XOpenDisplay(":0.0");
    }

    void getSomeInfo() const {
        /* Get some info with _display */
    }

    ~Foo() {
        XCloseDisplay(_display);
    }
}

问题是,在创建Foo实例之后和调用getSomeInfo()之前,可以关闭X服务器(出于低功耗或其他目的),这会导致我的应用程序立即死亡,因为XLib试图退出应用程序如果有错误。

是否有任何机制,例如回调,可以使我理解X Server发生故障,因此我不再使用_display指针了吗?

1 个答案:

答案 0 :(得分:1)

我担心您唯一的选择是使用XSetIOErrorHandler然后做些难看的事情。

来自https://tronche.com/gui/x/xlib/event-handling/protocol-errors/XSetIOErrorHandler.html

  

XSetIOErrorHandler()设置致命的I / O错误处理程序。如果发生任何类型的系统调用错误(例如,与服务器的连接丢失),则Xlib会调用程序提供的错误处理程序。假定这是致命的情况,并且被调用的例程不应返回。如果I / O错误处理程序确实返回,则客户端进程退出。

我建议“做些丑陋的事情”是使用setjmplongjmp:无论何时调用任何Xlib函数,都需要setjmp。然后,您的I / O错误处理功能longjmp可以在不退出进程的情况下摆脱I / O错误。