Ich habe keine "geheime" Einstellung gefunden, um das Verhalten des anscheinend entworfenen Verhaltens zu ändern. Es sieht tatsächlich so aus, als ob der linke Bildschirm als "Basis" -Bildschirm angenommen wird.
Es ist jedoch sehr gut möglich, eine Problemumgehung mit im Wesentlichen demselben Ergebnis zu erstellen. Sie können ein Skript erstellen, das beim Anschließen eines zweiten Bildschirms alle Fenster auflistet. Anschließend werden alle Fenster, die anfänglich auf den linken Bildschirm verschoben wurden, innerhalb von ein oder zwei Sekunden wieder auf den rechten Bildschirm verschoben. Die Größe aller Fenster bleibt erhalten.
Das macht das folgende Skript.
Zwei Versionen
Sie können Ihre angeordneten Fenster auf zwei Arten wiederherstellen:
- Gelegentlich mit einer Tastenkombination, die ausgeführt wird, nachdem der zweite Bildschirm verbunden wurde.
- Führen Sie das Skript automatisch im Hintergrund aus und warten Sie, bis Ihr Bildschirm verbunden ist.
Wie benutzt man
Vorbereitungen
Installieren wmctrl
sudo apt-get install wmctrl
Suchen Sie mit Hilfe von nach xrandr
den Namen Ihrer beiden Bildschirme. Die Namen der Bildschirme stehen kurz vor dem Wort "verbunden".
Kopieren Sie eines der folgenden Skripte im Kopfbereich und ersetzen Sie in diesen beiden Zeilen die Bildschirmnamen durch die richtigen:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
Speichern Sie das Skript als move_windows.py
Stellen Sie sicher, dass sich in den Anzeigeeinstellungen Ihr sekundärer Bildschirm links befindet. Die oberen Zeilen der beiden Bildschirme müssen in einer Linie stehen (wie im ersten Bild Ihrer Frage).
Führen Sie das Skript aus
- Wenn Sie das Skript gelegentlich ausführen, führen Sie es aus, nachdem Ihr zweiter Bildschirm verbunden wurde.
python3 /path/to/move_windows.py
Sie können es einer Tastenkombination hinzufügen, wenn Sie der Meinung sind, dass es das tut, was es tun sollte. Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:
Wenn Sie das verwenden, um es im Hintergrund auszuführen, führen Sie es auch mit dem folgenden Befehl aus:
python3 /path/to/move_windows.py
Wenn es wie beabsichtigt funktioniert, fügen Sie es Ihren Startanwendungen hinzu: Dash> Startanwendungen> Hinzufügen
Ich habe das Skript mit meinem Laptop (rechts) und zwei verschiedenen Bildschirmen (links) getestet. Das Ergebnis war das gleiche.
Laptop Bildschirm
Verbindung ohne Skript
Verbindung mit dem laufenden Skript
Nachdem das Skript seine Arbeit erledigt hat, werden die Fenster (natürlich) "allein gelassen", und Sie können Ihre Fenster nach Ihren Wünschen anordnen.
Die Skripte
1. "Manuelle" Version, die ausgeführt wird, nachdem der Bildschirm angeschlossen wurde
#!/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. Automatische Version, die im Hintergrund ausgeführt wird
#!/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