Я изучаю создание оконного менеджера с использованием XCB, но довольно рано столкнулся с некоторыми проблемами. Мой код даже не подключается к XCB с xcb_connect
. Я думал, что это было довольно просто, но у меня действительно странное поведение. Мой код выглядит так:
#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()
и моей connect()
функцией.
Что меня действительно смущает, так это то, как xcb_connect_to_display_with_auth_info()
может вообще вызывать мою connect()
функцию, потому что она из отдельной библиотеки, и я не передал указатель на свою функцию. Мой код выглядит так, как будто его поведение должно быть полностью «линейным», но это совсем не так.
Я тестирую оконный менеджер, запустив Xephyr с именем X-сервера :1
и установив DISPLAY
в :1
перед запуском программы.
Я немного новичок в XCB и C, так что, возможно, я упускаю что-то явно очевидное, но я был бы признателен за любые указания. До сих пор я искал вдохновение в hootwm
.