web-dev-qa-db-ja.com

外部モニターが接続されているときにウィンドウが移動しないようにする方法はありますか?

だから、私はラップトップでUbuntu 14.10を使用していて、ときどきセカンドスクリーンのためにテレビに接続しています。テレビは机の左側にあります。ラップトップ画面の左側にある外部モニターとして有効にすると、ラップトップ画面にあったすべてのウィンドウがテレビ画面に移動します。私はそれらを元に戻すことができますが、特に複数のウィンドウが開いているときは、毎回そうしなければならないのは本当に面倒です。

TV on Left

ただし、ノートパソコンの画面の右側にテレビ画面を設定すると(実質的に)、ウィンドウは移動しません。しかし、これは物理的なセットアップの反対であるため、使用するのは理解しやすいことです。また、机を動かしたくありません。

TV on Right

Ubuntuまたはディスプレイサーバーは、左端のモニターがメインモニターであり、すべてのウィンドウがあるはずだと仮定しているようです。この動作を無効にする方法はありますか?

私はこれらのフォーラムをチェックしてきましたが、これについて誰も投稿していません。私が見つけた最も近いスレッドはこれでしたが、まったく同じ問題ではありません。

複数のモニターのいずれかをオフにしたときにウィンドウを移動しないようにUbuntuを取得

誰にもアイデアはありますか?もしそうなら教えてください。ありがとう!

9
K0j0

設計された動作の動作を変更するための「秘密の」設定は見つかりませんでした。実際、左の画面が「ベース」画面であると想定されているように見えます。

ただし、回避策を作成して、基本的に同じ結果を得ることができます。 2番目の画面を接続する際に、すべてのウィンドウをリストするスクリプトを作成できます。その後、最初に左側の画面に移動したすべてのウィンドウは、1〜2秒以内に右側の画面に戻ります。すべてのウィンドウのサイズは保持されます。
それが以下のスクリプトの動作です。

2つのバージョン

配置されたウィンドウは、次の2つの方法で復元できます。

  • 場合によっては、2番目の画面が接続された後に実行するショートカットキーを使用します。
  • 自動的に、バックグラウンドでスクリプトを実行し、画面が接続されるのを待ちます。

使い方

準備

  • インストールwmctrl

    Sudo apt-get install wmctrl

  • xrandrを使用して2つの画面の名前を検索します。画面の名前は、単語「接続」の直前になります。

  • 以下のスクリプトのいずれかのヘッドセクションで、これらの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つの異なる画面(左側)でスクリプトをテストしました。結果は同じでした。

ラップトップ画面

enter image description here

スクリプトなしで接続

enter image description here

実行中のスクリプトと接続

enter image description here

スクリプトがジョブを実行した後、ウィンドウは「もちろん」そのままになり、ウィンドウを自由に配置できます。

スクリプト

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
2
Jacob Vlijm