Ich verwende Ubuntu 14.04 auf meinem Laptop an meinem Schreibtisch mit einem zweiten Monitor. Wenn ich die Verbindung zum zweiten Monitor trenne, verschiebt sich mein Fenster für Emacs aus dem Bildschirm.
Ich kann Alt-TAB drücken, um Emacs zum aktiven Fenster zu machen, und blindlings Emacs stoppen, damit ich ihn neu starten kann, wodurch er wieder auf dem Bildschirm erscheint. Aber es scheint mir, dass es in Ubuntu einen Weg geben sollte, ein Off-Screen-Fenster wieder auf den Bildschirm zu bringen. Gibt es?
Eine bessere Lösung wäre natürlich, zu verhindern, dass die Fenster als Reaktion auf die Trennung des Monitors aus dem Bildschirm gehen, und ich würde eine Lösung dafür das akzeptieren Problem.
AKTUALISIERUNG:
Die Ausgabe von xrandr
bei Anschluss an einen zweiten Monitor:
Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+1280+0 (normal left inverted right x axis y axis) 382mm x 215mm
1920x1080 60.0*+ 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
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 376mm x 301mm
1280x1024 60.0*+ 75.0
1280x960 60.0
1152x864 75.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 75.0 72.8 66.7 60.0
720x400 70.1
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
Die Ausgabe von xrandr
nach dem Trennen vom zweiten Monitor:
Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 32767 x 32767
eDP1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 382mm x 215mm
1920x1080 60.0*+ 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
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
Außerdem habe ich versucht, die Links-Rechts-Positionen meines Terminalfensters und meines Emacs-Fensters zu vertauschen und dann die Verbindung zu trennen. Dadurch bleibt das Emacs-Fenster auf dem Bildschirm, nachdem die Verbindung zum zweiten Monitor getrennt wurde. Und das Terminal-Fenster überlebt in der Position, die Emacs eliminiert hat. Es scheint also, als ob die Anwendung etwas damit zu tun hat.
Akzeptierte Antwort:
Alle Fenster in den sichtbaren Bereich verschieben
Wie in einem Kommentar vorgeschlagen/angefordert, verschiebt das folgende Skript alle „normalen“ Fenster in den sichtbaren Bereich des aktuellen Arbeitsbereichs.
Die Lösung ist ein Workaround; die Bildschirminformationen werden korrekt aktualisiert, angesichts des Unterschieds in der Ausgabe von xrandr
, vor und nach dem Trennen. Der Grund, warum sich die Fenster nicht von selbst bewegen, ist (derzeit) unbekannt, es sei denn, eine andere Antwort löst das Problem.
Das Skript
#!/usr/bin/env python3
import subprocess
# get the resolution of the screen (+0+0)
res = [
int(n) for n in [
s.split("+")[0].split("x")\
for s in subprocess.check_output(["xrandr"]).decode("utf-8").split()\
if "+0+0" in s][0]
]
# create list of windows
w_list = [w.split() for w in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines()]
# filter only "normal" ones
valid = [
w for w in w_list if "_NET_WM_WINDOW_TYPE_NORMAL" in\
subprocess.check_output(["xprop", "-id", w[0]]).decode("utf-8")
]
# get the number of valid windows and calculate a targeted position
# the targeted position is a hunch, it will be exact if the window fits completely inside the resolution
# it will work anyway
parts = len(valid)+2
positions = [(int(n*res[0]/parts), int(n*res[1]/parts)) for n in list(range(parts))[1:-1]]
# unmaximaize, move the windows to the visible area (current workspace)
for i, w in enumerate(valid):
subprocess.Popen(["wmctrl", "-ir", w[0], "-b", "remove,maximized_vert,remove,maximized_horz"])
# weird, but sometimes wmctrl refuses to move a window if it is not resized first (?)
subprocess.Popen(["wmctrl", "-ir", w[0], "-e", "0,200,200,200,200"])
subprocess.Popen(["wmctrl", "-ir", w[0], "-e", (",").join(["0", str(positions[i][0]), str(positions[i][1]),w[4],w[5]])])
Verwendung
-
Das Skript benötigt
wmctrl
:sudo apt-get install wmctrl
-
Kopieren Sie das Skript in eine leere Datei und speichern Sie es als
move_windows.py
-
Probieren Sie es aus:Öffnen Sie mehrere Fenster, platzieren Sie sie auf verschiedenen Arbeitsbereichen usw. oder versuchen Sie, den zweiten Monitor zu trennen. Führen Sie dann den Befehl aus:
python3 /path/to/move_windows.py
Alle „normalen“ Fenster sollten in den sichtbaren Bereich des aktuellen Arbeitsbereichs verschoben werden.
-
Wenn alles funktioniert, fügen Sie es einer Tastenkombination hinzu:Wählen Sie:Systemeinstellungen> „Tastatur“> „Tastenkombinationen“> „Benutzerdefinierte Tastenkombinationen“. Klicken Sie auf das „+“ und fügen Sie den Befehl hinzu:
python3 /path/to/move_windows.py
Jetzt sollten Sie mit Ihrer Tastenkombination alle Fenster in den sichtbaren Bereich der aktuellen Arbeitsfläche verschieben können.
Verwandte:Kvm-Netzwerkbrücke zum Zuweisen einer statischen IP in Ubuntu?