Как запросить разрешение экрана X11? - PullRequest
16 голосов
/ 02 декабря 2009

Кажется, это простая проблема, но я не могу найти ответ: как вы запрашиваете (через X11), какие мониторы существуют и их разрешения?

Ответы [ 7 ]

13 голосов
/ 02 декабря 2009

Извлечение отображения макросов и экранных макросов из руководства Xlib .

В частности:

11 голосов
/ 16 июня 2011

Это может быть полезно для клиентов и сценариев

xwininfo -root

Но xRandR может быть более точным, особенно если используется среда с несколькими мониторами:

xrandr
5 голосов
/ 02 декабря 2009

Для современных X-серверов также имеется расширение XRandR, которое предоставляет самую актуальную модель информации о многоэкранном макете, включая перекрывающиеся экраны и динамические изменения экрана.

Документация доступна в спецификации протокола XRandR 1.3.1 и на странице руководства libXrandr .

4 голосов
/ 02 декабря 2009

Если используется Xinerama, попробуйте XineramaQueryScreens. В противном случае вы можете использовать один экран и использовать (X)WidthOfScreen / (X)HeightOfScreen.

.

(см. Также другой ответ. Возможно, удаленно кто-то использует старую модель экрана X, где ваши экраны :x.0, :x.1 и т. Д.)

2 голосов
/ 09 февраля 2017

Библиотека X11 работает только с Unix-подобными ОС, поэтому это не кроссплатформенное решение.

Полный код

#include <stdio.h>

#include <X11/Xlib.h>

int
main(const int argc, const char *argv[])
{

    Display *display;
    Screen *screen;

    // open a display
    display = XOpenDisplay(NULL);

    // return the number of available screens
    int count_screens = ScreenCount(display);

    printf("Total count screens: %d\n", count_screens);


    for (int i = 0; i < count_screens; ++i) {
        screen = ScreenOfDisplay(display, i);
        printf("\tScreen %d: %dX%d\n", i + 1, screen->width, screen->height);
    }

    // close the display
    XCloseDisplay(display);

   return 0;
}

Компиляция

gcc -o setup setup.c -std=c11 `pkg-config --cflags --libs x11`

Результат (актуально для моего компьютера)

Total count screens: 1
    Screen 1: 1366X768

На основании:

  1. https://tronche.com/gui/x/xlib/display/opening.html
  2. https://tronche.com/gui/x/xlib/display/display-macros.html
  3. https://tronche.com/gui/x/xlib/display/screen-information.html
  4. https://stackoverflow.com/a/1829747/6003870
1 голос
/ 24 июня 2018

Python

import os
from Xlib import X, display
d = display.Display()
s = d.screen().root
output = os.popen("xrandr --listmonitors | grep '*' | awk {'print $4'}").read().splitlines()
num_sc = s.xinerama_get_screen_count().screen_count
width = s.get_geometry().width
height = s.get_geometry().height
print("Total count screens: %s" % num_sc)
for i in range(num_sc):
    print("\tScreen %s(%s): %sX%s" % (i, output[i], width, height))

Баш

$ xrandr --listmonitors
$ xrandr
$ xrandr | grep '*' | awk {'print $1'}
1 голос
/ 22 мая 2016

Очистить xrandr вывод для использования imagemagick

xrandr |grep \* |awk '{print $1}'
...