使用XCB的怪异递归行为

时间:2018-11-08 06:43:40

标签: c recursion xorg window-managers xcb

我正在探索使用XCB创建窗口管理器,但是我很早就遇到了一些麻烦。我的代码甚至无法使用xcb_connect连接到XCB。我以为这很简单,但是我得到了一些非常奇怪的行为。我的代码如下:

#include <stdio.h>
#include <xcb/xcb.h>

int i = 0;

int connect(xcb_connection_t** conn) {
    xcb_connection_t* try_conn = xcb_connect(NULL, NULL);
    int status = 0;
    int conn_status = xcb_connection_has_error(try_conn);
    if (conn_status != 0) {
        i = i + 1;
        switch (conn_status) {
            case XCB_CONN_ERROR:
                printf("Error connecting to the X Server, try %d\n", i);
                break;
            case XCB_CONN_CLOSED_EXT_NOTSUPPORTED:
                printf("Connection closed, extension not supported\n");
                break;
            case XCB_CONN_CLOSED_MEM_INSUFFICIENT:
                printf("Connection closed, memory insufficient\n");
                break;
            case XCB_CONN_CLOSED_REQ_LEN_EXCEED:
                printf("Connection closed, required length exceeded\n");
                break;
            case XCB_CONN_CLOSED_PARSE_ERR:
                printf("Connection closed, parse error\n");
                break;
            case XCB_CONN_CLOSED_INVALID_SCREEN:
                printf("Connection closed, invalid screen\n");
                break;
            default:
                printf("Connection failed with unknown cause\n");
                break;
        }

        status = 1;
    } else {
        *conn = try_conn;
        status = 0;
    }

    return status;
}

int main() {
    xcb_connection_t* conn = NULL;
    if (connect(&conn) != 0) {
        printf("Error connecting to the X Server\n");
        return -1;
    }

    return 0;
}

每次我运行该程序时,它都会打印出表示Error connecting the the X Server, try %d\n 8191次的行。当我查看gdb发生了什么情况时,似乎每次调用xcb_connect时,我的代码都会进入xcb_connect_to_display_with_auth_info()和{{1 }}功能。

令我真正困惑的部分是connect()甚至根本不能调用我的xcb_connect_to_display_with_auth_info()函数,因为它来自单独的库,并且我没有传递指向函数的指针。我的代码对我来说似乎是完全“线性”的行为,但事实并非如此。

我正在通过运行Xephyr和X服务器名称connect()并将X {yr}设置为:1来测试窗口管理器。

我对XCB和C本身还是陌生的,所以我可能遗漏了一些明显的东西,但是我会感激任何指针。到目前为止,我一直在寻找DISPLAY的灵感。

1 个答案:

答案 0 :(得分:1)

您正在重写C库的connect函数。 XCB调用该函数以连接到X11服务器,但最终却调用了函数。 https://linux.die.net/man/2/connect

解决这个问题的一种可能方法(除了为您的函数起另一个名字)是将其命名为static