XCB获取所有监视器及其x,y坐标

时间:2016-05-01 12:54:28

标签: xcb

到目前为止,我已经拥有了所有显示器。监视器是一个屏幕。所以我做的是:

xcb_connection_t *conn;

conn = xcb_connect(NULL, NULL);

if (xcb_connection_has_error(conn)) {
  printf("Error opening display.\n");
  exit(1);
}

const xcb_setup_t* setup;
xcb_screen_t* screen;

setup = xcb_get_setup(conn);
screen = xcb_setup_roots_iterator(setup).data;
printf("Screen dimensions: %d, %d\n", screen->width_in_pixels, screen->height_in_pixels);

这给了我宽度和高度。然而,获得x和y是至关重要的。在获得x和y的方式xcb_get_window_attributes_cookie_t上正在screen->root吗?

我在这里读书 - http://www.linuxhowtos.org/manpages/3/xcb_get_window_attributes_unchecked.htm - 但没有给出x / y坐标。

1 个答案:

答案 0 :(得分:1)

我认为您对显示器的几何形状感兴趣,即实际的物理设备,而不是X屏幕。

在这种情况下,根窗口不是您感兴趣的内容。这里基本上有两个不同的事情需要考虑:

要了解如何查询各种细节,我的建议是查看执行此操作的程序。一个规范的建议是支持多头设置的窗口管理器,例如i3窗口管理器,实际上它支持Xinerama和RandR,所以你可以查看它们的源代码。

您要查找的信息可在src/randr.csrc/xinerama.c中找到。必要的RandR API调用是

  • xcb_randr_get_screen_resources_current
  • xcb_randr_get_screen_resources_current_outputs
  • xcb_randr_get_output_info
  • xcb_randr_get_crtc_info

后者将为您提供输出的CRTC信息,其中包括输出的位置和大小。

RandR实现的另一个来源是xedgewarp:src/randr.c *。我将在此处列出源代码的大量缩短摘录:

xcb_randr_get_screen_resources_current_reply_t *reply = xcb_randr_get_screen_resources_current_reply(
        connection, xcb_randr_get_screen_resources_current(connection, root), NULL);

xcb_timestamp_t timestamp = reply->config_timestamp;
int len = xcb_randr_get_screen_resources_current_outputs_length(reply);
xcb_randr_output_t *randr_outputs = xcb_randr_get_screen_resources_current_outputs(reply);
for (int i = 0; i < len; i++) {
    xcb_randr_get_output_info_reply_t *output = xcb_randr_get_output_info_reply(
            connection, xcb_randr_get_output_info(connection, randr_outputs[i], timestamp), NULL);
    if (output == NULL)
        continue;

    if (output->crtc == XCB_NONE || output->connection == XCB_RANDR_CONNECTION_DISCONNECTED)
        continue;

    xcb_randr_get_crtc_info_reply_t *crtc = xcb_randr_get_crtc_info_reply(connection,
            xcb_randr_get_crtc_info(connection, output->crtc, timestamp), NULL);
    fprintf(stderr, "x = %d | y = %d | w = %d | h = %d\n",
            crtc->x, crtc->y, crtc->width, crtc->height);
    FREE(crtc);
    FREE(output);
}

FREE(reply);

*)免责声明:我是该工具的作者。

修改:请注意,如果您有兴趣保持信息的最新状态,还需要侦听屏幕更改事件,然后再次查询输出。