No encontré una configuración "secreta" para cambiar el comportamiento del comportamiento diseñado, como parece. En efecto, parece que se supone que la pantalla izquierda es la pantalla "base".
Sin embargo, es muy posible crear una solución alternativa, con esencialmente el mismo resultado. Puede crear una secuencia de comandos que, con ocasión de conectar una segunda pantalla, enumere todas las ventanas. Posteriormente, todas las ventanas que se mueven inicialmente a la pantalla izquierda, se desplazan de nuevo a la pantalla a la derecha, en un segundo o dos. Se conservará el tamaño de todas las ventanas.
Eso es lo que hace el siguiente script.
Dos versiones
Puede restaurar sus ventanas organizadas de dos maneras:
- Ocasionalmente, con una tecla de acceso directo para ejecutar después de que la segunda pantalla esté conectada.
- Automáticamente, ejecutando el script en segundo plano, esperando que se conecte su pantalla.
Cómo utilizar
preparativos
Instalar en pc wmctrl
sudo apt-get install wmctrl
Busque los nombres de sus dos pantallas con la ayuda de xrandr
, los nombres de las pantallas aparecerán justo antes de la palabra "conectado".
Copie Cualquiera de los siguientes scripts, en la sección de encabezado, reemplace en estas dos líneas los nombres de pantalla por los correctos:
screen_1 = "LVDS1" # your main screen (laptop)
screen_2 = "VGA1" # secundary screen (on the left)
guardar el guión como move_windows.py
Asegúrese de que en la configuración de pantalla su pantalla secundaria esté a la izquierda. Las líneas superiores de las dos pantallas deben estar alineadas (como en la primera imagen de su pregunta).
Ejecute el script
: si usa el que se ejecuta ocasionalmente, ejecútelo después de que su segunda pantalla esté conectada.
python3 /path/to/move_windows.py
Es posible que desee agregarlo a un método abreviado de teclado si cree que hace lo que debería hacer. Elija: Configuración del sistema> "Teclado"> "Métodos abreviados"> "Métodos abreviados personalizados". Haga clic en "+" y agregue el comando:
Si usa el que se ejecuta en segundo plano, también ejecútelo con el comando:
python3 /path/to/move_windows.py
Si funciona como se esperaba, agréguelo a sus aplicaciones de inicio: Tablero> Aplicaciones de inicio> Agregar
Probé el script con mi computadora portátil (a la derecha) y dos pantallas diferentes (a la izquierda). El resultado fue el mismo.
pantalla de portátil
conectando sin script
conectando con el script en ejecución
Después de que el script hizo su trabajo, las ventanas se "dejarán solas" (por supuesto), y puede organizar sus ventanas a su manera.
El guion (es)
1. Versión "manual", para ejecutar después de conectar la pantalla
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
shift_windows(get_shift(get("xrandr")))
2. Versión automática, para ejecutar en segundo plano.
#!/usr/bin/env python3
import subprocess
import time
#--
screen_2 = "LVDS1" # replace with your internal screen (right)
screen_2 = "VGA1" # replace with your external screen (left)
#--
def get(cmd):
return subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
def get_shift(xr_output):
lines = [l for l in xr_output.splitlines() if " connected" in l][0].split()
return int([it for it in lines if "x" in it][0].split("x")[0])
def shift_windows(shift):
w_data = [l.split() for l in get("wmctrl -lG").splitlines()]
relevant = []
for w in w_data:
props = get("xprop -id "+w[0])
if (int(w[2]) < shift, "_TYPE_NORMAL" in props, "TYPE_DIALOG" in props).count(True) == 2:
command = "wmctrl -ir "+w[0]+" -e 0,"+(",").join([str(int(w[2])+shift), w[3], w[4], w[5]])
subprocess.Popen(["/bin/bash", "-c", command])
while True:
try:
screen_info1 = get("xrandr")
time.sleep(5)
screen_info2 = get("xrandr")
check = screen_2+" connected"
if (check in screen_info1, check in screen_info2) == (False, True):
time.sleep(5)
shift_windows(get_shift(screen_info2))
except:
pass