Comment déterminer si la fenêtre est agrandie ou minimisée à partir du script bash

11

J'ai un script bash qui déplace mes fenêtres de l'écran gauche à l'écran droit dans une configuration à double écran. Actuellement, la façon dont cela fonctionne est de parcourir les identifiants de fenêtre fournis par xdotool search --onlyvisible --maxdepth 2 --class "", puis de les déplacer vers la droite de la largeur de l'écran. Cela fonctionne déjà ... sauf si la fenêtre en question est agrandie ou minimisée.

Donc, ce qui est nécessaire, c'est un moyen de vérifier l'état actuel de la fenêtre. J'ai trouvé une réponse qui fournit le moyen d'ajouter et de supprimer ces bits, mais où est le moyen de vérifier s'ils sont déjà définis?

S'il n'est pas possible de le faire via xdotool , il devrait être possible de réutiliser l'identifiant de fenêtre fourni par la commande mentionnée ci-dessus.

v010dya
la source
vous pouvez également voir devilspielequel est conçu pour faire exactement ce genre de travail de fenêtre. Donc, pas besoin de recoder, il suffit de configurer
Ciprian Tomoiagă

Réponses:

11

Récupérer des informations sur l'état de la fenêtre

Vous pouvez obtenir les informations (et bien plus) à partir de la commande:

xprop -id <window_id>

Pour obtenir ce que vous recherchez spécifiquement:

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

La sortie ressemblera à:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

sur une fenêtre maximisée (h + v) et minimisée en même temps, ou tout simplement

_NET_WM_STATE(ATOM) =

(ou pas de sortie du tout) si ce n'est pas le cas.

plus amusant

Bien sûr, en utilisant différents langages, vous pouvez utiliser Wnck , comme dans l'extrait de code python ci-dessous. (extrait du shuffler de fenêtre ). L'extrait génère une liste, affichant le nom de la fenêtre + ou Truesoit False(minimisé).

#!/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 sortie ressemble à:

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

NB

  • xpropgérera à la fois les identifiants hexadécimaux (en sortie par exemple wmctrl) et décimaux (en sortie par exemple xdotool), par exemple soit utiliser:

    xprop -id 111371626
    

    ou

    xprop -id 0x06a3656a
    
  • Les méthodes ne fonctionneront pas sur Wayland!

Jacob Vlijm
la source
1
Excellente suggestion +1. En tant que commentaire, je l'ai essayé (sous Linux, X11) et j'ai obtenu des résultats légèrement différents. Lorsqu'une fenêtre n'est ni masquée ni agrandie, _NET_WM_STATE(ATOM)n'apparaît pas, comme indiqué dans la réponse, avec une valeur vide. Au lieu de cela, il n'est pas du tout dans la sortie.
John1024
@ John1024 Ah, merci! l'ajoutera à la réponse.
Jacob Vlijm
Sur mon système, il est affiché dans les deux cas, même lorsqu'il est vide.
v010dya
Je veux ajouter que l'identifiant de fenêtre peut être donné sous la forme d'un nombre décimal, donc pas besoin de le convertir en hexadécimal. Juste au cas où cela aiderait quelqu'un.
v010dya
@ v010dya Merci! Voir la réponse mise à jour.
Jacob Vlijm