Come determinare se la finestra è ingrandita o minimizzata dallo script bash


11

Ho uno script bash che sposta le mie finestre dallo schermo sinistro allo schermo destro nella configurazione a doppio schermo. Attualmente il modo in cui funziona è passare in rassegna gli ID della finestra forniti da, xdotool search --onlyvisible --maxdepth 2 --class ""quindi spostarli a destra in base alla larghezza dello schermo. Funziona già ... a meno che la finestra in questione non sia ingrandita o minimizzata.

Quindi è necessario un modo per verificare lo stato corrente della finestra. Ho trovato una risposta che fornisce il modo di aggiungere e rimuovere quei bit, ma dov'è il modo di verificare se sono già impostati?

Se non è possibile farlo tramite xdotool , dovrebbe essere possibile riutilizzare l'id della finestra fornito dal comando sopra menzionato.


puoi anche vedere devilspiequale è progettato per fare esattamente questo tipo di lavoro con le finestre. Quindi non c'è bisogno di ricodificare, basta configurare
Ciprian Tomoiagă

Risposte:


11

Recupera informazioni sullo stato della finestra

Puoi ottenere le informazioni (e molto altro) dal comando:

xprop -id <window_id>

Per ottenere ciò che stai specificamente cercando:

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

L'output sarà simile a:

_NET_WM_STATE(ATOM) = _NET_WM_STATE_MAXIMIZED_HORZ, _NET_WM_STATE_MAXIMIZED_VERT, _NET_WM_STATE_HIDDEN

su una finestra che è ingrandita (h + v) e minimizzata allo stesso tempo, o semplicemente

_NET_WM_STATE(ATOM) =

(o nessun output) se nessuno di questi è il caso.

Più divertimento

Ovviamente, usando varie lingue, puoi usare Wnck , come nello snippet di Python di seguito. (frammento di window-shuffler ). Lo snippet genera un elenco che mostra il nome della finestra + o Trueo False(ridotto a icona).

#!/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())

L'output è simile a:

Wnck.Window - Classes - Wnck 3.0 - Mozilla Firefox , True
Postvak IN - vlijm@planet.nl - Mozilla Thunderbird , True
Showtime , False
settingsexample.vala - Visual Studio Code , False
*Niet-opgeslagen document 1 - gedit , False
desktop_weather , False
Tilix: Standaard , False

NB

  • xpropgestirà allo stesso modo sia gli esadecimali (come output di eg wmctrl) che i decimali (come output di eg xdotool), ad es.

    xprop -id 111371626
    

    o

    xprop -id 0x06a3656a
    
  • I metodi non funzioneranno su Wayland!


1
Ottimo suggerimento +1. Come commento, l'ho provato (sotto Linux, X11) e ho ottenuto risultati leggermente diversi. Quando una finestra non è né nascosta né ingrandita, _NET_WM_STATE(ATOM)non appare, come mostrato nella risposta, con un valore vuoto. Invece, non è affatto nell'output.
Giovanni 1024,

@ John1024 Ah, grazie! lo aggiungerà alla risposta.
Jacob Vlijm

Sul mio sistema viene mostrato in entrambi i casi, anche se vuoto.
v010dya,

Voglio aggiungere che l'ID della finestra può essere indicato come un numero cecimale, quindi non è necessario convertirlo in esadecimale. Nel caso in cui questo possa aiutare qualcuno.
v010dya,

@ v010dya Grazie! Vedi la risposta aggiornata.
Jacob Vlijm,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.