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
-
Lo script necessita di
wmctrl
:sudo apt-get install wmctrl
-
Copia lo script in un file vuoto, salvalo come
move_windows.py
-
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.
-
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?