web-dev-qa-db-ja.com

特定のディスプレイを接続した場合、デフォルトのディスプレイを自動的にオフにして解像度を設定するにはどうすればよいですか?

特定の外部モニターに接続するたびに、デフォルトの解像度が必要な解像度ではないため、再度設定する必要があります。

特定のディスプレイの特定の解像度を保存し、そのディスプレイを接続した場合にデフォルトのディスプレイをオフにするにはどうすればよいですか?

2
Lawand

(特定の)接続された画面の存在に応じて、解像度を設定する

以下の2つのオプション:

  1. 画面の解像度を設定し、ショートカットキーで画面を切り替えます(2番目の画面の自動検出)
  2. バックグラウンドスクリプトを実行して、メイン画面を自動的にオフにし、解像度を変更します

オプション1;ショートカット

#!/usr/bin/env python3
import subprocess
import time

# set the default screen
default = "DVI-I-1"
# set the specific external screen
external = "VGA-1"
# set the resolution of the single screen setup
singleres = "1680x1050"
# set the resolution of the specific external screeen
extrares = "1280x1024"

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8")

def run(cmd):
    subprocess.call(cmd)

def get_screens():
    return [l.split()[0] for l in get("xrandr").splitlines() if " connected" in l]

def set_screen(n_scr, screens):
    if n_scr == 1:
        run(["xrandr", "--output", default, "--auto"])
        run(["xrandr", "-s", singleres])
        print("1 screen")
    Elif all([n_scr == 2, external in screens]):    
        run(["xrandr", "--output", default, "--off"])
        run(["xrandr", "-s", extrares])
        print("2 screens")

screens = get_screens()
n_scr2 = len(screens)
set_screen(n_scr2, screens)

オプション2;バックグラウンドバージョン

#!/usr/bin/env python3
import subprocess
import time

# set the default screen
default = "DVI-I-1"
# set the specific external screen
external = "VGA-1"
# set the resolution of the single screen setup
singleres = "1680x1050"
# set the resolution of the specific external screeen
extrares = "1280x1024"

def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8")
    except subprocess.CalledProcessError:
        pass

def run(cmd):
    subprocess.call(cmd)

def get_screens(scrdata):
    return [l.split()[0] for l in scrdata.splitlines() if " connected" in l]

def set_screen(n_scr, screens):
    if n_scr == 1:
        run(["xrandr", "--output", default, "--auto"])
        run(["xrandr", "-s", singleres])
        print("1 screen")
    Elif all([n_scr == 2, external in screens]):    
        run(["xrandr", "--output", default, "--off"])
        run(["xrandr", "-s", extrares])
        print("2 screens")

n_scr1 = None

while True:
    time.sleep(4)
    scrdata = get("xrandr")
    if scrdata:
        screens = get_screens(scrdata)
        n_scr2 = len(screens)
        if n_scr2 != n_scr1:
            set_screen(n_scr2, screens)
        n_scr1 = n_scr2

使い方

  1. 上記のスクリプトのいずれかを空のファイルにコピーし、set_screens.pyとして保存します
  2. スクリプトのheadセクションで、次の値を置き換えます。

    # set the default screen
    default = "DVI-I-1"
    # set the specific external screen
    external = "VGA-1"
    # set the resolution of the single screen setup
    singleres = "1680x1050"
    # set the resolution of the specific external screeen
    extrares = "1280x1024"
    

    (現在の設定はテスト設定用です)

  3. スクリプトをテスト実行して適用します。

    • オプション1を使用する場合、ショートカット

      ターミナルを開き、次のコマンドを使用して、外部画面を使用して、または使用せずにスクリプトを実行します。

      python3 /path/to/set_screens.py
      

      意図したとおりに画面を設定する必要があります。

      その後、すべてが正常に機能する場合は、スクリプトをショートカットに追加します。システム設定>「キーボード」>「ショートカット」>「カスタムショートカット」を選択します。 「+」をクリックして、コマンドを追加します。

      python3 /path/to/set_screens.py
      
    • オプション2を使用する場合、バックグラウンドスクリプト

      ターミナルを開き、次のコマンドを使用してスクリプトを実行します。

      python3 /path/to/set_screens.py
      

      外付けモニターを接続/切断します。解像度を変更し、意図したとおりにデフォルトモニターのオン/オフを切り替える必要があります。

      その後、すべてが正常に機能する場合は、スタートアップアプリケーションにスクリプトを追加します:ダッシュ>スタートアップアプリケーション>追加。コマンドを追加します。

      /bin/bash -c "sleep 10 && python3 /path/to/set_screens.py"
      
1
Jacob Vlijm