¿Cómo puedo abrir una ventana en un monitor diferente?

9

Con múltiples monitores, hasta ahora he estado arrastrando ventanas manualmente. ¿Hay alguna manera de abrir una ventana en una pantalla específica en una configuración de doble cabezal? (No debe confundirse con múltiples pantallas de servidor X).

Algo así como: SCREEN=2 firefoxo open-in-screen 2 firefox.

Si es importante, mi entorno es KDE usando el administrador de ventanas KWin. Las reglas de la ventana de KWin solo pueden coincidir con algunas propiedades como el título, pero no pude encontrar una variable de entorno como filtro.

La pantalla secundaria extiende la pantalla principal:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   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  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   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)
Lekensteyn
fuente
2
Por lo general, sugiero usar kstartpara esto, pero parece que kstartsolo admite la definición de un escritorio específico, pero no una pantalla en la que se debe iniciar la aplicación. Probablemente vale la pena un informe de errores de WISHLIST en bugs.kde.org .
Elias Probst
Gran consejo sobre kstart, también quería saber eso. El comando es: kstart --desktop $N firefoxdonde $Nhay un número entre 1 y el número total de escritorios virtuales .
Lekensteyn
En cuanto a kstart, también hay un informe de error en bugs.kde.org pidiendo esta función.
Elias Probst
Qué extraño, vi una publicación sobre wmctrl hoy, pero no tuve la oportunidad de probarla. ¿Por qué fue eliminado?
Lekensteyn
No tengo idea sobre la publicación de wmctrl, no la vi.
Elias Probst

Respuestas:

5

No, no puedes hacer eso directamente. En la arquitectura X, los dos monitores físicos que ve no son discernibles por las aplicaciones. Solo puede sortear esta abstracción, determinando qué áreas del espacio de trabajo visible corresponden a qué monitor y luego coloca las ventanas en el desplazamiento correcto.

Los kits de herramientas sensibles admiten una -geometryopción, que permite que su aplicación solicite que se coloque en una posición específica. Si no tiene esta opción disponible, puede usarla wmctrlsi tiene un X Window Manager compatible con EWMH / NetWM para mover y cambiar el tamaño de las ventanas ya existentes (consulte wmctrl (1), necesita opciones -ry -e). Utilizo devilspiepara forzar la colocación de algunas ventanas y, por supuesto, su administrador de ventanas de elección puede tener su propia facilidad para forzar la colocación de ventanas.

devilspiepermite aplicar ciertas acciones en X windows y puede usar las propiedades de X window para discernir diferentes ventanas y aplicaciones. La regla clave para ti sería geometry "<width>x<height>+<xoffset>+<yoffset>".

Sin embargo, siempre debe hacer los cálculos de cuándo y dónde comienza otro monitor físico. Pero esto no es demasiado difícil y xrandrle dice cómo y dónde usa los monitores en forma de "<width>x<height>+<xoffset>+<yoffset>cada línea con un nombre de salida.

No existe la manera infalible de que funcione, porque las implementaciones pueden (¡y lo hacen!) Variar. wmctrlgeneralmente funciona en el título de la ventana para identificar el objetivo. devilspieTambién puede referirse a su clase, sin embargo, no conozco ningún kit de herramientas que le permita especificar una clase X windows pero no su geometría.

Por supuesto, siempre puede iniciar dos xephyrinstancias y hacer que una llene su pantalla izquierda y la otra su pantalla derecha y luego aborde las pantallas a través de la DISPLAYvariable de entorno, pero esta solución tiene otras desventajas.

En teoría, la autoridad para gobernar la colocación de ventanas es el administrador de ventanas. En consecuencia, si quiere cosas que su administrador de ventanas no puede, será hacky y también es la razón por la cual no hay una forma genérica de lograr esto.

Sin embargo, si su caso de uso concreto es su emulador de Android ... que es muy diferente de pedir la opción para especificar SCREEN=n fooappen el shell, entonces devilspiepuede ser lo que está buscando. Sugerencia: descubrí que es mejor identificar las aplicaciones por su clase de ventana.

Bananguin
fuente
Gracias por explicar por qué esta no es una característica fácil. KWin también tiene reglas de ventana que fuerzan la colocación en una pantalla diferente (que es lo que uso ahora). Si bien no existe una función predeterminada SCREEN=x app, ¿es posible agregar una propiedad de ventana de esta manera para que KWin pueda filtrarla?
Lekensteyn
En teoría sí, pero no conozco ninguna solución existente para esto. Creo que no puede agregar propiedades, pero puede cambiar las propiedades existentes, por lo que simplemente podría agregar alguna cadena a la clase de ventana que kwin podría detectar.
Bananguin
Le otorgué la recompensa porque, de lo contrario, SE la otorgaría a la respuesta mejor votada, mientras que su respuesta describe mejor los problemas. Sin embargo, las respuestas actuales aún no son satisfactorias.
Lekensteyn el
4

Esta es una solución específica del administrador de ventanas. Así es como hacerlo con kwin, que es el administrador de ventanas predeterminado de KDE.

