xrandr

提供: ArchWiki
2021年6月24日 (木) 13:53時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎設定のテスト: "--rate 60" が抜けていました)
ナビゲーションに移動 検索に移動

関連記事

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 front-ends

  • xlayoutdisplay — Detects and arranges displays. Handles: laptop lid state, highest available refresh rates, calculating and applying the actual DPI. Best used in .xinitrc, then can be invoked when plugging/unplugging monitors or closing laptop lid.
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 よりも早く設定が適用されます。

スクリプト

例 1

このスクリプトは外部モニター ($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 モニターがサスペンドから復帰したときに画面が落ちるのを防ぐことができます。

トラブルシューティング

Screen Blinking

For some LCD screens (e.g. Samsung 2343NW, Acer XB280HK, iiyama ProLite XUB3490WQSU-B1...), the command cvt -r (i.e. with reduced blanking) is to be used. E.g with ProLite XUB3490WQSU-B1 and Thunderbolt HDMI 2.0 adapter on Dell XPS 13, with 60hz (59,94 selected) this screen is blinking (and the adapter+LCD screen works perfectly on Windows), you have to do :

cvt -r 3440 1440

Wich giving you :

# 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

Then you have to do :

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

and

xrandr --addmode DP1 3440x1440R

Now you can select 59.97hz mode with the best screen resolution, wich not blinking anymore.

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)。

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

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

テレビの設定で問題を解決できないか確認してください。テレビの設定でどうにもならないがアンダースキャンをサポートしている場合 ({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)、黒が黒ではなく灰色のようになります。

Disabling phantom monitor

In some cases, a non-existent monitor may be detected by the system. To disable it, find the name of the phantom output, e.g. VGA1, and turn it off with

$ xrandr --output VGA1 --off

To make this permanent, add the following to an entry in /etc/X11/xorg.conf.d/:

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

Dynamic interlace pattern artifacts with AOC G2590PX

If you are seeing very prominent interlace pattern artifacts (mesh or grid) when you see movement on the screen with this monitor, it might be happening because of a low refresh rate. Switching to a higher refresh rate (from 60 Hz to 119.98 Hz and perhaps even higher) might help reduce the effect.

Sample xrandr output for this monitor over HDMI:

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

As can be seen in the output above, the preferred refresh rate reported by xrandr is 60.00, but the artifacts are very visible with this refresh rate. Switching to 119.98 should help reduce the effect considerably.

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

参照