GNU/Linux >> Linux Esercitazione >  >> Ubuntu

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

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

Posso fare Alt-TAB per rendere Emacs la finestra attiva e, lavorando alla cieca, fermare Emacs in modo da poterlo riavviare, il che lo fa riapparire sullo schermo. Ma mi sembra che ci dovrebbe essere un modo in Ubuntu per riportare sullo schermo una finestra fuori 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 per quello problema.

AGGIORNAMENTO:

L'output di xrandr mentre è collegato 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 Terminale e della mia finestra Emacs e quindi 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.

Risposta accettata:

Sposta tutte le finestre nell'area visibile

Come proposto/richiesto in un commento, lo script sottostante sposterà tutte le finestre "normali" nell'area visibile dell'area di lavoro corrente.

La soluzione è una soluzione alternativa; le informazioni sullo schermo sono 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 non risolva il problema.

Il copione

#!/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 si usa

  1. Lo script necessita di wmctrl :

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

  3. Provalo:apri un certo numero di finestre, posizionale su spazi di lavoro diversi, ecc., oppure prova a disconnettere il secondo monitor. Quindi esegui il comando:

    python3 /path/to/move_windows.py
    

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

  4. Se tutto funziona correttamente, aggiungilo a un tasto di scelta rapida:scegli:Impostazioni di sistema> "Tastiera"> "Scorciatoie"> "Scorciatoie personalizzate". Fare clic sul "+" e aggiungere il comando:

    python3 /path/to/move_windows.py
    

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

Correlati:Kvm Network Bridge per assegnare un IP statico in Ubuntu?
Ubuntu
  1. Come recuperare i dati Xfs dopo Rm?

  2. Come elencare i monitor collegati con Xrandr?

  3. Come disabilitare il monitoraggio della configurazione automatica?

  4. Due schermi X, come ottenere un gestore di finestre sul secondo schermo?

  5. Come risolvere l'ibernazione?

Come recuperare i dati cancellati su un sistema Linux

Come installare i3 su Ubuntu

Come disabilitare il trascinamento della finestra Alt + clic?

Come monitorare l'attività del disco?

Secondo monitor e spazi di lavoro?

Come modificare l'opacità del menu?