He conectado una pantalla LCD a mi computadora portátil. Cuando intento abrir un archivo en Nautilus, la aplicación de destino se abre en la pantalla de mi computadora portátil, en lugar de en la segunda pantalla (en la que está abierta la ventana de Nautilus).
No quiero cambiar la visualización predeterminada. Quiero abrir ventanas en la pantalla en la que estoy trabajando. Si mi administrador de archivos está en la pantalla de la computadora portátil, quiero que las aplicaciones se abran en la pantalla de la computadora portátil. Si mi administrador de archivos está en una pantalla externa, espero abrir archivos allí.
La salida dexrandr
Screen 0: minimum 320 x 200, current 3286 x 1080, maximum 32767 x 32767
eDP1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 256mm x 144mm
1366x768 60.1*+
1360x768 59.8 60.0
1024x768 60.0
800x600 60.3 56.2
640x480 59.9
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected primary 1920x1080+1366+0 (normal left inverted right x axis y axis) 527mm x 296mm
1920x1080 60.0* 50.0 59.9
1920x1080i 60.1 50.0 60.0
1680x1050 59.9
1280x1024 75.0 60.0
1440x900 59.9
1280x960 60.0
1280x800 59.9
1152x864 75.0
1280x720 60.0 50.0 59.9
1440x576i 50.1
1024x768 75.1 70.1 60.0
1440x480i 60.1 60.1
832x624 74.6
800x600 72.2 75.0 60.3 56.2
720x576 50.0
720x480 60.0 59.9
640x480 75.0 72.8 66.7 60.0 59.9
720x400 70.1
DP1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
Respuesta1
El comportamiento que describe (abrir la ventana en la pantalla actual)deberíaserá el comportamiento predeterminado. En mi 14.04 es así.
Debido a incompatibilidades menores con algunas combinaciones de controlador de gráficos/GPU, en algunos casos pueden ocurrir "peculiaridades". Si no hay una opción "limpiar" disponible (corregir), puede utilizar la siguiente solución.
Existe un script en segundo plano, que busca que aparezcan nuevas ventanas. En caso de que exista una nueva ventana, el script compara la posición de la ventana con la posición actual del mouse. Si tanto el mouse como la nueva ventana no están en la misma pantalla, la ventana se mueve usando el xdotool
comando windowmove`.
¿Es un guión de fondo una mala idea?
Si no necesita un script en segundo plano, no lo use.
Al mismo tiempo: si añade funcionalidad importante y/o le ahorra tiempo, sería una tontería no hacerlo.siel guión está bien organizado y por lo tanto "tiene poco combustible".
Como referencia: tanto en mi laptop como en mi Desktop, ejecuto constantementeal menos5 scripts en segundo plano + ocasionalmente algunos adicionales para fines de prueba, sincualquieraviso.
Qué se hace para ahorrar combustible:
- El script tiene un ciclo de bucle variable.
Una vez cada 10 segundos, el script comprueba si la segunda pantalla está conectada. De lo contrario, el script omite todo el procedimiento de verificación de la ventana y vuelve a verificar después de 10 segundos. Esto significa que el guiónsoloactúa si se adjunta una segunda pantalla. Una vez conectada una segunda pantalla, en 10 segundos, el bucle cambia a un período de 2 segundos. - Todas las (siguientes) acciones que realiza el script son condicionales
por ejemplo, la posición del ratón essolocomprobadosihay ventanas nuevas, etc.
En total, en mi sistema no pude notarlo ni medirlo.cualquiercarga adicional, como resultado del script.
La secuencia de comandos
#!/usr/bin/env python3
import subprocess
import time
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def screen_limit():
screendata = [s for s in get("xrandr").split() if s.count("+") == 2]
if len(screendata) == 2:
return int([s.split("x")[0] for s in screendata if "+0+0" in s][0])
wd1 = get(["wmctrl", "-lG"])
t = 0
while True:
time.sleep(2)
# once per 10 seconds, check for a second screen
if t == 0:
while True:
rightside = screen_limit()
# if no second screen, skip the procedure
if rightside == None:
time.sleep(10)
else:
break
wd2 = get(["wmctrl", "-lG"])
# check for buggy wmctrl
if all([wd2 != None, wd1 != None]):
wins = [w.split() for w in wd2.splitlines()]
# check for new windows
relevant = [w for w in wins if not w[0] in wd1]
if relevant:
# if new windows appeared, see if they match the mouse pos
mousepos = int(get([
"xdotool", "getmouselocation"
]).split()[0].split(":")[1])
for w in relevant:
check = [mousepos < rightside, int(w[2]) < rightside]
if check[0] != check[1]:
# if mouse and window are not on the same screen > move
if check[0] == False:
cmd = ["xdotool", "windowmove", w[0],
str(int(w[2]) + rightside), w[3]]
else:
cmd = ["xdotool", "windowmove", w[0],
str(int(w[2]) - rightside), w[3]]
subprocess.Popen(cmd)
wd1 = wd2
t = 0 if t == 10 else t
t += 1
Cómo utilizar
El guión necesita ambos
wmctrl
yxdotool
. Ejecutar en una terminal:sudo apt-get install xdotool wmctrl
- Copie el script en un archivo vacío, guárdelo como
move_windows.py
Pruebe: ejecute el script con el comando:
python3 /path/to/move_windows.py
Si todo funciona como se esperaba, agréguelo a Aplicaciones de inicio: Tablero > Aplicaciones de inicio > Agregar. Agregue el comando:
/bin/bash -c "sleep 15 && python3 /path/to/move_windows.py"