Можно ли одновременно перечислять подключения дисплея X Server и идентифицировать монитор, подключенный к каждому?

Насколько я знаю, опция GNOME уже использует Wayland. Итак, если вы хотите использовать Wayland, просто выберите GNOME.

Если нет, попробуйте устранить неполадки с аппаратным обеспечением? Он устарел/устарел? Может попробовать переустановить систему?

2
06.11.2019, 20:22
2 ответа

Самое приятное:Вот мой Python-скрипт для этого , который требует python-xlibустановки.

На данный момент я нашел один источник, чтобы получить список подключений дисплея X-сервера и одновременно подключить мониторы к каждому из них, и это сам X. Есть несколько способов получить эту информацию от X, в зависимости от вашей терпимости к синтаксическому анализу и получению данных непосредственно от X.

Метод 1 :Разборxrandr --verbose

Команда xrandr --verboseсодержит всю информацию, необходимую для согласования соединений дисплея с мониторами. Его вывод для подключения к одному дисплею выглядит следующим образом:

Screen 0: minimum 320 x 200, current 6400 x 1600, maximum 8192 x 8192
DP-1 disconnected (normal left inverted right x axis y axis)
    [extra content removed]
DisplayPort-1-7 connected 1920x1080+0+464 (0x4a) normal (normal left inverted right x axis y axis) 510mm x 287mm
    Identifier: 0x224
    Timestamp:  6668772
    Subpixel:   unknown
    Gamma:      1.0:1.0:1.0
    Brightness: 1.0
    Clones:    
    CRTC:       4
    CRTCs:      0 4 5 6 7
    Transform:  1.000000 0.000000 0.000000
                0.000000 1.000000 0.000000
                0.000000 0.000000 1.000000
               filter: 
    EDID: 
        00ffffffffffff0010ac73404c424241
        ------[more hex redacted]-------
        001155223811000a202020202020007e
    GAMMA_LUT_SIZE: 4096 
        range: (0, -1)
    DEGAMMA_LUT_SIZE: 4096 
        range: (0, -1)
    GAMMA_LUT: 0 
        range: (0, 65535)
    CTM: 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 
        0 1 
    DEGAMMA_LUT: 0 
        range: (0, 65535)
    TearFree: auto 
        supported: off, on, auto
    vrr_capable: 0 
        range: (0, 1)
    max bpc: 8 
        range: (8, 16)
    underscan vborder: 0 
        range: (0, 128)
    underscan hborder: 0 
        range: (0, 128)
    underscan: off 
        supported: off, on, auto
    scaling mode: None 
        supported: None, Full, Center, Full aspect
    link-status: Good 
        supported: Good, Bad
    CONNECTOR_ID: 76 
        supported: 76
    non-desktop: 0 
        range: (0, 1)
  1920x1080 (0x4a) 148.500MHz +HSync +VSync *current +preferred
        h: width  1920 start 2008 end 2052 total 2200 skew    0 clock  67.50KHz
        v: height 1080 start 1084 end 1089 total 1125           clock  60.00Hz
  1680x1050 (0x9b) 146.250MHz -HSync +VSync
        h: width  1680 start 1784 end 1960 total 2240 skew    0 clock  65.29KHz
        v: height 1050 start 1053 end 1059 total 1089           clock  59.95Hz
[extra content removed]

Разбор этого вывода не очень хорош :вам нужно будет идентифицировать строки, которые представляют подключение дисплея по сравнению с экраном, с вариациями в зависимости от того, подключен ли он/отключен и т. д. Но если вы это сделаете, вы можете извлеките EDID, преобразуйте его в необработанные байты и передайте в такой инструмент, как parse-edid.

Способ 2:Xlibклиент и анализатор EDID

Существует клиент Python для Xlib , в котором есть инструменты, необходимые для получения соединений дисплея и соответствующих байтов EDID с каждого подключенного монитора. Точно так же существует библиотека Python для разбора данных EDID , хотя она не совсем идеальна (, как описано ниже ). Тем не менее, я сделал пример сценария, который объединяет два этих элемента, чтобы получить ответ, который я хочу:

#!/usr/bin/env python3

import pyedid.edid, pyedid.helpers.registry
import Xlib.display

def get_x_displays():
    # Used by PyEDID to fetch manufacturers given their EDID code
    registry = pyedid.helpers.registry.Registry.from_web()

    # Xlib resources
    d = Xlib.display.Display()
    root = d.screen().root
    resources = root.xrandr_get_screen_resources()._data

    outputs = {}
    for output in resources['outputs']:
        output_info = d.xrandr_get_output_info(output, resources['config_timestamp'])._data
        output_name = output_info['name']
        props = d.xrandr_list_output_properties(output)
        edid_data = None

        # Look through the atoms (properties) of each output to see if there's one named 'EDID'
        for atom in props._data['atoms']:
            atom_name = d.get_atom_name(atom)
            if atom_name == 'EDID':
                edid_raw = d.xrandr_get_output_property(output, atom, 0, 0, 1000)._data['value']
                edid_data = pyedid.edid.Edid(bytes(edid_raw)[:128], registry)
                break

        outputs[output_name] = edid_data

    return outputs

if __name__ == '__main__':
    displays = get_x_displays()
    for connection, monitor in sorted(displays.items(), key=lambda kv: kv[0]):
        print(connection)
        print('    ' + ("No connection or empty EDID" if monitor is None else
                        "{} ({})".format(monitor.name, monitor.serial)))

На моей машине это приводит к следующему выводу: (искаженные серийные номера):

DP-1
    No connection or empty EDID
DP-2
    No connection or empty EDID
DP-3
    No connection or empty EDID
DisplayPort-1-3
    No connection or empty EDID
DisplayPort-1-4
    No connection or empty EDID
DisplayPort-1-5
    No connection or empty EDID
DisplayPort-1-6
    DELL UP3017 (DDSB553SBDFL)
DisplayPort-1-7
    DELL U2312HM (V092DMLS657D)
DisplayPort-1-8
    No connection or empty EDID
HDMI-1
    No connection or empty EDID
HDMI-A-1-1
    No connection or empty EDID
eDP-1
    None (0)
eDP-1-1
    No connection or empty EDID

Библиотеке PyEDID требуется «реестр» производителей, чтобы она могла заполнять поле производителя EDID. Вызов from_web()для создания реестра из онлайн-источника — самая медленная часть этого скрипта. Я создал альтернативную версию сценария , которая устраняет это требование, полностью пропуская поиск производителя и вместо этого передавая необработанное значение.

3
27.01.2020, 22:07

Вы пробовали`

    $ xrandr --listactivemonitors
    Monitors: 2
    0: +*DVI-0 1920/521x1080/293+0+0  DVI-0
    1:  +DVI-1 1920/521x1080/293+0+0  DVI-1

Он разбивает его на табличный формат, подобный этому:

Номер [Экран/Дисплей] :[Разъем + Режим] [Разъем]

0
27.01.2020, 22:07

Теги

Похожие вопросы