Cómo determinar si la ventana se maximiza o minimiza desde el script bash

11

Tengo un script bash que mueve mis ventanas de la pantalla izquierda a la pantalla derecha en la configuración de pantalla dual. Actualmente, la forma en que funciona es recorrer los identificadores de las ventanas que se proporcionan xdotool search --onlyvisible --maxdepth 2 --class ""y luego moverlos hacia la derecha por el ancho de la pantalla. Ya funciona ... a menos que la ventana en cuestión se maximice o minimice.

Entonces, lo que se necesita es una forma de verificar el estado actual de la ventana. He encontrado una respuesta que proporciona la forma de agregar y eliminar esos bits, pero ¿dónde está la forma de verificar si ya están configurados?

Si no es posible hacerlo a través de xdotool , debería ser posible reutilizar la identificación de ventana proporcionada por el comando mencionado anteriormente.

v010dya
fuente
También puede ver devilspiecuál está diseñado para hacer exactamente este tipo de trabajo de ventana. Así que no hay necesidad de recodificar, solo configure
Ciprian Tomoiagă

Respuestas:

11

Recuperar información sobre el estado de la ventana

Puede obtener la información (y mucho más) del comando:

xprop -id <window_id>

Para obtener lo que está buscando específicamente:

xprop -id 0x04c00010 | grep "_NET_WM_STATE(ATOM)"

La salida se verá así:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

en una ventana maximizada (h + v) y minimizada al mismo tiempo, o simplemente

_NET_WM_STATE(ATOM) =

(o sin salida) si ninguno de esos es el caso.

Más diversión

Por supuesto, usando varios idiomas, puede usar Wnck , como en el fragmento de Python a continuación. (fragmento de la ventana barajadora ). El fragmento genera una lista que muestra el nombre de la ventana + o Trueo False(minimizado).

#!/usr/bin/env python3
import gi
gi.require_version('Wnck', '3.0')
from gi.repository import Wnck


def get_winlist(scr=None, selecttype=None):
    """
    get the window list. possible args: screen, select_type, in case it is
    already fetched elsewhere. select type is optional, to fetch only
    specific window types.
    """
    if not scr:
        scr = Wnck.Screen.get_default()
        scr.force_update()
    windows = scr.get_windows()
    if selecttype:
        windows = [w for w in windows if check_windowtype(w, selecttype)]
    return windows

wlist = get_winlist()
for w in wlist:
    print(w.get_name(), ",", w.is_maximized())

La salida se ve así:

Wnck.Window - Classes - Wnck 3.0 - Mozilla Firefox , True
Postvak IN - [email protected] - Mozilla Thunderbird , True
Showtime , False
settingsexample.vala - Visual Studio Code , False
*Niet-opgeslagen document 1 - gedit , False
desktop_weather , False
Tilix: Standaard , False

nótese bien

  • xpropmanipularán tanto los identificadores hexadecimales (como salida de, por ejemplo wmctrl) y decimales (como salida de, por ejemplo xdotool), por ejemplo, o bien:

    xprop -id 111371626
    

    o

    xprop -id 0x06a3656a
    
  • ¡Los métodos no funcionarán en Wayland!

Jacob Vlijm
fuente
1
Excelente sugerencia +1. Como comentario, lo probé (bajo Linux, X11) y obtuve resultados ligeramente diferentes. Cuando una ventana no está oculta ni maximizada, _NET_WM_STATE(ATOM)no aparece, como se muestra en la respuesta, con un valor vacío. En cambio, no está en la salida en absoluto.
John1024
@ John1024 Ah, gracias! lo agregará a la respuesta.
Jacob Vlijm el
En mi sistema se muestra en cualquier caso, incluso cuando está vacío.
v010dya
Quiero agregar que la identificación de la ventana se puede dar como un número cecimal, por lo que no es necesario convertir a hexadecimal. Por si acaso esto ayudará a alguien.
v010dya
@ v010dya Gracias! Ver respuesta actualizada.
Jacob Vlijm