web-dev-qa-db-ja.com

デュアルスクリーンモードで画面間でウィンドウを移動する

私はラップトップと27インチのモニターを持っています。 Qtを一方のモニターで実行し、Pycharmをもう一方のモニターで実行しています。両方の画面間ですべてのウィンドウを交換するキーの組み合わせを作成する方法はありますか。その理由は、大画面でのみプログラムしたいからです。すでに4つのワークスペースがあり、それらはすべて既に使用されています。

Xrandrの出力:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 32767 x 32767
eDP1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 344mm x 193mm
   1920x1080      60.2*+   59.9  
   1680x1050      60.0     59.9  
   1600x1024      60.2  
   1400x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1360x768       59.8     60.0  
   1152x864       60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 597mm x 336mm
   1920x1080      60.0*+   50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1600x1200      60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1366x768       59.8  
   1152x864       75.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   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)
7
Mehdi

1.画面1->画面2からすべてのウィンドウを交換するスクリプト、およびその逆

このスクリプトは、画面が同じ垂直解像度であり、左の画面がプライマリ画面であると想定しています。 水平両方の画面の解像度がスクリプトによって検索されます。

設定方法

スクリプトをインストールするには、wmctrlが必要です。

Sudo apt-get install wmctrl
  1. 以下のスクリプトを空のファイルにコピーし、swap_windows~/.bin(拡張子なし)として保存します。ディレクトリがまだ存在しない場合は作成し、スクリプトを実行可能にします
  2. ディレクトリ~/bin(まだ存在していなかった)を作成したばかりの場合は、ログアウト/ログインするか、ターミナルで実行します:source ~/.profile
  3. 次のコマンドを使用してスクリプトをテスト実行します。

    swap_windows
    
  4. すべてが期待どおりに機能する場合は、ショートカットキーを追加します。 [システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、コマンドを追加します

スクリプト

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

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def swap_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if any(["_TYPE_NORMAL" in props, "TYPE_DIALOG" in props]):    
            if 0 < int(w[2]) < shift_r:
                shift = shift_r
            Elif shift_r-shift_l > int(w[2]) >= shift_r:
                shift = -shift_r
            else:
                shift = 0
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])     
swap_windows()



2.(すべての)ウィンドウをあるモニターから別のモニターに移動するスクリプト

以下のスクリプトは、デュアルモニターセットアップのウィンドウを1つの画面から別の画面に移動します。

  • 左から右のモニターまで->

    または

  • 右から左のモニター<-

引数に応じて、(leftまたはright)で実行します

スクリプトは(再び)画面が同じ垂直解像度であり、左の画面がプライマリ画面であることを前提としています。 水平両方の画面の解像度がスクリプトによって検索されます。

設定方法

スクリプトをインストールするには、wmctrlが必要です。

Sudo apt-get install wmctrl
  1. 以下のスクリプトを空のファイルにコピーし、shift_windows~/.bin(拡張子なし)として保存します。ディレクトリがまだ存在しない場合は作成し、スクリプトを実行可能にします
  2. ディレクトリ~/bin(まだ存在していなかった)を作成したばかりの場合は、ログアウト/ログインするか、ターミナルで実行します:source ~/.profile
  3. コマンドを使用してスクリプトをテスト実行します

    shift_windows right
    

    および:shift_windows left

    前者の場合、left screenのウィンドウは右側の画面に移動し、後者の場合はその逆になります。

  4. すべてが期待どおりに機能する場合は、次の2つのショートカットの組み合わせにスクリプトを追加します。[システム設定]> [キーボード]> [ショートカット]> [カスタムショートカット]を選択します。 「+」をクリックして、上記の説明に従ってコマンドを追加します。

スクリプト

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

vec = sys.argv[1]

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if vec == "right":
            check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = shift_r
        if vec == "left":
            check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = -shift_r
        if check == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()




3. 1つのウィンドウをある画面から別の画面に移動する

文字通りあなたの質問ではありませんが、ほんの数行だけで、allウィンドウをある画面から別の画面に移動できます。

以下のスクリプトを使用すると、コマンドでallウィンドウを移動できます。

shift_windows right

または、次のコマンドで単一のウィンドウを移動します:

shift_windows right s

セットアップは上記のスクリプトとほとんど同じです(wmctrlをインストールすることを忘れないでください)

スクリプト

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

vec = sys.argv[1]
try:
    n = sys.argv[2]
except IndexError:
    n = "a"

def get(cmd):
    return subprocess.check_output(["/bin/bash", "-c",  cmd]).decode("utf-8")

def get_shiftright(xr_output):
    lines = [l for l in xr_output.splitlines() if "+0+0" in l][0].split()
    return int([it for it in lines if "x" in it][0].split("x")[0])

def get_shiftleft(xr_output):
    lines = [l for l in xr_output.splitlines() if  "+0" in l and not "+0+0" in l][0].split()
    return -int([it for it in lines if "x" in it][0].split("x")[0])

def shift_windows():
    xr_output = get("xrandr")
    shift_r = get_shiftright(xr_output)
    shift_l = get_shiftleft(xr_output)
    w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
    if n == "s":
        frontmost = [l for l in get("xprop -root").splitlines() if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0].split()[-1]
        frontmost = frontmost[:2]+"0"+frontmost[2:]
        w_data = [l for l in w_data if frontmost in l]
    for w in w_data:
        props = get("xprop -id "+w[0])
        if vec == "right":
            check = (0 < int(w[2]) < shift_r, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = shift_r
        if vec == "left":
            check = (shift_r-shift_l > int(w[2]) >= shift_r , "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True)
            shift = -shift_r
        if check == 2:
            command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), str(int(w[3])-28), w[4], w[5]])
            subprocess.Popen(["/bin/bash", "-c", command])
shift_windows()
5
Jacob Vlijm