x11xcbxrandr

How to get mode name using XCB?


In Xlib the structure XRRModeInfo contains, aside from nameLength field, the name itself. But in XCB the corresponding structure xcb_randr_mode_info_t only contains name_len, and there seems to be no function to get actual name string.

I do see all the mode names in the string returned by xcb_randr_get_screen_resources_names(), but they are all concatenated, and I don't know how to find the offset of a particular mode in this string.

So, how can I get the mode name using XCB?


Solution

  • I do see all the mode names in the string returned by xcb_randr_get_screen_resources_names(), but they are all concatenated, and I don't know how to find the offset of a particular mode in this string.

    You have the length of the individual names and you know the length of each name, so you just have to count bytes:

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