作業中と同じディスプレイでファイルを開くにはどうすればいいですか?

作業中と同じディスプレイでファイルを開くにはどうすればいいですか?

ラップトップに LCD を接続しました。Nautilus でファイルを開こうとすると、ターゲット アプリケーションが、2 番目のディスプレイ (Nautilus ウィンドウが開いているディスプレイ) ではなく、ラップトップのディスプレイで開きます。

デフォルトのディスプレイを変更したくありません。作業中のディスプレイでウィンドウを開きたいです。ファイル マネージャーがラップトップ ディスプレイにある場合は、アプリもラップトップ ディスプレイで開きます。ファイル マネージャーが外部ディスプレイにある場合は、そこでファイルを開くことを期待します。

の出力xrandr

Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
   1366x768       60.1*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x800       59.9  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1440x576i      50.1  
   1024x768       75.1     70.1     60.0  
   1440x480i      60.1     60.1  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 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)

答え1

あなたが説明する動作(現在の画面でウィンドウを開く)すべきデフォルトの動作です。私の 14.04 ではそのようになっています。

一部のグラフィック ドライバー/GPU の組み合わせでは、若干の非互換性があるため、場合によっては「異常」が発生することがあります。「クリーン」オプション (修正) が利用できない場合は、以下の回避策を使用できます。
バックグラウンド スクリプトが存在し、新しいウィンドウが表示されるかどうかを確認します。新しいウィンドウが存在する場合、スクリプトはウィンドウの位置を現在のマウスの位置と比較します。マウスと新しいウィンドウの両方が同じ画面上にない場合は、windowmove` コマンドを使用してウィンドウを移動しますxdotool

バックグラウンド スクリプトは悪い考えでしょうか?

バックグラウンドスクリプトが必要ない場合は使用しないでください。
同時に、重要な機能を追加したり、時間を節約したりする場合は、使用しないのは愚かなことです。もしスクリプトはよく構成されているため、「燃料が少ない」です。

参考までに:私のノートパソコンとデスクトップの両方で、私は常に少なくとも5つのバックグラウンドスクリプト+テスト目的の追加スクリプト(どれでも知らせ。

燃料を節約するために何が行われますか:

  1. スクリプトには可変ループサイクルがあります
    10秒ごとにスクリプトは2番目のスクリーンが接続されているかどうかをチェックします。接続されていない場合は、スクリプトはウィンドウのチェック手順全体をスキップし、10秒後に再チェックします。つまり、スクリプトはのみ2 つ目の画面が接続されている場合に動作します。2 つ目の画面が接続されると、10 秒以内にループは 2 秒の周期に変更されます。
  2. スクリプトが実行するすべての(次の)アクションは条件付きです
    例えばマウスの位置はのみチェック済みもし新しいウィンドウなどがあります。

全体として、私のシステムでは気づかず、測定もできなかったどれでもスクリプトの結果として、追加の負荷が発生します。

スクリプト

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

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

def screen_limit():
    screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
    if len(screendata) == 2:
        return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])

wd1 = get(["wmctrl", "-lG"])

t = 0
while True:
    time.sleep(2)
    # once per 10 seconds, check for a second screen
    if t == 0: 
        while True:
            rightside = screen_limit()
            # if no second screen, skip the procedure
            if rightside == None:
                time.sleep(10)
            else:
                break
    wd2 = get(["wmctrl", "-lG"])
    # check for buggy wmctrl
    if all([wd2 != None, wd1 != None]):
        wins = [w.split() for w in wd2.splitlines()]
        # check for new windows
        relevant = [w for w in wins if not w[0] in wd1]
        if relevant:
            # if new windows appeared, see if they match the mouse pos
            mousepos = int(get([
                "xdotool", "getmouselocation"
                ]).split()[0].split(":")[1])
            for w in relevant:
                check = [mousepos < rightside, int(w[2]) < rightside]
                if check[0] != check[1]:
                    # if mouse and window are not on the same screen > move
                    if check[0] == False:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) + rightside), w[3]]                    
                    else:
                        cmd = ["xdotool", "windowmove", w[0],
                            str(int(w[2]) - rightside), w[3]]
                    subprocess.Popen(cmd)
    wd1 = wd2
    t = 0 if t == 10 else t
    t += 1

使い方

  1. スクリプトにはwmctrlと の両方が必要ですxdotool。ターミナルで実行します。

    sudo apt-get install xdotool wmctrl
    
  2. スクリプトを空のファイルにコピーし、move_windows.py
  3. テスト - 次のコマンドでスクリプトを実行します。

    python3 /path/to/move_windows.py
    
  4. すべてが期待どおりに動作する場合は、スタートアップ アプリケーションに追加します: Dash > スタートアップ アプリケーション > 追加。次のコマンドを追加します:

    /bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"
    

関連情報