Я предполагаю, что вас интересует геометрия мониторов, то есть реальных физических устройств, а не X-экрана.
В этом случае корневое окно — это не то, что вас интересует. Здесь нужно учитывать два основных момента:
Чтобы узнать, как запрашивать всевозможные детали, я бы порекомендовал посмотреть программы, которые это делают. Каноническим предложением был бы оконный менеджер, который поддерживает настройки с несколькими головками, такой как оконный менеджер i3, который фактически поддерживает как Xinerama, так и RandR, поэтому вы можете посмотреть его исходный код для обоих.
Информацию, которую вы ищете, можно найти в src/randr.c
и src/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);
*) Отказ от ответственности: я являюсь автором этого инструмента.
Редактировать: обратите внимание, что вам также необходимо прослушивать события смены экрана, а затем снова запрашивать выходные данные, если вы заинтересованы в обновлении информации.
person
Ingo Bürk
schedule
03.05.2016