どうやら、設計された動作の動作を変更するための「秘密の」設定は見つかりませんでした。実際、左の画面が「ベース」画面であると想定されているように見えます。
ただし、回避策を作成することは非常によく可能であり、基本的に同じ結果になります。2番目の画面を接続するときに、すべてのウィンドウを一覧表示するスクリプトを作成できます。その後、最初に左側の画面に移動したすべてのウィンドウが、1秒か2秒以内に右側の画面に戻ります。すべてのウィンドウのサイズが保持されます。
これが、以下のスクリプトが行うことです。
2つのバージョン
配置したウィンドウを復元するには、次の2つの方法があります。
- ときどき、2番目の画面の接続後に実行するショートカットキーを使用します。
- 自動的に、バックグラウンドでスクリプトを実行し、画面が接続されるのを待ちます。
使い方
準備
インストール wmctrl
sudo apt-get install wmctrl
を使用して2つの画面の名前を検索します。画面の名前は、xrandr
「接続済み」という単語の直前に表示されます。
以下のスクリプトのいずれか、ヘッドセクションで、これらの2行で画面名を正しいものに置き換えます。
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
スクリプトを次のように保存します move_windows.py
ディスプレイ設定で、セカンダリ画面が左側にあることを確認してください。2つの画面の一番上の行は(質問の最初の画像のように)整列している必要があります。
スクリプトを実行する
-時々実行するスクリプトを使用する場合は、2番目の画面が接続された後でスクリプトを実行してください。
python3 /path/to/move_windows.py
それが何をすべきかを考えている場合は、キーボードショートカットに追加することをお勧めします。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。「+」をクリックして、コマンドを追加します。
これを使用してバックグラウンドで実行する場合は、次のコマンドでも実行します。
python3 /path/to/move_windows.py
意図したとおりに機能する場合は、起動アプリケーションに追加します。ダッシュ>起動アプリケーション>追加
ラップトップ(右側)と2つの異なる画面(左側)でスクリプトをテストしました。結果は同じでした。
ノートパソコンの画面
スクリプトなしで接続
実行中のスクリプトとの接続
スクリプトの処理が完了すると、ウィンドウは(そのまま)そのままになり、ウィンドウを自由に配置できます。
スクリプト
1.画面が接続された後に実行する「手動」バージョン
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows(get_shift(get("xrandr")))
2.バックグラウンドで実行する自動バージョン
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
while True:
try:
screen_info1 = get("xrandr")
time.sleep(5)
screen_info2 = get("xrandr")
check = screen_2+" connected"
if (check in screen_info1, check in screen_info2) == (False, True):
time.sleep(5)
shift_windows(get_shift(screen_info2))
except:
pass