comportamento recursiva estranho usando XCB

votos
2

Estou explorando a criação de um gerenciador de janelas usando XCB, mas eu correr em alguns problemas bem cedo. Meu código não vai mesmo ligar a XCB com xcb_connect. Eu pensei que era bastante simples, mas eu estou recebendo algum comportamento muito estranho. Meu código parecido com este:

#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;
}

Ela imprime a linha que diz Error connecting the the X Server, try %d\n8191 vezes cada vez que eu executar o programa. Quando eu olhei para o que estava acontecendo com gdb, parece que cada vez que eu chamo xcb_connect, meu código vai para essa coisa recursão profunda (como milhares de quadros profundos) entre xcb_connect_to_display_with_auth_info()e minha connect()função.

A parte que realmente me confunde é como xcb_connect_to_display_with_auth_info()pode até chamar a minha connect()função em tudo, porque é a partir de uma biblioteca separada e eu não ter passado em um ponteiro para a minha função. Meu código parece-me que é um comportamento deve ser completamente linear, mas isso não é o caso em tudo.

Estou testando o gerenciador de janelas executando Xephyr com o nome do servidor X :1e definindo DISPLAYa :1antes de executar o programa.

Eu sou um pouco novo para XCB e em si C, então eu provavelmente estou faltando alguma coisa por demais evidente, mas eu apreciaria qualquer ponteiros. Eu estive olhando hootwmpara a inspiração em sua maioria até agora.

Publicado 08/11/2018 em 06:43
fonte usuário
Em outras línguas...                            


1 respostas

votos
1

Você está substituindo a biblioteca C connectfunção. XCB chama essa função para se conectar ao servidor X11, mas acaba com a chamada sua função em vez. https://linux.die.net/man/2/connect

Uma maneira possível fora deste (além de dar a sua função de outro nome) é fazê-lo static.

Respondeu 20/11/2018 em 10:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more