Ich habe ein LCD an meinen Laptop angeschlossen. Wenn ich versuche, eine Datei in Nautilus zu öffnen, wird die Zielanwendung auf meinem Laptop-Display geöffnet und nicht auf dem zweiten Display (auf dem das Nautilus-Fenster geöffnet ist).
Ich möchte die Standardanzeige nicht ändern. Ich möchte Fenster auf der Anzeige öffnen, auf der ich arbeite. Wenn sich mein Dateimanager auf der Laptop-Anzeige befindet, möchte ich, dass die Apps auf der Laptop-Anzeige geöffnet werden. Wenn sich mein Dateimanager auf einer externen Anzeige befindet, erwarte ich, dass ich dort Dateien öffnen kann.
Die Ausgabe vonxrandr
Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
1366x768 60.1*+
1360x768 59.8 60.0
1024x768 60.0
800x600 60.3 56.2
640x480 59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
1920x1080 60.0* 50.0 59.9
1920x1080i 60.1 50.0 60.0
1680x1050 59.9
1280x1024 75.0 60.0
1440x900 59.9
1280x960 60.0
1280x800 59.9
1152x864 75.0
1280x720 60.0 50.0 59.9
1440x576i 50.1
1024x768 75.1 70.1 60.0
1440x480i 60.1 60.1
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)
Antwort1
Das von Ihnen beschriebene Verhalten (Öffnen des Fensters auf dem aktuellen Bildschirm)sollendas Standardverhalten sein, bei meinem 14.04 ist es so.
Aufgrund kleinerer Inkompatibilitäten mit einigen Grafiktreiber/GPU-Kombinationen können in einigen Fällen „Eigenheiten“ auftreten. Wenn keine „Clean“-Option (Fix) verfügbar ist, können Sie den unten stehenden Workaround verwenden.
Er besteht aus einem Hintergrundskript, das nach neuen Fenstern sucht. Falls ein neues Fenster vorhanden ist, vergleicht das Skript die Fensterposition mit der aktuellen Mausposition. Wenn sich Maus und neues Fenster nicht auf demselben Bildschirm befinden, wird das Fenster mit dem xdotool
Befehl windowmove verschoben.
Ist ein Hintergrundskript eine schlechte Idee?
Wenn Sie kein Hintergrundskript benötigen, verwenden Sie es nicht.
Gleichzeitig gilt: Wenn es wichtige Funktionen hinzufügt und/oder Ihnen Zeit spart, wäre es dumm, es nicht zu verwenden.Wenndas Skript ist gut organisiert und daher „sparsam im Verbrauch“.
Als Referenz: Sowohl auf meinem Laptop als auch auf meinem Desktop verwende ich ständigmindestens5 Hintergrundskripte + gelegentlich einige zusätzliche zu Testzwecken, ohnebeliebigbeachten.
Was wird getan, um Kraftstoff zu sparen:
- Das Skript hat einen variablen Schleifenzyklus
Alle 10 Sekunden prüft das Skript, ob der zweite Bildschirm angeschlossen ist. Wenn nicht, überspringt das Skript die gesamte Fensterprüfung und prüft nach 10 Sekunden erneut. Das bedeutet, dass das Skriptnurwirkt, wenn ein zweiter Bildschirm angeschlossen ist. Sobald ein zweiter Bildschirm angeschlossen ist, wird innerhalb von 10 Sekunden die Schleife auf eine Periode von 2 Sekunden geändert. - Alle (nächsten) Aktionen des Skripts sind bedingt
zB die Mausposition istnurgeprüftWennes gibt neue Fenster etc.
Alles in allem konnte ich auf meinem System weder feststellen noch messen,beliebigzusätzliche Belastung, durch das Skript.
Das Drehbuch
#!/usr/bin/env python3
import subprocess
import time
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def screen_limit():
screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
if len(screendata) == 2:
return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])
wd1 = get(["wmctrl", "-lG"])
t = 0
while True:
time.sleep(2)
# once per 10 seconds, check for a second screen
if t == 0:
while True:
rightside = screen_limit()
# if no second screen, skip the procedure
if rightside == None:
time.sleep(10)
else:
break
wd2 = get(["wmctrl", "-lG"])
# check for buggy wmctrl
if all([wd2 != None, wd1 != None]):
wins = [w.split() for w in wd2.splitlines()]
# check for new windows
relevant = [w for w in wins if not w[0] in wd1]
if relevant:
# if new windows appeared, see if they match the mouse pos
mousepos = int(get([
"xdotool", "getmouselocation"
]).split()[0].split(":")[1])
for w in relevant:
check = [mousepos < rightside, int(w[2]) < rightside]
if check[0] != check[1]:
# if mouse and window are not on the same screen > move
if check[0] == False:
cmd = ["xdotool", "windowmove", w[0],
str(int(w[2]) + rightside), w[3]]
else:
cmd = ["xdotool", "windowmove", w[0],
str(int(w[2]) - rightside), w[3]]
subprocess.Popen(cmd)
wd1 = wd2
t = 0 if t == 10 else t
t += 1
Wie benutzt man
Das Skript benötigt sowohl
wmctrl
als auchxdotool
. Führen Sie es in einem Terminal aus:sudo apt-get install xdotool wmctrl
- Kopieren Sie das Skript in eine leere Datei und speichern Sie es unter
move_windows.py
Testen Sie das Skript mit dem folgenden Befehl:
python3 /path/to/move_windows.py
Wenn alles wie erwartet funktioniert, fügen Sie es zu den Startanwendungen hinzu: Dash > Startanwendungen > Hinzufügen. Fügen Sie den Befehl hinzu:
/bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"