Come recuperare la finestra fuori schermo dopo aver disconnesso il secondo monitor?

7

Uso Ubuntu 14.04 sul mio portatile alla mia scrivania con un secondo monitor. Quando mi disconnetto dal secondo monitor --- senza errori --- la mia finestra per Emacs si sposta fuori dallo schermo.

Posso usare Alt-TAB per rendere Emacs la finestra attiva, e, lavorando ciecamente, fermare Emacs in modo che possa riavviarlo, il che fa sì che riappaia sullo schermo. Ma, mi sembra che ci dovrebbe essere un modo in Ubuntu per ottenere una finestra off-screen sullo schermo. C'è?

Ovviamente, una soluzione migliore sarebbe impedire che le finestre vadano fuori dallo schermo in risposta alla disconnessione del monitor, e accetterei una soluzione al problema che .

UPDATE:

L'output di xrandr durante la connessione a un secondo 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)

L'output di xrandr dopo la disconnessione dal secondo 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)

Inoltre, ho provato a scambiare le posizioni sinistra-destra della mia finestra di Terminale e della mia finestra di Emacs e poi di disconnettermi. Ciò consente alla finestra di Emacs di rimanere sullo schermo dopo la disconnessione dal secondo monitor. E la finestra del Terminale sopravvive nella posizione che ha eliminato Emacs. Quindi, sembra che l'applicazione abbia qualcosa a che fare con questo.

    
posta David Charles 25.08.2015 - 18:43

1 risposta

6

Sposta tutte le finestre nell'area visibile

Come proposto / richiesto in un commento, lo script seguente sposta tutte le finestre "normali" nell'area visibile nell'area di lavoro corrente.

La soluzione è una soluzione alternativa; le informazioni sulla schermata vengono aggiornate correttamente, data la differenza nell'output di xrandr , prima e dopo la disconnessione. Il motivo per cui le finestre non si muovono da sole è (attualmente) sconosciuto, a meno che un'altra risposta risolva il problema.

Lo script

#!/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]])])

Come usare

  1. Lo script richiede wmctrl :

    sudo apt-get install wmctrl
    
  2. Copia lo script in un file vuoto, sicuro come move_windows.py

  3. Prova: esegui un certo numero di finestre, posizionale su diversi spazi di lavoro ecc. o prova a scollegare il secondo monitor. Quindi esegui il comando:

    python3 /path/to/move_windows.py
    

    Tutte le finestre "normali" dovrebbero spostarsi nell'area visibile dello spazio di lavoro corrente.

  4. Se tutto funziona correttamente, aggiungilo a un tasto di scelta rapida: scegli: Impostazioni di sistema & gt; "Tastiera" & gt; "Scorciatoie" & gt; "Scorciatoie personalizzate". Fai clic su "+" e aggiungi il comando:

    python3 /path/to/move_windows.py
    

Ora dovresti essere in grado di spostare tutte le finestre nell'area visibile nell'area di lavoro corrente, con il tuo tasto di scelta rapida.

    
risposta data Jacob Vlijm 26.08.2015 - 08:12

Leggi altre domande sui tag