【问题标题】:How to get mode name using XCB?如何使用 XCB 获取模式名称?
【发布时间】:2020-04-04 21:37:28
【问题描述】:

在 Xlib 中,结构 XRRModeInfo 除了包含 nameLength 字段之外,还包含 name 本身。但是在XCB中对应的结构体xcb_randr_mode_info_t只包含name_len,似乎没有获取实际名称字符串的功能。

我确实看到xcb_randr_get_screen_resources_names()返回的字符串中的所有模式名称,但它们都是串联的,我不知道如何在这个字符串中找到特定模式的偏移量。

那么,如何使用 XCB 获取模式名称?

【问题讨论】:

    标签: x11 xcb xrandr


    【解决方案1】:

    我确实看到了 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;
    }
    

    【讨论】:

    • 啊,所以没有 O(1) 方法(在模式计数中)可以做到这一点,对吧?
    • 两个答案:(1)不会(2)你真的担心获取模式名称的性能吗?那应该总是那么快,以至于没关系。
    • 实际上,第三个:您可以为这些东西制作自己的查找表。该表可以在 O(n) 时间内构建(假设内存分配在 O(1) 中)。这样,您基本上可以得到 Xlib 为您做的事情。使用 XCB,您只需获得原始的“在线”字节,而无需任何解析或洗牌。因此,在某种程度上,XCB 在这里更好,因为它使解析成本更加明显。
    • 我关心的不是性能本身,而是libxcb-randr 是否已经完成了该循环正在重新执行的一些处理。现在,在从libxcb 读取randr.c 的实际来源之后,我发现xcb_randr_get_screen_resources_reply_txcb_wait_for_reply() 返回的服务器输出的固定长度部分,所以XCB 是一个相当薄的包装器,不能已经完成了这个处理。因此,您的答案很好。
    • 这也解释了为什么 API 如此奇怪。 (它只是没有解释为什么协议如此奇怪......)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    相关资源
    最近更新 更多