web-dev-qa-db-ja.com

Xubuntuはマルチモニター設定を保存します

DP KVM-Switchのxubuntu 16.04に2つの画面(ノートブックT460s自体に3つ)を備えたマルチモニターセットアップがあります。ノートブックは、2つのDPポートでDock-3ドッキングステーションを介して接続されます。

デスクトップからラップトップに切り替えるたびにモニター構成が失われるため、単一モニターのアクティブ化を含めてゼロから構成する必要があります。ノートブックがドッキングステーションに接続されている場合、これらの構成を保存して自動的に復元する方法はありますか?

画面が接続されたxrandrの(短縮された)出力:

Screen 0: minimum 8 x 8, current 6800 x 1440, maximum 32767 x 32767
eDP1 connected 2560x1440+4240+0 (normal left inverted right x axis y axis) 310mm x 170mm
   2560x1440     60.00*+  48.00  
   1920x1440     60.00  

   .........

DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP2-1 connected 1680x1050+2560+0 (normal left inverted right x axis y axis) 473mm x 296mm
   1680x1050     59.88*+  59.95  
   1920x1080     60.00    50.00    59.94  

   ..........

DP2-2 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
   2560x1440     59.95*+
   1920x1200     59.95  

   ..........

DP2-3 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
2
Atomius

16.04固有ではない

あなたが直面している問題は16.04に限ったものではなく、多くのUbuntuバージョンで起こります。

の解き方

xrandrの出力を読み取り、タイプミスをしないと仮定すると、次のコマンドは画面を設定したとおりに配置します。

xrandr --output DP2-2 --auto --pos 0x0 --output DP2-1 --auto --pos 2560x0 --output eDP1 --auto --pos 4240x0

最も迅速で簡単な解決策は、ショートカットキーに追加することです:[設定]> [キーボード]> [アプリケーションショートカット]。次に、画面が接続された後にショートカットを押します。

説明

xrandrの出力から、接続されている3つの画面の情報を確認できます。

eDP1 connected 2560x1440+4240+0
DP2-1 connected 1680x1050+2560+0
DP2-2 connected primary 2560x1440+0+0

最後のセクション:2560x1440+4240+0、パート:+4240+0では、結合された画面(x、y)の全体像で画面の位置を確認できます。左から右に、画面は明らかに次のように配置されます。

DP2-2 +0+0 | DP2-1 +2560+0 | eDP1 +4240+0

enter image description here

この配置が自動的に記憶されない場合、この回答の最初に追加したコマンドを使用して設定できます。

オプション--autoを追加しました。画面をactivateする必要があると述べたためです。

編集

要求に応じて、画面が接続されている場合にセットアップを行うためにバックグラウンドで実行する小さなbashスクリプト:

#!/bin/bash

let "target = 3"
swon=false

function nscreens {
    curr=$(xrandr | grep " connected" | wc -l)
}

function setup_scr {
    xrandr --output DP2-1 --auto --pos 0x0 \
    --output DP2-2 --auto --pos 2560x0 \
    --output eDP1 --auto --pos 4240x0
}

while true
do
  sleep 4
  nscreens
  if [ "$curr" -eq "$target" ] && [ "$swon" == false ]
  then
    setup_scr
    swon=true
  Elif [ "$curr" -ne "$target" ] && [ "$swon" == true ]
  then
    swon=false
  fi
done
  • スクリプトを空のファイルにコピーし、setup_scr.shとして保存し、実行可能にします
  • 次のコマンドを使用して、ターミナルでテスト実行します。

    /path/to/setup_scr.sh
    

    画面の接続/切断

  • 正常に動作する場合は、起動アプリケーションに追加します:ダッシュ>起動アプリケーション>追加。コマンドを追加します。

    /bin/bash -c "sleep 15 && /path/to/setup_scr.sh"
    

説明

  • 4秒に1回、スクリプトは接続された画面の数をカウントします。 3に等しい場合、セットアップを1回実行し、「swon」(スイッチオン)の値をtrueに切り替えて画面を設定したことを思い出します。

    その後、画面の数が3に等しくなくなった場合、「swon」が再びfalseに設定され、以下同様に続きます。

注意

2画面設定でスクリプトをテストしましたが、うまく機能しましたが、どこかにタイプミスをした可能性が常にあり、明らかにシステムでテストできませんでした。エラーの場合、言及してください。

4
Jacob Vlijm

これらの答えは復元についてのみです。現在の状態を「保存」するには、このスクリプト(dump_randr.sh)を使用できます

#!/bin/bash
fileName="$1"
while read -r line; do
    IFS=" "
    entry=( $line )
    display=${entry[0]}
    IFS="x+"
    if [[ "${entry[2]}" == primary ]]; then
        primary=1
        measurement=( ${entry[3]} )
    else
        primary=0
        measurement=( ${entry[2]} )
    fi
    unset IFS
    width=${measurement[0]}
    height=${measurement[1]}
    left=${measurement[2]}
    top=${measurement[3]}

    xrandrOpt="$xrandrOpt --output $display --mode ${width}x${height} --pos ${left}x${top}"
    ((primary)) && xrandrOpt="$xrandrOpt --primary"

done < <(xrandr | grep " connected")

echo "#!/bin/bash" > "$fileName"
echo "xrandr $xrandrOpt" > "$fileName"
chmod +x "$fileName"

これにより、現在のxrandrオプションがダンプされ、再び使用できるようになります。現在の設定を保存するには、次のようにします。

dump_randr.sh 2_monitors_home.sh

2_monitors_home.shを作成して現在の状態を復元します。

2
estani

Jacob Vlijmが提案した方法を試してみましたが、もちろん私のシナリオ用に編集しました。それはまったく機能せず、何らかの理由で--autoまたは--posを含むxrandコマンドがマシンをクラッシュさせました(Xubuntu 16.04を使用しています)

これが私の解決策です

xrandr --output HDMI1 --mode 1920x1080 --pos 0x0 --rate 60.00 --output eDP1 --off

これは、HDMI経由で接続したセカンダリディスプレイを使用し、ラップトップディスプレイを無効にしながら1080p 60Hzに設定します

xrandr --output eDP1 --mode 1366x768 --pos 0x0 --rate 60.00

これにより、ラップトップのディスプレイがネイティブ解像度1366x768 60Hzに設定されます

2台のディスプレイに接続しているときは最初のセットアップを使用し、ラップトップディスプレイのみに接続しているときは2番目のセットアップを使用します。

これが私のsetup_scr.shファイルです。

#!/bin/bash

let "target = 2"
swon=false

function nscreens 
{
        curr=$(xrandr | grep " connected" | wc -l)
}

function setup_dubai 
{
    xrandr --output HDMI1 --mode 1920x1080 --pos 0x0 --rate 60.00 --output eDP1 --off
}

function setup_normal 
{
    xrandr --output eDP1 --mode 1366x768 --pos 0x0 --rate 60.00
}

while true
do
  sleep 4
    nscreens
  if [ "$curr" -eq "$target" ] && [ "$swon" == false ]
  then
    setup_dubai
    swon=true
  Elif [ "$curr" -ne "$target" ] && [ "$swon" == true ]
  then
    swon=false
    setup_normal
  fi
done

Jacob Vlijm に感謝します

1
Egene