Как получить название режима с помощью XCB? - PullRequest
1 голос
/ 05 апреля 2020

В Xlib структура XRRModeInfo содержит, кроме поля nameLength, само name. Но в XCB соответствующая структура xcb_randr_mode_info_t содержит только name_len, и, похоже, нет функции для получения действительной строки имени.

Я вижу все имена режимов в строке, возвращаемой xcb_randr_get_screen_resources_names(), но все они сцеплены, и я не знаю, как найти смещение определенного режима в этой строке.

Итак, как я могу получить имя режима с помощью XCB?

1 Ответ

1 голос
/ 05 апреля 2020

Я вижу все имена режимов в строке, возвращаемой xcb_randr_get_screen_resources_names (), но все они объединены, и я не знаю, как найти смещение определенного режима в этой строке.

У вас есть длина отдельных имен, и вы знаете длину каждого имени, поэтому вам просто нужно посчитать байты:

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

int main()
{
        xcb_connection_t *c = xcb_connect(NULL, NULL);
        xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(c)).data;
        // TODO: Error handling
        // TODO: Checking if the RandR extension is available
        xcb_randr_get_screen_resources_reply_t *reply =
                xcb_randr_get_screen_resources_reply(c,
                                xcb_randr_get_screen_resources(c, screen->root),
                                NULL);
        xcb_randr_mode_info_iterator_t iter = xcb_randr_get_screen_resources_modes_iterator(reply);
        uint8_t *names = xcb_randr_get_screen_resources_names(reply);
        while (iter.rem) {
                xcb_randr_mode_info_t *mode = iter.data;
                printf("Mode %d has size %dx%d and name %.*s\n",
                                mode->id, mode->width, mode->height, mode->name_len, names);
                names += mode->name_len;
                xcb_randr_mode_info_next(&iter);
        }
        free(reply);
        xcb_disconnect(c);
        return 0;
}
...