GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Wie kann ich das Offscreen-Fenster nach dem Trennen des zweiten Monitors wiederherstellen?

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

  1. Das Skript benötigt wmctrl :

    sudo apt-get install wmctrl
    
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es als move_windows.py

  3. 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.

  4. 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?
Ubuntu
  1. Wie listet man verbundene Monitore mit Xrandr auf?

  2. Wie öffnet man das Truecrypt-Fenster wieder, nachdem es geschlossen wurde?

  3. Wie nach dem Löschen des symbolischen Links libc.so.6 wiederherstellen?

  4. So stellen Sie eine Shell nach einer Verbindungsunterbrechung wieder her

  5. Wie kann ich verhindern, dass sich die MAC-Adresse nach dem Trennen ändert?

So stellen Sie gelöschte Daten auf einem Linux-System wieder her

So installieren Sie i3 auf Ubuntu

Wie deaktiviere ich das Ziehen von Alt+Klick-Fenstern?

Wie überwacht man die Festplattenaktivität?

Zweiter Monitor und Arbeitsbereiche?

Wie ändere ich die Deckkraft des Menüs?