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


9

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

左のテレビ

ただし、テレビ画面をラップトップ画面の右側に(事実上)設定しても、ウィンドウは移動しません。しかし、これは物理的なセットアップの逆なので、使用するのが当然混乱します。また、机を動かしたくありません。

右のテレビ

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

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

Ubuntuに複数のモニターの1つをオフにしてもウィンドウを移動させない

誰かアイデアはありますか?よろしければお知らせください。ありがとう!

回答:


2

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

ただし、回避策を作成することは非常によく可能であり、基本的に同じ結果になります。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

重病、ジェイコブ!
don.joey 14

@ K0j0管理しましたか?
Jacob Vlijm、2015年

@JacobVlijm 5秒ごとのポーリングが最適なソリューションであるかどうかは不明です(イベント駆動型の可能性はありませんか?)。とにかく、このスクリプトを(ここにあるような)Unityインジケーターに変えることに興味があるなら、連絡を取ってください。
Peterino、2015年

@Peterinoイベントドリブンシグナルが存在する場合、それが私の最初の選択肢になります。同時に:場合は、バックグラウンドスクリプトはよく書かれている場合、その追加的な負担が(とすることができます)実質的に何もあってはならない、と私はいつも、特にその上で、私のスクリプトをテストします。自分でバックグラウンドスクリプトの数を変えて実行しています。すべて一緒にしても、目立った効果はまったくありません。多数のループがシステム上で定義されて実行されていることを思い出してください。ユニティインジケータの提案について:私は間違いなく、このまたは別の状況:)のためにいずれか、指標を作成する方法を学習に興味があります。
Jacob Vlijm 2015年

ウィンドウの自動配置のような@JacobVlijmのルックスによると、Ubuntuの次のリリースのいずれか(「作業中」)で始まる自動的に行われます正規のソース。現在のリリースの残りの数か月に投資する価値はないでしょう。ただし、IRC#ubuntu-mir @ freenodeでMir開発者に再確認します。
Peterino、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.