it-swarm.com.de

Gibt es eine Möglichkeit zu verhindern, dass sich Ihre Fenster bewegen, wenn ein externer Monitor angeschlossen ist?

Also verwende ich Ubuntu 14.10 auf meinem Laptop und schließe es gelegentlich für einen zweiten Bildschirm an meinen Fernseher an. Mein Fernseher befindet sich links von meinem Schreibtisch. Wenn ich es als externen Monitor links von meinem Laptop-Bildschirm aktiviere, werden alle Fenster, die sich auf meinem Laptop-Bildschirm befanden, auf den Fernsehbildschirm verschoben. Ich kann sie zurückschieben, aber es ist wirklich ärgerlich, dies jedes Mal tun zu müssen, besonders wenn mehrere Fenster geöffnet sind.

TV on Left

Die Fenster bewegen sich jedoch nicht, wenn ich meinen Fernsehbildschirm (virtuell) rechts von meinem Laptopbildschirm einstelle. Dies ist jedoch verständlicherweise verwirrend, da es das Gegenteil des physischen Aufbaus ist. Außerdem möchte ich meinen Schreibtisch nicht bewegen.

TV on Right

Es scheint, als ob Ubuntu oder der Anzeigeserver einfach davon ausgehen, dass der Monitor ganz links der Hauptmonitor ist und wo sich alle Fenster befinden sollten. Gibt es eine Möglichkeit, dieses Verhalten zu deaktivieren?

Ich habe in diesen Foren nachgesehen, aber noch niemanden gesehen, der darüber geschrieben hat. Der nächste Thread, den ich gefunden habe, war dieser, obwohl es nicht ganz dasselbe Problem ist.

Bringe Ubuntu dazu, KEINE Fenster zu verschieben, wenn du einen von mehreren Monitoren ausschaltest

Hat jemand irgendwelche Ideen? Bitte lassen Sie es mich wissen. Vielen Dank!

9
K0j0

Ich habe keine "geheime" Einstellung gefunden, um das Verhalten des anscheinend entworfenen Verhaltens zu ändern. Es sieht tatsächlich so aus, als wäre der linke Bildschirm der "Basis" -Bildschirm.

Es ist jedoch sehr gut möglich, eine Problemumgehung mit im Wesentlichen demselben Ergebnis zu erstellen. Sie können ein Skript erstellen, das beim Verbinden 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 auf den rechten Bildschirm verschoben. Die Größe aller Fenster bleibt erhalten.
Genau das macht das folgende Skript.

Zwei Versionen

Sie können Ihre arrangierten Fenster auf zwei Arten wiederherstellen:

  • Gelegentlich mit einer Tastenkombination, die ausgeführt wird, nachdem der zweite Bildschirm verbunden wurde.
  • Das Skript wird automatisch im Hintergrund ausgeführt und wartet darauf, dass der Bildschirm verbunden wird.

Wie benutzt man

Vorbereitungen

  • wmctrl installieren

    Sudo apt-get install wmctrl

  • Suchen Sie die Namen Ihrer beiden Bildschirme mit Hilfe von xrandr. Die Namen der Bildschirme stehen kurz vor dem Wort "connected".

  • Kopieren Sie eines der folgenden Skripte. 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)
    

    speichere das Skript als move_windows.py

  • Stellen Sie in den Anzeigeeinstellungen sicher, dass sich 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 die gelegentliche Ausführung verwenden, führen Sie sie aus, nachdem der zweite Bildschirm angeschlossen wurde.

    python3 /path/to/move_windows.py

Sie können es zu einer Tastenkombination hinzufügen, wenn Sie der Meinung sind, dass es die gewünschten Funktionen erfüllt. Wählen Sie: Systemeinstellungen> "Tastatur"> "Tastenkombinationen"> "Benutzerdefinierte Tastenkombinationen". Klicken Sie auf das "+" und fügen Sie den Befehl hinzu:

  • Wenn Sie das Programm 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 so funktioniert, wie Sie es beabsichtigt haben, 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

enter image description here

Verbindung ohne Skript

enter image description here

Verbindung mit dem laufenden Skript

enter image description here

Nachdem das Skript seine Arbeit erledigt hat, werden die Fenster (natürlich) "in Ruhe gelassen", und Sie können Ihre Fenster nach Ihren Wünschen anordnen.

Die Drehbücher

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, um im Hintergrund zu laufen

#!/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
2
Jacob Vlijm