外部モニターを接続するときに RandR 構成を自動的に適用するツール

外部モニターを接続するときに RandR 構成を自動的に適用するツール

人々が次のことを行うことができるツールはありますか?

  • 各ディスプレイの現在のRandR設定(位置、方向、解像度など)を覚えておいてください。
  • モニターが接続されると、アプレットまたはxrandr(1)を使用して処理することなく、最後に知られている良好な構成が自動的に適用されます。

これらの構成は、ユーザーごと、モニターごとに適用する必要があります。

そのようなツールがない場合は、自分で作成したいのですが、私が知っている限り、モニターが接続されているかどうかを知る方法はありません。出力が接続されているか切断されているかどうかを確認するために、xrandr -qをポーリングするために頻繁に使用する必要がありますか、それを行うより効率的な方法がありますか? udevがこれを行うように調整できますか?

答え1

ユーザー別、モニター別のモニター構成プロファイルを保存できるツールについて、自動整列それがまさにそれがすることです。

私のラップトップにはNVIDIAカードがあるので、次のものを使用します。分散型バックエンドxrandrの代わりに。そうすると、AutorandrはScatterをバックエンドとして使用してモニターを管理しますautodisper。しかし、この記事の残りの部分では、一貫性のためにこれを「autorandr一貫性」と呼びます。

を使用して設定ファイルを保存できますautorandr --save profile_nameautorandr単独で実行すると、プロファイルのリストが提供され、現在の構成で検出されるプロファイルが決定されます。

たとえば、

$ autorandr
laptop
syncmaster19 (detected)

現在の設定に適した設定ファイルを自動的にロードするように指示できますautorandr --change。ホットプラグで実行するためにudevルールとペアになっているこのコマンドは、要求された操作を実行します。

--default laptop追加の予防措置として、現在の設定と一致する保存プロファイルがない場合は、ノートブックのディスプレイをデフォルトに設定するコマンドを追加しました。したがって、ディスプレイを切り替えるために使用される完全なコマンドは次のようになります。

autorandr --change --default laptop

残念ながら、モニターをホットプラグすると、私のコンピュータからudev出力が提供されなくなります。私はNVIDIA独自のドライバを使用しているので、これは驚くべきことではありません。だから今、私はXF68ディスプレイキー(Fn-F8)にバインドしましたが、ほぼ同じです。

答え2

私は、VGAが切断されたときにRandRをポーリングし続け、LVDS1とVGA1を切り替える簡単な(直接作成された)スクリプトを使用しています。 (のためHDMI出力は次のスクリプトファイルですべて)VGA1に変わります。HDMI1

これは汚い解決策ですが、うまく動作します。

私の設定に合わせてカスタマイズされました。 RandR出力名(LVDS1およびVGA1私とは違うVGAのRandR基本モードに満足できます。

#!/bin/bash

# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
    echo "Switching to VGA1"
    xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    MONITOR=VGA1
}
function DeactivateVGA {
    echo "Switching to LVDS1"
    xrandr --output VGA1 --off --output LVDS1 --auto
    MONITOR=LVDS1
}

# functions to check if VGA is connected and in use
function VGAActive {
    [ $MONITOR = "VGA1" ]
}
function VGAConnected {
    ! xrandr | grep "^VGA1" | grep disconnected
}

# actual script
while true
do
    if ! VGAActive && VGAConnected
    then
        ActivateVGA
    fi

    if VGAActive && ! VGAConnected
    then
        DeactivateVGA
    fi

    sleep 1s
done

全ステップ:

  1. 上記のスクリプト(homemadeMonitor.sh)を目的のディレクトリに配置します。

  2. 端末に次のコマンドを入力して、.shファイルを実行可能にします。

    chmod +x homemadeMonitor.sh

  3. .sh ファイルの実行

    ./homemadeMonitor.sh

答え3

質問の「モニターが接続されていることを確認する[1つの方法]」セクションに答えるには、次の手順を実行します。

サポートは依然として異なりますが、最近のカーネルは明示的なホットプラグが発生したときにudevイベントの生成をサポートしています。カーネル 2.6.38 および ATI X1400 ハードウェアを使用して VGA モニターを初めて接続するとイベントが受信されますが、その後モニターを切断または再接続するとイベントは発生しません。Intelハードウェアはより良いサポートを提供できます。NVIDIA独自のドライバは現在KMSをサポートしていません。 NVIDIAハードウェアでホットプラグイベントを探していませんが、機能するかどうかは疑問です。

udevを試してみたい場合は、次の手順を試してください。

  • 最新のカーネルで更新
  • カーネルモード設定(KMS)が有効になっていることを確認してください。有効な場合は、カーネル出力に報告する必要があります。私の[drm] radeon kernel modesetting enabled平和[drm] initializing kernel modesetting
  • udevadm monitor --propertyモニター接続を(分離)するときにイベントが報告されるかどうかを確認してください。

モニターのホットプラグからudevイベントを受信した場合は、udevルールを使用してスクリプトをトリガーできます。例:

ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"

メモ:これはいいえ独自のバイナリドライバでnVIDIA GPUを使用している場合は、KMSを使用していないので動作します。することができますいいえudev イベントを取得します。

答え4

上記で提案したudevルールは、次のシェルスクリプトで使用しました。

#!/bin/sh

dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority

if [ "${dmode}" = disconnected ]; then
     /usr/bin/xrandr --auto
elif [ "${dmode}" = connected ];then
     /usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi

Xauthority部分はエクスポートするのと同じくらい重要です。 echoを使用して、どの番号が同じかを確認DISPLAYできます。外部ディスプレイを見るために持っています$DISPLAYxrandr -q最後のelse文は、表示する内容がなく、詰まらないようにするためのものです。

関連情報