Qué causa la desviación en el comando de movimiento de la ventana wmctrl

13

Sobre wmctrl

Con wmctrl(no instalado de forma predeterminada), podemos obtener información sobre ventanas, su identificación, su geometría, el pid al que pertenecen, etc. También podemos mover o cambiar el tamaño de las ventanas con varios comandos. Sin embargo, en algunos aspectos, su comportamiento no parece lógico. Mi pregunta es sobre mover ventanas por wmctrl:

Consiguiendo información

Cuando ejecuto el comando:

wmctrl -lG

Recibo (ao) la siguiente información sobre la ventana en las imágenes a continuación:

0x04200085  0 746  443  468  205  jacob-System-Product-Name Niet-opgeslagen document 1 - gedit

En la columna 3-5, la información de geometría nos dice las coordenadas x / y el ancho / alto.

Mover / redimensionar la ventana

Cuando pongo estas coordenadas en el wmctrlcomando para mover / cambiar el tamaño de una ventana, no debería hacer nada, ya que las coordenadas no cambian:

wmctrl -ir 0x04200085 -e 0,746,443,468,205

Desviación

Sin embargo, las imágenes a continuación muestran que la ventana se mueve hacia abajo (28 píxeles para ser precisos). Supuse que la razón era que el comando de wmctrl movimiento de la ventana se calculaba con el área de trabajo (pantalla menos la altura del panel), mientras que el wmctrl -lGcomando se calculaba con el tamaño total de la pantalla . Sin embargo, todavía 4px aún no se explican (el panel tiene 24px de altura).

Aunque la desviación se puede compensar muy bien en guiones, el hecho de que no entiendo la causa no es satisfactorio, por lo que la pregunta es:

¿Cuál es exactamente la causa de esta desviación?


Mover una ventana con las coordenadas exactas en la salida de wmctrl -lGno debe mover la ventana, pero sí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Jacob Vlijm
fuente
Mi solución "divertida" era guardar las coordenadas actuales, moverlas, obtener las nuevas coordenadas, restar las coordenadas guardadas para obtener las diferencias. Luego aplique las diferencias a las coordenadas originales y muévase a las coordenadas ajustadas. Es más fácil de lo que parece.
WinEunuuchs2Unix

Respuestas:

18

Lo que sucede es que wmctrl está devolviendo la geometría de la ventana dentro de las decoraciones (es decir, sin incluir la barra de título y los bordes) pero está utilizando la posición de ventana más grande para el movimiento.

(Se eliminaron algunas líneas de salida de comando: xdotoolpodría no estar instalado)

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x04000040
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

El siguiente comando solicita la ventana de interés y devuelve la ventana principal que incluye todas las decoraciones y varía según el tema de la ventana en uso.

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

Como puede ver, es una ventana diferente; la posición X comienza 2px a la izquierda (702-2) y el ancho total es mayor en 4px (900 + 2 + 2) porque el borde derecho también es 2px. Y es más alto (sobre el borde superior, si lo hay, y la barra de título); la altura es mayor debido a todo eso más el borde inferior.

wmctrl mueve la ventana principal a la posición deseada [X, Y] de la ventana secundaria; ancho y alto se aplican correctamente al niño, como se muestra en el "antes y después" a continuación.

$ wmctrl -lG
0x04000040  0 702  23   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 702,23 (screen: 0)
  Geometry: 900x950

$ wmctrl -ir 0x04000040 -e 0,702,23,900,950   # <----- "MOVE/RESIZE" *****

$ wmctrl -lG
0x04000040  0 704  46   900  950  KMatrix dave@KMatrix: test – Konsole

$ xdotool getwindowgeometry 0x18000ec   # (PARENT)
Window 25166060
  Position: 702,23 (screen: 0)    <----- Desired [X,Y] applied to parent
  Geometry: 904x977

$ xdotool getwindowgeometry 0x04000040  # (CHILD)
Window 67108928
  Position: 704,46 (screen: 0)
  Geometry: 900x950               <----- Desired [W,H] applied to child

Editar: información adicional.

Geometría de escritorio, ventana gráfica y área de trabajo

$ wmctrl -d    # (KDE)
0  * DG: 1680x1050  VP: 0,0  WA: 0,0 1680x1015  Desktop 1
$ xdotool -v
xdotool version 3.20140217.1

https://github.com/jordansissel/xdotool

Re: @Sneetsher consejo en comentarios

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
fuente
¡Esto parece una excelente respuesta! Examinaré sus detalles esta noche.
Jacob Vlijm
a mi entender, la salida de xdotool selectwindowes 25166060, pero ¿cuál es el paso para llegar 0x18000ec? Intenté la conversión de hexadecimal, pero parece que no es así.
Jacob Vlijm
La salida de xdotool getwindowgeometry 0x18000ecdevuelve el ID de la ventana decimal de 25166060 (padre). Acabo de ingresar el valor hexadecimal de 0x18000ec para mostrar que no era 0x04000040 (el niño). Por cierto, acabo de volver a ejecutar toda la prueba con números más fáciles con la esperanza de que no estuvieras mirando. Vea la revisión de edición anterior si estaba en medio de algo.
Daxx
2
@JacobVlijm, xpropparece mostrar relleno de decoración: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6y _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Puede ser útil verificar.
user.dz
¿Es posible que el xdotool selectwindowcomando se comporte de manera diferente en KDE y Unity? El resultado del xdotool selectwindowcomando se refiere exactamente a la misma ventana (-id) y (por lo tanto) xdotool getwindowgeometrygenera los mismos datos que wmctrl -lG. Sin xpropembargo, el comando, como lo sugiere @Sneetsher muestra _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0, que es exactamente lo que medí manualmente, y demuestra que la esencia de su respuesta es correcta, y es la respuesta perfecta a mi pregunta. Estoy impresionado por su minuciosidad. ¡Gracias!
Jacob Vlijm
0

Tuve el mismo problema y pude encontrar una solución.


Situación

Mi situación se basa en Mate 16.04 con Compiz instalado (que activa el administrador de ventanas gtk)

Estoy usando un script conectado a combinaciones de teclas para colocar ventanas en lugares predefinidos. Este script falla si no estoy usando la opción maximizada.


Análisis

El problema podría activarse y desactivarse activando y desactivando las decoraciones de las ventanas en la configuración (compiz).


Solución alterna

Las decoraciones de la ventana se pueden activar y desactivar usando Python para una ventana específica (usando las combinaciones de teclas es conveniente usar la ventana activa).

#!/usr/bin/python
from gtk.gdk import *
import gtk.gdk
import time
import sys

w = gtk.gdk.get_default_root_window().get_screen().get_active_window()
w.set_decorations(0) #use 1 to turn on decorations
window_process_all_updates()
gtk.gdk.flush()

Luego puede desactivar las decoraciones de ventanas, mover la ventana y activar las decoraciones de ventanas.

Sexto empírico
fuente