Si hace clic derecho en la barra de título de la aplicación y selecciona más configuraciones -> configuraciones especiales de la aplicación.

Vaya a la pestaña de coincidencia de ventana. Haga clic en el botón Detectar propiedades de la ventana. Luego, con el cursor del mouse, haga clic en la ventana principal de la aplicación. Seleccionará la clase de ventana, etc. y también obtendrá información de posicionamiento de ventana, etc.

Luego haga clic en la pestaña Tamaño y Posición. Haga clic en la Posición del cuadro y el Tamaño del cuadro y en el cuadro desplegable a la derecha de ambos y configúrelo para recordar.

Luego haz clic en Aceptar.

La próxima vez que ejecute la aplicación, debe ser del mismo tamaño y en el mismo monitor.

Lo uso en KDE para abrir mi terminal uRxvt en mi monitor izquierdo en una configuración de 3 monitores y funciona todo el tiempo.

Buena suerte.

rking
fuente
Así es como lo hago ahora, esperaba que hubiera una forma más directa de usar envvars.
Lekensteyn
Esta es la respuesta correcta para un usuario de KDE KWin.
iLikeDirt
3

Esto depende de cómo estén configurados sus monitores duales.

Si está utilizando XINERAMA para hacer que ambas pantallas se vean como una a X, entonces usaría la -geometryopción para solicitar que las aplicaciones aparezcan en una ubicación específica. Si tiene las pantallas configuradas como pantallas diferentes, entonces usará el DISPLAYpara lograr esto.

Pruébalo:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

Si sus monitores son pantallas 0 y 1, esto debería generar una xterm en cada monitor.

casey
fuente
2
Ya lo he intentado, pero esta configuración no se aplica a mí, una pantalla se coloca a la izquierda de otra. Actualizaré mi pregunta.
Lekensteyn
1
¿Has intentado usar la opción de geometría para aplicaciones que la admiten? Dar una coordenada x> 1600 debería posicionar la aplicación en el segundo espacio de monitores. También puede intentarlo fuera de kwin (solo para ver si funciona) como en mi experiencia kwin y -geometryno siempre funciona correctamente.
casey
Casey, la aplicación que estoy tratando de posicionar no es compatible con dicha opción (Android emulator, basado en QEMU). El programa se abre donde se encuentra el cursor de mi mouse.
Lekensteyn
2

Me llegó a través de este método que hace uso de xdotool, xprop, y wmctrl.

Esto es lo que hará el siguiente script:

  1. Encuentra la ventana activa
  2. Obtenga su estado maximizado y recuérdelo
  3. Eliminar maximización
  4. Consigue su geometría
  5. Calcule la nueva posición
  6. Muévelo
  7. Maximizar en función del estado anterior
  8. Levántalo
  9. Aquí hay un script que hace eso:

guión

Esto moverá la ventana activa al otro monitor. Solo puede manejar uno al lado del otro, también conocido como. horizontal, configuración de monitores.

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

Fuente: Xubuntu - mover ventanas entre monitores

slm
fuente
Esto solo funciona después de que se ha abierto una aplicación, no es realmente lo que estoy buscando (aunque probablemente se podría agregar una combinación de teclas para esto). Si no me equivoco, ¿esto siempre coloca una ventana al lado izquierdo de un monitor?
Lekensteyn
@Lekensteyn: sí, la intención de esta solución es iniciar appX y luego ejecutar este cmd para moverlo. No tengo monitores duales 8- (así que no tengo forma de probar esto, simplemente lo encontré y proporcioné los detalles aquí para que los evalúes. Es una opción y probablemente podría adaptarse, pero es una solución "en bruto" en su forma actual.
slm
@Lekensteyn - esta solución no es muy diferente de su SCREEN=2 appXconcepto, excepto que es appX; sleep 1; moveWindow.sh.
slm
@Lekensteyn: también he usado devilspie, xdotool, etc. para hacer exactamente las mismas cosas (dentro de una sola ventana), esta A complementa a la otra, ya que muestra los detalles, donde la otra solo explica los posibles enfoques, pero no muestra detalles de implementación reales.
slm
Será más como app & sleep 1; moveWindow.shque los programas no se separan. Sin embargo, no considero que esto sea una mejora sobre el uso de las reglas de ventana de KWin. +1 por tus esfuerzos.
Lekensteyn
0

Tuve un problema similar Encontramos lo siguiente:

  1. Haga clic derecho en la barra de título de la ventana y seleccione "Más acciones" -> "Configuración del Administrador de ventanas".
  2. Allí elija "Foco" en la columna a la izquierda.
  3. Alternar la opción "La pantalla activa sigue al mouse".

Si no se especifican otros valores predeterminados, las ventanas aparecen en la pantalla actualmente activa. Con el procedimiento descrito anteriormente, la posición del mouse define esta pantalla activa.

BiberBb
fuente
Correcto, pero esto no funciona si quiero mantener el cursor en la pantalla actual. Creo que esta es incluso la opción predeterminada, pero no todos los programas la respetan.
Lekensteyn