Uso Ubuntu 14.04 en mi computadora portátil en mi escritorio con un segundo monitor. Cuando me desconecto del segundo monitor, sin fallar, mi ventana de Emacs sale de la pantalla.
Puedo presionar Alt-TAB para hacer que Emacs sea la ventana activa y, trabajando a ciegas, detengo Emacs para poder reiniciarlo, lo que hace que vuelva a aparecer en la pantalla. Pero, me parece que debería haber una forma en Ubuntu de volver a poner una ventana fuera de la pantalla en la pantalla. ¿Hay?
Por supuesto, una mejor solución sería evitar que las ventanas se salgan de la pantalla en respuesta a la desconexión del monitor, y aceptaría una solución para eso problema.
ACTUALIZACIÓN:
La salida de xrandr
mientras está conectado a un segundo 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)
La salida de xrandr
después de desconectarse del segundo 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)
Además, intenté intercambiar las posiciones izquierda-derecha de mi ventana de Terminal y mi ventana de Emacs y luego desconectarme. Esto permite que la ventana de Emacs permanezca en la pantalla después de desconectarse del segundo monitor. Y la ventana de Terminal sobrevive en la posición que eliminó Emacs. Entonces, parece que la aplicación tiene algo que ver con esto.
Respuesta aceptada:
Mover todas las ventanas al área visible
Como se propuso/solicitó en un comentario, el siguiente script moverá todas las ventanas "normales" al área visible en el espacio de trabajo actual.
La solución es una solución alternativa; la información de la pantalla se actualiza correctamente, dada la diferencia en la salida de xrandr
, antes y después de la desconexión. La razón por la cual las ventanas no se mueven solas es (actualmente) desconocida, a menos que otra respuesta resuelva el problema.
El guión
#!/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]])])
Cómo usar
-
El script necesita
wmctrl
:sudo apt-get install wmctrl
-
Copie el script en un archivo vacío, guárdelo como
move_windows.py
-
Pruébelo:abra varias ventanas, colóquelas en diferentes espacios de trabajo, etc., o intente desconectar el segundo monitor. Luego ejecute el comando:
python3 /path/to/move_windows.py
Todas las ventanas "normales" deberían moverse al área visible del espacio de trabajo actual.
-
Si todo funciona bien, agréguelo a una tecla de acceso directo:seleccione:Configuración del sistema> "Teclado"> "Accesos directos"> "Accesos directos personalizados". Haga clic en "+" y agregue el comando:
python3 /path/to/move_windows.py
Ahora debería poder mover todas las ventanas al área visible en el espacio de trabajo actual, con su tecla de método abreviado.
Relacionado:¿Kvm Network Bridge para asignar IP estática en Ubuntu?