各接続ポイント(存在する場合)に接続されている物理モニタを識別しながら、DisplayPort-1-7
または同じXサーバーディスプレイ接続ポイントを列挙したいと思います。HDMI-A-1-1
やる気:私はXubuntu 18.04(Bionic)を使用していますが、xfceはドッキング/ドッキング解除時にモニタを自動的に設定する機能が正しく動作しません。 Dellノートブックを使用していますが、GPUがドッキング、ドッキング解除、および再ドッキング時にモニタ接続識別子を変更するため、固定識別子だけではモニタを設定できずarandr
失敗します。
私の目標は、接続されたモニターを見てxrandrを実行して、自分が望む方法でモニターを設定できる単純なBash / Pythonスクリプトを作成することです。
潜在的なツール:
xrandr
X Server固有のディスプレイ接続ポイントのリストは提供されていますが、モニターIDは提供されていません。hwinfo --monitor
モニターを一覧表示し、EDIDデータをデコードしてモデル名とシリアルIDを確認できますが、X Windows名は解決できません。
どの物理モニターがどのXサーバーポートに接続されているかを確認する方法が見つかりませんでした。
編集する以下の説明を明確にするには:私の目標は、名前、モデル、またはシリアル番号でモニターを識別することです。その後、xrandr
スクリプトでモニターのIDを使用して解像度と位置を設定できます。
答え1
ただ良い部分:これを行うために使用するPythonスクリプトは次のとおりです。、python-xlib
インストールが必要です。
これまで、私はXサーバーが接続のリストを表示し、モニターが各サーバーに接続できるようにする1つのソースを見つけました。まさに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パーサー
一つあるXlib用Pythonクライアント接続されている各モニターからディスプレイ接続と関連するEDIDバイトを取得するために必要なツールがあります。同様に、EDIDデータ解析用のPythonライブラリ、理想的ではありませんが(以下で説明しますが)、私はこの2つのプロジェクトを一緒に使用してサンプルのスクリプトを作成し、目的の答えを得ることができました。
#!/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()
オンラインソースからレジストリを生成するための呼び出しは、このスクリプトの最も遅い部分です。私が作ったこのスクリプトの代替バージョン製造元の照会を完全にスキップし、代わりに生の値を渡してこの要件を削除します。
答え2
やってみました。
$ xrandr --listactivemonitors
Monitors: 2
0: +*DVI-0 1920/521x1080/293+0+0 DVI-0
1: +DVI-1 1920/521x1080/293+0+0 DVI-1
次の表形式に分けられます。
[画面/モニター]番号:[コネクタ+モード] [コネクタ]