Verschieben Sie Fenster im Dual-Screen-Modus zwischen Bildschirmen

7

Ich habe einen Laptop und einen 27-Zoll-Monitor. Ich habe Qt auf einem Monitor und Pycharm auf dem anderen. Gibt es eine Möglichkeit, eine Tastenkombination zu erstellen, um alle Fenster zwischen beiden Bildschirmen auszutauschen? Der Grund ist, dass ich nur auf der großen Leinwand programmieren möchte. Ich habe bereits 4 Arbeitsbereiche und alle werden bereits verwendet.

Die Ausgabe von 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)
Mehdi
quelle
Beide sind 1920x1080, für die Arbeitsbereiche möchte ich nicht viel wechseln und ich brauche momentan nicht mehr als 4x2 Bildschirme. In der Lage zu sein, beide Bildschirminhalte auszutauschen, würde mir die Biegung ersparen, um näher an den kleinen Laptop-Bildschirm heranzukommen (mit einer externen Tastatur kann ich den Laptop-Bildschirm aufgrund der Form des Laptops nicht so nah bei mir haben wie den großen Bildschirm)
Mehdi
Der externe Bildschirm erweitert den Laptop auf der linken Seite (Hauptbildschirm wird auf dem externen Bildschirm angezeigt)
Mehdi
Vielen Dank für Ihre Zeit, ich muss nur präzisieren, dass meine Arbeitsbereiche in Compiz
Mehdi

Antworten:

5

1. Skript zum Vertauschen aller Fenster von Bildschirm 1 -> Bildschirm 2 und umgekehrt

Das Skript geht davon aus, dass die Bildschirme dieselbe vertikale Auflösung haben und der linke Bildschirm der primäre ist. Die horizontale Auflösung beider Bildschirme wird vom Skript durchsucht.

Wie stellt man das ein

Das Skript muss wmctrlinstalliert sein:

sudo apt-get install wmctrl
  1. Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es als swap_windows(keine Erweiterung) in ~/.bin. Erstellen Sie das Verzeichnis, falls es noch nicht vorhanden ist, und machen Sie das Skript ausführbar .
  2. Wenn Sie das Verzeichnis gerade erstellt haben ~/bin(es war noch nicht vorhanden), melden Sie sich entweder ab oder führen Sie es in einem Terminal aus : source ~/.profile.
  3. Testen Sie das Skript mit dem folgenden Befehl:

    swap_windows
    
  4. Wenn alles wie erwartet funktioniert, fügen Sie die Tastenkombination hinzu. Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu

Das Skript

#!/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. Skript zum Verschieben (aller) Fenster von einem Monitor auf den anderen

Das folgende Skript verschiebt Fenster in einem Dual-Monitor-Setup von einem Bildschirm auf einen anderen:

  • vom linken zum rechten Monitor ->

    oder

  • vom rechten zum linken Monitor <-

Abhängig von dem Argument, mit dem Sie es ausführen ( leftoder right)

Das Skript geht (erneut) davon aus, dass die Bildschirme dieselbe vertikale Auflösung haben und der linke Bildschirm der primäre ist. Die horizontale Auflösung beider Bildschirme wird vom Skript durchsucht.

Wie stellt man das ein

Das Skript muss wmctrlinstalliert sein:

sudo apt-get install wmctrl
  1. Kopieren Sie das folgende Skript in eine leere Datei und speichern Sie es als shift_windows(keine Erweiterung) in ~/.bin. Erstellen Sie das Verzeichnis, falls es noch nicht vorhanden ist, und machen Sie das Skript ausführbar .
  2. Wenn Sie das Verzeichnis gerade erstellt haben ~/bin(es war noch nicht vorhanden), melden Sie sich entweder ab oder führen Sie es in einem Terminal aus : source ~/.profile.
  3. Testen Sie das Skript mit den Befehlen

    shift_windows right
    

    und: shift_windows left

    Im ersten Fall sollten sich die Fenster auf Ihrem linken Bildschirm zum rechten Bildschirm bewegen und im zweiten Fall umgekehrt.

  4. Wenn alles wie erwartet funktioniert, fügen Sie das Skript zwei Verknüpfungskombinationen hinzu: Wählen Sie: Systemeinstellungen> "Tastatur"> "Verknüpfungen"> "Benutzerdefinierte Verknüpfungen". Klicken Sie auf das "+" und fügen Sie die Befehle wie oben erläutert hinzu.

Das Skript

#!/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. Verschieben Sie ein einzelnes Fenster von einem Bildschirm auf einen anderen

Obwohl dies nicht buchstäblich Ihre Frage ist, können Sie mit nur wenigen Zeilen entweder alle Fenster von einem Bildschirm auf den anderen verschieben, aber auch ein einzelnes (das vorderste) mit einer Tastenkombination.

Mit dem folgenden Skript können Sie alle Fenster mit dem folgenden Befehl verschieben:

shift_windows right

oder verschieben Sie ein einzelnes Fenster mit dem Befehl:

shift_windows right s

Das Setup entspricht weitgehend dem obigen Skript (vergessen Sie nicht, es zu installieren wmctrl).

Das Skript

#!/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()
Jacob Vlijm
quelle
Ich habe beide Skripte ausprobiert, erhalte jedoch immer eine Fehlermeldung bezüglich Traceback außerhalb des Bereichs (letzter Aufruf zuletzt): Datei "./shift_windows", Zeile 34, in <module> shift_windows () Datei "./shift_windows", Zeile 20, in shift_windows shift_r = get_shiftright (xr_output) Datei "./shift_windows", Zeile 11, in get_shiftright lines = [l für l in xr_output.splitlines (), wenn "verbunden primär" in l] [0] .split () IndexError: Listenindex außerhalb der Reichweite
Mehdi
Es ist tatsächlich verbunden
Mehdi
Ich habe meine Frage bearbeitet
Mehdi
Vielen Dank, es scheint, dass es gut funktioniert. Aber zurück zu meiner Frage, ist es möglich, beide Bildschirme zu tauschen? gleichzeitig von links nach rechts und von rechts nach links bewegen?
Mehdi
UnboundLocalError: Lokale Variable 'shift', auf die vor der Zuweisung verwiesen wird
Mehdi