外部ディスプレイが接続されたときにRandR構成を自動的に適用するためのツール


54

以下を可能にするツールがあります:

  • モニターごとに現在のRandR構成(位置、方向、解像度など)を記憶し、
  • アプレットやxrandr(1)をいじる必要なく、ディスプレイが接続されるとすぐに最後の既知の適切な構成を自動的に適用しますか?

構成は、ユーザーごと、ディスプレイごとに適用する必要があります。

野生にそのようなツールがない場合、私は自分で1つを投げたいと思いますが、私が見る限り、モニターがプラグインされたことを伝える方法はありません。xrandr-qでポーリングする必要がありますか出力が接続または切断されたことを把握するために時々、またはそれを行うためのより効率的な方法はありますか?それを行うためにudevを調整できますか?


モニターがカードに接続されていることを確認する方法はありませんか?udevadm monitor --propertyターミナルから実行してモニターを接続してみてください。私のカードでは、接続時にイベントが表示されます。udevで+ RUNルールとbashスクリプトを使用して、必要なものを取得できる場合があります。ただし、udevを使用してユーザーごとにこれをどのように実装できるかはわかりません。
スティーブンD

@Steven:あなたのコメントは答えであるべきです。完全な答えではありませんが、大きな進歩を遂げています。udevがハードウェアイベントを検出した場合、halに通知し、ユーザーコードが表示できるdbusイベントを送信します。
ジル 'SO-悪であるのをやめる'

回答:


19

