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

9

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 in meinem Laptop-Bildschirm 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.

Fernseher links

Die Fenster bewegen sich jedoch nicht, wenn ich meinen Fernsehbildschirm (virtuell) rechts von meinem Laptop-Bildschirm einstelle. Die Verwendung ist jedoch verständlicherweise verwirrend, da sie das Gegenteil der physischen Einrichtung darstellt. Außerdem möchte ich meinen Schreibtisch nicht bewegen.

Fernseher rechts

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 diese Foren überprüft, 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.

Lassen Sie Ubuntu Windows NICHT verschieben, wenn Sie einen von mehreren Monitoren ausschalten

Hat jemand irgendwelche Ideen? Bitte lassen Sie mich wissen, wenn Sie dies tun. Vielen Dank!

K0j0
quelle

Antworten:

2

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 xrandrden 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

Geben Sie hier die Bildbeschreibung ein

Verbindung ohne Skript

Geben Sie hier die Bildbeschreibung ein

Verbindung mit dem laufenden Skript

Geben Sie hier die Bildbeschreibung ein

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
Jacob Vlijm
quelle
Ernsthaft kranke Fähigkeiten, Jacob!
don.joey
@ K0j0 Hast du es geschafft?
Jacob Vlijm
@JacobVlijm Ich bin mir nicht sicher, ob eine Abfrage alle 5 Sekunden die beste Lösung ist (gibt es keine ereignisgesteuerte Möglichkeit?). Wenn Sie daran interessiert sind, dieses Skript in einen Unity-Indikator zu verwandeln ( wie diese hier ), setzen Sie sich bitte mit uns in Verbindung.
Peterino
@Peterino Wenn ein ereignisgesteuertes Signal vorhanden ist, wäre es meine erste Wahl. Zur gleichen Zeit: Wenn ein Hintergrundskript gut geschrieben ist, sollte (und kann) seine zusätzliche Belastung praktisch keine sein, und ich teste meine Skripte immer speziell darauf. Ich führe selbst eine wechselnde Anzahl von Hintergrundskripten aus. Auch alle zusammen haben keinerlei spürbare Wirkung. Denken Sie daran, dass auf Ihrem System per Definition zahlreiche Schleifen ausgeführt werden. Über den Vorschlag für einen Unity-Indikator: Ich bin definitiv daran interessiert zu lernen, wie man einen Indikator erstellt, entweder für diese oder eine andere Situation :).
Jacob Vlijm
@JacobVlijm Laut einer Quelle von Canonical erfolgt die automatische Platzierung von Fenstern automatisch ab einer der nächsten Versionen von Ubuntu ("work in progress") . Es lohnt sich wahrscheinlich nicht, in den verbleibenden Monaten in die aktuelle Version zu investieren. Ich werde mich jedoch bei den Mir-Entwicklern unter IRC # ubuntu-mir @ freenode erkundigen.
Peterino