「Xrandr」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
234行目: 234行目:
   
 
上記のコマンドを systemd ユニットやキーボードのバインドで使うことで、DisplayPort モニターがサスペンドから復帰したときに画面が落ちるのを防ぐことができます。
 
上記のコマンドを systemd ユニットやキーボードのバインドで使うことで、DisplayPort モニターがサスペンドから復帰したときに画面が落ちるのを防ぐことができます。
  +
  +
=== Configuration using arandr ===
  +
  +
{{Pkg|arandr}} can graphically arrange your monitors, change resolutions, and save a script to duplicate your setup. By default, if you "Save As" it will be saved in {{ic|~/.screenlayout/}}. These files can then be [[Autostarting#On Xorg startup|autostarted]]. Sometimes problems arise from running the arandr script too soon after login, add a {{ic|sleep}} command if needed.
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==

2022年7月25日 (月) 21:40時点における版

関連記事

xrandrRandR("Resize and Rotate") X Window System 拡張の公式設定ユーティリティです。xrandr を使うことで画面のサイズや向き、反転などを設定できます。マルチモニターの設定についてはマルチディスプレイのページを見て下さい。

インストール

xorg-xrandrインストールしてください。

グラフィカルフロントエンド

  • ARandR — XRandR のシンプルなビジュアルフロントエンド。相対的なモニター位置がグラフィカルに表示され、ドラッグアンドドロップにより変更できます。
https://christian.amsuess.com/tools/arandr/ || arandr
  • LXRandR — LXDE 向けのスクリーン解像度や外部モニタを管理するツールです
https://wiki.lxde.org/en/LXRandR || GTK+ 2: lxrandr, GTK+ 3: lxrandr-gtk3

CLI フロントエンド

  • xlayoutdisplay — ディスプレイを検出して設定します。ラップトップのカバーの状態、利用可能なリフレッシュレートの最大値、実際の DPI の計算と適用。.xinitrc で最適に使用され、モニタのプラグを差し込んだり抜いたり、ラップトップのカバーを閉じるときに呼び出すことができます。
https://github.com/alex-courtis/xlayoutdisplay || xlayoutdisplayAUR

設定のテスト

何もオプションを付けずに実行すると、xrandr はシステムで利用可能な出力端子の名前 (VGA-1, HTMI-1, など) と各端子で利用できる解像度を表示します (現在の解像度は *、推奨解像度は + が後ろに付きます):

xrandr
Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192
VGA-1 disconnected (normal left inverted right x axis y axis)
HTML-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
    1920x1080     59.93 +  60.00*   50.00    59.94
    1920x1080i    60.00    50.00    59.94
    1680x1050     59.88
...
ノート: 上記のリストに使用したい解像度が表示されない場合、#検出されない解像度を追加するを参照してください。

xrandr を使うことで特定の出力端子で解像度を設定できます (上記のリストに存在する解像度である必要があります):

$ xrandr --output HDMI-1 --mode 1920x1080

リストに複数のリフレッシュレートがある場合、--rate オプションを使うことで同時に、または個別にリフレッシュレートを変更できます。例:

$ xrandr --output HDMI-1 --mode 1920x1080 --rate 60

--auto オプションは特定の出力がオフになっている場合にオンに変えて最大解像度を設定します:

$ xrandr --output HDMI-1 --auto

1回のコマンドで複数の出力端子を指定することもできます。例えば HDMI-1 をオフにして HDMI-2 を最大解像度でオンするには:

$ xrandr --output HDMI-1 --off --output HDMI-2 --auto
ノート:
  • xrandr による設定は現在のセッション中だけ適用されます。
  • xrandr には多数の機能が存在します。詳しくは xrandr(1) を見て下さい。

設定

xrandr は RandR 拡張のシンプルなインターフェイスであり設定ファイルが存在しません。しかしながら、永続的な設定を行う方法が複数存在します:

  1. RandR 拡張は X の設定ファイルで設定できます。詳しくは マルチディスプレイ#RandR を参照してください。この方法では静的な設定だけが可能です。
  2. 動的な設定が必要な場合、X サーバーを起動するたびに xrandr コマンドを実行するようにしてください。詳しくは自動起動#X セッションのスタートアップを参照。この方法の欠点は起動プロセスに遅延が発生するということで、ディスプレイマネージャを使用している場合、ディスプレイマネージャの解像度を変更することはできません。
  3. xrandr を呼び出すカスタムスクリプトを特定のイベント (例えば外部モニターが接続された時) で実行することもできます。詳しくは acpid を見て下さい。#スクリプト セクションに役に立つようなサンプルスクリプトをいくつか記載しています。
ヒント: KDM と GDM には X が初期化されたときに実行されるスタートアップスクリプトが存在します。GDM の場合、スクリプトは /etc/gdm/ にあり、KDM の場合、スクリプトは /usr/share/config/kdm/Xsetup、SDDM の場合、/usr/share/sddm/scripts/Xsetup です。この方法は root 権限を必要とし、システムの設定ファイルを弄る必要がありますが、起動プロセスでは xprofile よりも早く設定が適用されます。

スクリプト

外部モニターを切り替える

このスクリプトは外部モニター ($extern で指定) とデフォルトのモニター ($intern で指定) を切り替えます。つまり一度にどちらか片方のモニターだけを使うようにします。

スクリプトを実行するときはデフォルトのモニター ($intern で指定) が接続されているようにしてください。ノートパソコンなら常時接続されているはずです。

#!/bin/bash
intern=LVDS1
extern=VGA1

if xrandr | grep "$extern disconnected"; then
    xrandr --output "$extern" --off --output "$intern" --auto
else
    xrandr --output "$intern" --off --output "$extern" --auto
fi
ノート: 外部モニターを有効にし続けたい場合、else の中身を xrandr --output "$intern" --primary --auto --output "$extern" --right-of "$intern" --auto に置き換えてください。

設定を autorandr で設定を自動的に切り替える

autorandr を使うと、ディスプレイを接続したり接続解除するときに自動的に有効化できる xrandr "profiles" を簡単に設定できます。使用方法は ホームページ を参照。

2つのモニターを管理する

monsAUR は2つのモニターディスプレイを素早く切り替える POSIX 互換のシェルスクリプトです。

プロジェクターモードなど分かりやすいモードが用意されており、モニター接続時に選択・位置決めを行います (詳しくは [1] を参照)。

例 3

このスクリプトは接続されているモニターを順繰りに切り替えます。現在アクティブなモニターを選択して、次のモニターをオンにして他のモニターはオフにします:

# get info from xrandr
connectedOutputs=$(xrandr | grep " connected" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/")
activeOutput=$(xrandr | grep -E " connected (primary )?[1-9]+" | sed -e "s/\([A-Z0-9]\+\) connected.*/\1/")

# initialize variables
execute="xrandr "
default="xrandr "
i=1
switch=0

for display in $connectedOutputs
do
	# build default configuration
	if [ $i -eq 1 ]
	then
		default=$default"--output $display --auto "
	else
		default=$default"--output $display --off "
	fi

	# build "switching" configuration
	if [ $switch -eq 1 ]
	then
		execute=$execute"--output $display --auto "
		switch=0
	else
		execute=$execute"--output $display --off "
	fi

	# check whether the next output should be switched on
	if [ $display = $activeOutput ]
	then
		switch=1
	fi

	i=$(( $i + 1 ))
done

# check if the default setup needs to be executed then run it
echo "Resulting Configuration:"
if [ -z "$(echo $execute | grep "auto")" ]
then
	echo "Command: $default"
	`$default`
else
	echo "Command: $execute"
	`$execute`
fi
echo -e "\n$(xrandr)"

例 3a

このスクリプトは xrandr の全ての出力端子を順繰りに確認します。モニターが接続されていれば、最大解像度を確認して前のデイスプレイの右に配置します。srandrdAURi3-wm で使用する例:

~/.xprofile
srandrd ~/.i3/detect_displays.sh
#!/bin/bash

XRANDR="xrandr"
CMD="${XRANDR}"
declare -A VOUTS
eval VOUTS=$(${XRANDR}|awk 'BEGIN {printf("(")} /^\S.*connected/{printf("[%s]=%s ", $1, $2)} END{printf(")")}')
declare -A POS
#XPOS=0
#YPOS=0
#POS="${XPOS}x${YPOS}"

POS=([X]=0 [Y]=0)

find_mode() {
  echo $(${XRANDR} |grep ${1} -A1|awk '{FS="[ x]"} /^\s/{printf("WIDTH=%s\nHEIGHT=%s", $4,$5)}')
}

xrandr_params_for() {
  if [ "${2}" == 'connected' ]
  then
    eval $(find_mode ${1})  #sets ${WIDTH} and ${HEIGHT}
    MODE="${WIDTH}x${HEIGHT}"
    CMD="${CMD} --output ${1} --mode ${MODE} --pos ${POS[X]}x${POS[Y]}"
    POS[X]=$((${POS[X]}+${WIDTH}))
    return 0
  else
    CMD="${CMD} --output ${1} --off"
    return 1
  fi
}

for VOUT in ${!VOUTS[*]}
do
  xrandr_params_for ${VOUT} ${VOUTS[${VOUT}]}
done
set -x
${CMD}
set +x

例 4 - xrasengan を使って X のクラッシュを防ぐ

DisplayPort モニターでよくなる、モニターがサスペンドモードになって接続されていないと表示される場合、以下の方法を使って接続されている出力端子をオンにしてください:

declare -i count=2
declare -i seconds=1

while ((count)); do
    xrandr >/dev/null
    sleep $seconds
    ((count--))
done

xrasenganAUR は上記のワークアラウンドを組み込んだ xrandr ラッパーです:

$ xrasengan --force -on DisplayPort-0 -off HDMI-0

--force オプションを付けると、xrasengan は HDMI-0 がオフになる前に全ての出力端子の状態を更新して、それが唯一接続されていた出力端子だった場合に X がクラッシュするのを防ぎます。

現在の設定をリロードしたいときは、xrasengan--try-reload-active-layout オプションを使います。--forcearandr パッケージの unxrandr を利用してコマンドラインを組み立てます:

$ xrasengan --try-reload-active-layout

上記のコマンドを systemd ユニットやキーボードのバインドで使うことで、DisplayPort モニターがサスペンドから復帰したときに画面が落ちるのを防ぐことができます。

Configuration using arandr

arandr can graphically arrange your monitors, change resolutions, and save a script to duplicate your setup. By default, if you "Save As" it will be saved in ~/.screenlayout/. These files can then be autostarted. Sometimes problems arise from running the arandr script too soon after login, add a sleep command if needed.

トラブルシューティング

画面の点滅

一部の LCD スクリーン(例:Samsung 2343NW、Acer XB280HK、iiyama ProLite XUB3490WQSU-B1 など)については、cvt -r(点滅を減らす)コマンドを使用する必要があるようです。例えば ProLite XUB3490WQSU-B1 と Dell XPS 13 の Thunderbolt HDMI 2.0 アダプタで、60hz (59,94 を選択) でこの画面が点滅している場合 (アダプタ +LCD 画面は Windows で完全に動作)、以下を実行する必要があります。

cvt -r 3440 1440

ヒント:

# 3440x1440 59.97 Hz (CVT) hsync: 88.82 kHz; pclk: 319.75 MHz Modeline "3440x1440R" 319.75 3440 3488 3520 3600 1440 1443 1453 1481 +hsync -vsync

こちらも試してみて下さい:

xrandr --newmode "3440x1440R" 319.75 3440 3488 3520 3600 1440 1443 1453 1481 +hsync -vsync

それと:

xrandr --addmode DP1 3440x1440R

これで、点滅しない最高の画面解像度で 59.97hz モードを選択できます。

click here for a screenshot

検出されない解像度を追加する

ハードウェアやドライバーにバグがあるために、モニターの適切な解像度が xrandr によって検出されないことがあります。例えば、モニターの EDID データブロックが間違っていることが考えられます。その場合でも、適当な解像度を xrandr に追加することができます。また、この方法を応用すると、ドライバーでは有効でないが、実際ハードウエアがサポートしているリフレッシュレートを追加したりもできます。

まず gtfcvt を実行して希望の解像度の Modeline を取得します:

$ cvt 1280 1024
# 1280x1024 59.89 Hz (CVT 1.31M4) hsync: 63.67 kHz; pclk: 109.00 MHz
Modeline "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync
ヒント: 液晶ディスプレイ (例: Samsung 2343NW や Acer XB280HK) の場合、cvt -r コマンドを使います。
ヒント: Modeline を適用した際にスクリーンが暗転するなら、低めのリフレッシュレート (60 ではなく 30 あるいは 45 など) を試みてください。リフレッシュレートは3番目の引数として渡されます: cvt 2560 1440 45
ノート: Intel のビデオドライバー xf86-video-intel を使っている場合、/var/log/Xorg.0.log に望みの解像度とプロパティが報告されている可能性があります。gtfcvt の出力と違っている場合は先にそちらを使って下さい。ログの例:
[    45.063] (II) intel(0): clock: 241.5 MHz   Image Size:  597 x 336 mm
[    45.063] (II) intel(0): h_active: 2560  h_sync: 2600  h_sync_end 2632 h_blank_end 2720 h_border: 0
[    45.063] (II) intel(0): v_active: 1440  v_sync: 1443  v_sync_end 1448 v_blanking: 1481 v_border: 0
xrandr での使用例: $ xrandr --newmode "2560x1440" 241.50 2560 2600 2632 2720 1440 1443 1448 1481 -hsync +vsync

Modesetting ドライバーでも同じようなログを見つけられるでしょう。

次に新しい xrandr のモードを作成します。Modeline キーワードは抜かす必要があるので注意してください。

$ xrandr --newmode "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync

モードを作成した後、この新しいモードを現在の出力 (VGA1) に追加してください。先にパラメータを設定したので、モードの名前だけで使うことができます。

$ xrandr --addmode VGA1 1280x1024_60.00

そして画面の解像度を追加した解像度に変更します:

$ xrandr --output VGA1 --mode 1280x1024_60.00

上記の設定は現在のセッションでのみ有効なので注意してください。

テストする解像度について確信が持てない場合、以下のように sleep 5 を追加することで安全に解像度を変更できます:

$ xrandr --output VGA1 --mode 1280x1024_60.00 && sleep 5 && xrandr --newmode "1024x768-safe" 65.00 1024 1048 1184 1344 768 771 777 806 -HSync -VSync && xrandr --addmode VGA1 1024x768-safe && xrandr --output VGA1 --mode 1024x768-safe

また、VGA1 は適当な出力端子の名前に置き換えてください。

EDID checksum is invalid

上記の方法で起動時に *ERROR* EDID checksum is invalid エラーが発生する場合、KMS#モードの強制と EDID[2] を見て下さい。

また、xrandr --addmodeX Error of failed request: BadMatch というエラーが表示されることがありますが、この場合も EDID のチェックサムが間違っています。詳しく確認したい場合、verbose モードで X を起動して (例: startx -- -logverbose 6)、Xorg のログに EDID に関するメッセージが出力されていないかチェックしてください。NVIDIA のカードを使っている場合は NVIDIA/トラブルシューティング#xrandr BadMatch を読むことを推奨します。

点滅後に画面の解像度が戻ってしまう

EDID が存在しないモニターで GNOME を使っている場合、上記の#検出されない解像度を追加する方法が機能しないことがあります。xrandr --output を実行した後に画面が点滅して解像度がリセットされます。

~/.config/monitors.xml を修正するか、ファイルを完全に削除してから再起動してください。

詳しくは こちら の記事を参照。

検出されない解像度を永続的に追加

xrandr を使って適当な解像度が見つかったら、/etc/X11/xorg.conf.d/ にエントリを追加することでモードを永続的に追加することができます:

/etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor"
    Identifier "VGA1"
    Modeline "1280x1024_60.00"  109.00  1280 1368 1496 1712  1024 1027 1034 1063 -hsync +vsync
    Option "PreferredMode" "1280x1024_60.00"
EndSection

Section "Screen"
    Identifier "Screen0"
    Monitor "VGA1"
    DefaultDepth 24
    SubSection "Display"
        Modes "1280x1024_60.00"
    EndSubSection
EndSection

Section "Device"
    Identifier "Device0"
    Driver "intel"
EndSection

intel は適当なドライバーに置き換えてください。例: nvidia。X サーバーを再起動すれば、新しい解像度が設定できるようになるはずです。

上手く行かない場合、Screen と Device セクションを削除して Monitor セクションだけにしてみてください [3]

解像度が低い

ヒント: 先に #検出されない解像度を追加する を試して下さい。それで上手く行かない場合、この方法を試して下さい。

ビデオカードは認識されるのに解像度が低い場合、以下の方法を試すことができます。

例: ATI X1550 ベースのビデオカードと2つの液晶モニター DELL 2408 (最大解像度: 1920x1200) と Samsung 206BW (最大解像度: 1680x1050) を使用。インストール後の最初のログイン時に、デフォルトの解像度が 1152x864 になる。xrandr でも 1152x864 以上の解像度が表示されない。/etc/X11/xorg.conf を編集して、仮想スクリーンのセクションを追加して、ログアウト・ログインしても上手く解像度が設定されない。

xorg.conf を変更:

/etc/X11/xorg.conf
Section "Screen"
        ...
        SubSection "Display"
                Virtual 3600 1200
        EndSubSection
EndSection

数字について: DELL を左に Samsung を右に配置しているため、液晶ディスプレイの横幅の合計は 3600=1920+1680 になり、高さはディスプレイの高い方に合わせて、max(1200,1050)=1200 となります。他のディスプレイの上に液晶ディスプレイを配置する場合、次のように計算します: (max(width1, width2), height1+height2)。

.xinitrc から解像度を設定してもうまくいかない

DDX modesetting(4) ドライバ以外の場合、接続されたデバイスのモードを適切に列挙するのに時間がかかり、xrandr がすぐには動作しないかもしれません。これは xf86-video-intel ドライバに当てはまると思われ、起動初期に xrandr を使うと間違った解像度が設定されます。考えられる対処法は以下の通りです。

  • xrandr を起動する前に2、3秒待つ。
~/.xinitrc
...
{ sleep 2; xrandr xrandr_parameters } &
...

これはバックグラウンドで待機し、他のスタートアップをブロックしないようにするためです。これが好ましくない場合、例えばウィンドウマネージャの設定がディスプレイを正しく配置することに依存している場合、フォアグラウンドでコマンドを実行することができます。

~/.xinitrc
...
sleep 2
xrandr xrandr_parameters
...
  • デスクトップ起動の後段でモードを設定する。スタートアップスクリプトの機能の詳細については、ウィンドウマネージャのドキュメントを参照してください。
  • 汎用モード設定ドライバへの切り替え。これは、デバイス固有のDDXドライバをアンインストールすることで、最も簡単に行うことができます。xf86-video-intel の場合、このドライバには他の欠陥があり、これが役に立つかもしれません。詳しくは Intel Graphics#インストール をご覧ください。

アンダースキャンを利用してオーバースキャンが発生するテレビ解像度を補正

薄型テレビではオーバースキャンによって画像が大きく表示され端のほうが切れてしまうことがあります。

テレビの設定で問題を解決できないか確認してください。テレビの設定でどうにもならないがアンダースキャンをサポートしている場合 ({xrandr --prop} で確認できる) は、underscan を適用して境界値を変更してください。使用しているテレビによって適切な underscan vborderunderscan hborder の値は変わります。自分の目で確認しながら値を増減させてください:

$ xrandr --output HDMI-0 --set underscan on --set "underscan vborder" 25 --set "underscan hborder" 40

--transform を利用してオーバースキャンが発生するテレビ解像度を補正

アンダースキャンが利用できないなら、出力を変形する xrandr --transform "a,b,c,d,e,f,g,h,i" を利用する解決策もあります。変形方法の詳細は xrandr(1) § RandR_version_1.3_options マニュアルページを参照してください。

例えば、水平座標の変形スケールを 0.8 に、垂直座標を 1.04 に、そして画面を 35 ピクセル右に 19 ピクセル下にするには:

$ xrandr --output HDMI1 --transform 0.80,0,-35,0,1.04,-19,0,0,1

HDMI のフル RGB

Intel のドライバーでは HDMI モニターの出力が正しく設定されないことがあります。Broadcast RGB プロパティ によって色諧調が狭くなると (16-235)、黒が黒ではなく灰色のようになります。

phantom monitor の無効化

場合によっては、存在しないモニターがシステムによって検出されることがあります。これを無効にするには、phantom 出力の名前を見つけます。例: VGA1、そしてそれをオフにします

$ xrandr --output VGA1 --off

これを永続的にするには、/etc/X11/xorg.conf.d/ のエントリに以下を追加します。

/etc/X11/xorg.conf.d/10-monitor.conf
Section "Monitor"
    Identifier "VGA1"
    Option "Ignore" "true"
EndSection

AOC G2590PX による動的インターレースパターンの出現

動きが見られるときに非常に目立つ インターレースパターンの出現(メッシュまたはグリッド)が表示されている場合このモニターの画面では、リフレッシュレートが低いために発生している可能性があります。より高いリフレッシュレート(60Hz から119.98Hz、そしておそらくそれ以上)に切り替えると、影響を減らすのに役立つ場合があります。

HDMIを介したこのモニターのサンプルxrandr出力:

HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 544mm x 303mm
   1920x1080     60.00 + 119.98*   99.93    50.00    59.94

上記の出力からわかるように、xrandr によって報告される推奨リフレッシュレートは 60.00 ですが、このリフレッシュレートでは問題が非常に目立ちます。119.98 に切り替えると、影響を大幅に減らすことができます。

$ xrandr --output HDMI-1 --mode 1920x1080 --rate 119.98

参照