RandRをポーリングし続け、VGAが接続/切断されたときに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. を押してターミナルを開きます Ctrl+Alt+t
  2. 適切な場所に移動して、自動切り替えシェルスクリプトを作成および保存します。例

    cd ./Desktop/

  3. 目的のテキストエディタで.shファイルを作成および編集します(ここでは、plumaを使用しました。nano、vimなどを試すことができます)。都合の良い名前を付けてください。例

    sudo pluma homemadeMonitor.sh

  4. ファイルを編集し、上記のスクリプト(#!/ bin / bashのスクリプト)のすべてをコピーして貼り付けます

  5. ターミナルで次のコマンドを入力して、.shファイルを実行可能にします

    sudo chmod +x homemadeMonitor.sh

  6. .shファイルを実行する

    ./homemadeMonitor.sh


良いスクリプト!おかげで、私はこのようなものが必要でした。コピーして、自動的に実行されるように設定しました。ありがとう!
Linuxios

21

質問の「[a]モニターが接続されたことを伝える方法」の部分への応答:

サポートはまだかなり異なりますが、最近のカーネルでは、ディスプレイのホットプラグが発生したときに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"

注:これはなりません、それはKMSを使用していないので、あなたは、独自のバイナリドライバをnVIDIAのGPUを使用している場合に動作します。あなたはなりません任意のudevのイベントを取得します。


19

ユーザーごとおよびディスプレイごとにモニター構成プロファイルを保管できるツールに関しては、autorandrはまさにそれを行います。https://github.com/wertarbyte/autorandr

私のラップトップにはNVIDIAカードがあるため、xrandrの代わりにdisperバックエンドを使用しますhttp ://willem.engen.nl/projects/disper/ 。Autorandrは、モニターを管理するためのバックエンドとしてdisperを使用しますautodisper。ただし、この投稿の残りの部分ではautorandr、一貫性について言及します。

でプロファイルを保存できますautorandr --save profile_nameautorandr単独で実行すると、プロファイルのリストが表示され、現在の構成として検出されたプロファイルが識別されます。

例えば:

$ autorandr
laptop
syncmaster19 (detected)

を使用して、現在の構成に適切なプロファイルを自動的にロードするように指示できますautorandr --change。このコマンドは、ホットプラグされたときに実行するためのudevルールと組み合わせて、要求したことを行います。

追加の予防策として、--default laptop現在の構成に一致する保存済みのプロファイルがない場合、ラップトップのディスプレイをデフォルトにするコマンドに追加しました。したがって、ディスプレイの切り替えに使用する完全なコマンドは次のとおりです。

autorandr --change --default laptop

残念ながら、モニターをホットプラグしても、マシンからudev出力が得られません。NVIDIA独自のドライバーを使用しているので、驚くことではありません。それで、私は今のところそれをXF68Displayキー(Fn-F8)にバインドしました。


1
autorandrは時間の無駄であり、文書化されていて、モニターがランダムに点滅し、インストール/アンインストールの指示がありませんでした。を使用してそれを解決することができますudev
レオガルッチ14年

5
念のため、github.comautorandr
phillipberndt /

7

上記の提案された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の部分はexportと同様に不可欠であり、DISPLAYecho $DISPLAYを使用してどの番号に等しいかを確認できます。使用xrandr -qして、外部モニターを確認します。最後のelseステートメントは、ディスプレイなしで立ち往生することがないようにするためのものです。


6

Xサーバーがモニター構成の変更について通知するのを待ってから、特定のコマンド(たとえば、autorandr別の回答に記載されている)を実行する小さなプログラムは、https//bitbucket.org/portix/srandrd/overviewで入手できます。

これは、udev(適切なXサーバーの検索などを心配する必要がある)を使用する、よりクリーンなソリューションのようです。


5

プラグイン時にディスプレイを自動的に検出する必要がある場合、最もクリーンなソリューションは、xrandrコマンドを含むスクリプトを実行するUDEVルールを追加することです。以下は、あるユーザーのソリューション1の例です。

udevadm
このステップでUDEVイベントを監視(出力)するのは、各ユーザーにとって最も重要です。を実行しますudevadm monitor --environment --udev。次に、HDMIケーブルを接続します。

UDEVルール
上記のコマンドからの出力に基づいて、ユーザーはでこのUDEVルールを作成しました/etc/udev/rules.d/95-monitor-hotplug.rules

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"

xrandrがユーザープロファイルで実行されるように、使用される環境変数に注意してください。

xrandrスクリプトhotplug_monitor.sh

ニーズに合わせてxrandrオプションを調整することもできます。

#! /usr/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority

function connect(){
    xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred 
}

function disconnect(){
      xrandr --output HDMI1 --off
}

xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect

3

なんらかの理由でhotplugルートを使用したくない場合は、inotifywaitを使用してスクリプト内でポーリングしないことも可能です。

#!/ bin / bash

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

renice +19 $$> / dev / null

$ START_DELAYスリープ

OLD_DUAL = "ダミー"

while [1]; 行う
    DUAL = $(cat / sys / class / drm / card0-DP-2 / status)

    if ["$ OLD_DUAL"!= "$ DUAL"]; それから
        if ["$ DUAL" == "connected"]; それから
            echo「デュアルモニターのセットアップ」
            xrandr --output $ SCREEN_LEFT --auto --rotate normal --pos 0x0 --output $ SCREEN_RIGHT --auto --rotate normal --below $ SCREEN_LEFT
        他に
            echo「シングルモニターのセットアップ」
            xrandr --auto
        fi

        OLD_DUAL = "$ DUAL"
    fi

    inotifywait -q -e close / sys / class / drm / card0-DP-2 / status> / dev / null
やった

xrandrでポーリングすると、新しいラップトップで深刻なユーザビリティの問題が発生しました(マウスは定期的に停止します)。


1

peoroのソリューションを使用するとき、xrandrから追加の出力が得られたので、grepに-cオプションを使用して、一致の数をカウントしました。HDMIに適合させ、オーディオスイッチも追加しました。

#!/bin/bash
# adapted from http://unix.stackexchange.com/questions/4489/

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to HDMI1
function ActivateHDMI {
    xrandr --output HDMI1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    pactl set-card-profile 0 output:hdmi-stereo-extra1
    MONITOR=HDMI1
}
function DeactivateHDMI {
    xrandr --output HDMI1 --off --output LVDS1 --auto
    pactl set-card-profile 0 output:analog-stereo
    MONITOR=LVDS1
}

# functions to check if HDMI is connected and in use
function HDMIActive {
    [ $MONITOR = "HDMI1" ]
}
function HDMIConnected {
    [[ `xrandr | grep "^HDMI1" | grep -c disconnected` -eq 0 ]]
}

# actual script
while true
do
    if ! HDMIActive && HDMIConnected
    then
        ActivateHDMI
    fi

    if HDMIActive && ! HDMIConnected
    then
        DeactivateHDMI
    fi

    sleep 1s
done

1

この質問を見ている人はGNOMEを使用したい人ではなく、GNOMEを使用している人はこの質問を見る必要はないでしょうが、完全を期すためです。

GNOMEにはこの機能が組み込まれています。gnome-control-centerを介してセットアップを変更すると、gnome-settings-daemonはそれを記憶し(in .config/monitors.xml)、モニターのプラグインまたはプラグアウト時に自動的に適用します。

残念ながら、monitors.xmlファイルの構成は十分に文書化されていません。こちらの質問をご覧ください。また、gnomeの表示ツールには、モニターごとにパン、スケーリングを設定する手段がなく、ズームアウトもしません。多くの人が通常のDPI画面と一緒にHiDPIラップトップ画面を使用しているため、ツールは実行可能なソリューションを得るのに十分ではありません。

これはWaylandのロードマップアイテムとして言及されていますが、最終的には言及された問題の修正が見つかるかもしれません。それまでGnomeで、xrandrを手動でセットアップするための遅延の後、起動スクリプトを実行しました。


1

たとえば、Xfceを単純化するには、ディストリビューションパッケージで利用できるはずの「arandr」をインストールしてください。「arandr」を使用してディスプレイを構成し、たとえば「displayLayout」として保存します。Arandrは「.sh」拡張子を追加して、上記のiyrinが言及したスクリプト「hotplug_monitor.sh」で記述されているように「function connect()」で直接使用できるようにします。次に例を示します。

function connect(){
 /path/to/displayLayout.sh
}

切断メカニズムを使用するには、次のように「#!/ bin / bash」のすぐ下のスクリプトの先頭に追加します。

#!/bin/bash
#
PLUGGED_EXTERNAL=`xrandr | awk /"connected [0-9]"/'{print $1}'`

xrandrはディスプレイを検出し、出力をawkに渡します。awkは、「接続された」正規表現に基づいて、本質的に必要な数字が続くディスプレイをフィルタリングします。私の意見では、プライマリディスプレイは「接続されたプライマリ」の後に番号、つまり解像度として表示されるため、正規表現で正確な解像度と一致させる必要はありません。次に、awk "print $ 1"は、この場合の外部モニターの名前である最初の列のみを印刷し、これはPLUGGED_EXTERNAL変数に保存されます。次に、スクリプトの固定表示名「HDMI1」の代わりに、$ PLUGGED_EXTERNALを次のように使用できます。

function disconnect(){
  xrandr --output $PLUGGED_EXTERNAL --off
}

xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect

0

答えを編集して、セットアップを簡単にします。

autorandrをインストールしてxrandrの画面レイアウトを自動化し、https//github.com/nalipaz/autorandr/releasesから最新の.debを取得して実行します。

dpkg -i [file]

保存された画面レイアウトでautorandrをセットアップする

autorandr --save [docked|mobile|home|etc]

例として、モニターが接続されていない私のラップトップで、私はそれを思い通りに設定してから走らせました:

autorandr --save mobile

次に、私のhdmiを接続してarandrを再構成し、実行しました:

autorandr --save docked

各レイアウトを設定した後、実行できます(「モバイル」を以前のお気に入りの名前に置き換え、モバイルを使用しました)。

autorandr --default mobile

autorandrがすべて設定されたので、接続されたディスプレイをポーリングしautorandr --changeて検出時に実行するパッケージをインストールすることにより、プロセスを自動化できます。はい、私はudevについて知っていて、それがあなたのために働くならそれを設定することができます、しかし私のテストではudevは私のhdmiのために一貫して働きませんでした。20個のプラグ/アンプラグごとに1個しか機能せず、時々完全に停止することもありました。

ここから最新の.debをダウンロードします:https : //github.com/nalipaz/poll-xrandr/releases/その後インストール

dpkg -i [file]

autorandr --changeautorandrでは、〜/ .autorandr / postswitchと呼ばれるファイルにこれらのコマンドを挿入できるようにするために、より多くのタスクを実行する必要があります。次のようにします。

cd ~/.autorandr/ && touch postswitch && chmod +x postswitch

次に、ポストスイッチファイルを編集して、次のようなファイルを作成します。

#!/bin/bash
if pidof conky > /dev/null 2>&1; then
  killall conky
fi
(sleep 2s && xrandr-adjust-brightness restore -q) &
(sleep 2s && nitrogen --restore) &
(sleep 3s && conky -q) &

さらに、autorandrとpoll-xrandrをスタートアップに追加することもできます。次の2つのコマンドのようなものです。

autorandr --change &
poll-xrandr &

モニターのプラグを抜くか接続して、魔法を見てください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.