Ottieni le dimensioni della finestra nella shell


18

Vorrei ottenere le dimensioni della finestra corrente da uno script di shell ...

Davvero non c'è molto altro da dire ... Preferirei usare wmctrl.

Risposte:


23
wmctrl -lG

Ti darà qualcosa come:

oli@bert:~$ wmctrl -lG
0x0384c0d5 -1 1590 1030 330  170  bert N/A
0x01200023 -1 0    0    3840 1200 bert x-nautilus-desktop
0x01000003 -1 3840 2352 1920 24   bert Bottom Expanded Edge Panel
0x01000028 -1 0    2352 1920 24   bert Bottom Expanded Edge Panel
0x0500003e  0 676  252  1404 1015 bert Chromium
0x02e00021  0 3860 160  1361 1084 bert Liferea
0x02000047  0 6650 940  506  683  bert Social broadcast messages
0x04600004  0 4546 460  1263 833  bert oli@bert: ~

Con questo puoi grepe cutscendere su questi in modo da rimanere con i valori della geometria (colonne 3-6).

Per citare la pagina man in modo da capire esattamente quali sono le colonne:

-l

Elencare le finestre gestite dal gestore delle finestre. Viene generata una riga per ogni finestra, con la linea suddivisa in colonne separate da spazio. La prima colonna contiene sempre l'identità della finestra come numero intero esadecimale e la seconda colonna contiene sempre il numero del desktop (un -1 viene utilizzato per identificare una finestra adesiva). Se viene specificata l'opzione -p, la colonna successiva conterrà il PID per la finestra come numero intero decimale. Se viene specificata l'opzione -G , seguiranno quattro colonne intere: offset x, offset y, larghezza e altezza. La colonna successiva contiene sempre il nome del computer client. Il resto della riga contiene il titolo della finestra (possibilmente con più spazi nel titolo).


Lo userò!
Allan,

1
Adoro il modo in cui il tuo computer si chiama bert :)
drnessie,

5

Credo che wmctrl non abbia alcuna opzione per trovare direttamente l'ID della finestra attiva .
Se qualcuno sa come farlo, mi interessa sapere ..
Detto questo, ecco un paio di script che stampano le dimensioni della finestra attiva.

Questo è: wmctrl + xdotool ... (non usando sed).

id=$(xdotool getactivewindow)
wmctrl -lpG | while read -a a; do w=${a[0]}; if (($((16#${w:2}))==id)) ; then echo -n "${a[5]} ${a[6]}"; break; fi; done

Questo è: xwininfo + xdotool + sed

xwininfo è parte di x11-utils

set $(xwininfo -id $(xdotool getactivewindow) \
|sed -n -e "s/^ \+Width: \([0-9]\+\).*/\1/p" \
        -e "s/^ \+Height: \([0-9]\+\).*/\1/p")
echo -n "$1 $2"

2

Usa xpropo xwininfo. Entrambi vengono per impostazione predefinita, non è necessaria l'installazione

Esempi di utilizzo:

Entrambi i comandi trasformano il cursore in quadrato / croce per consentire la selezione di una finestra particolare.

$ xprop _NET_WM_OPAQUE_REGION                                                          
_NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 984, 377


$ xwininfo | awk -F ':' '/Width/ || /Height/{print $2}'                         
 984
 377

In alternativa, si può specificare la finestra sulla riga di comando in forma XID

$ xprop _NET_WM_OPAQUE_REGION -id 83886090                                             
_NET_WM_OPAQUE_REGION(CARDINAL) = 0, 0, 984, 377

$ xwininfo -id 83886090 | awk -F ':' '/Width/ || /Height/{print $2}'            
 984
 377

Altri post in cui sono stati utilizzati

In particolare, xwininfoè stato attivamente utilizzato da me per gli script, come in queste domande di AskUbuntu:


Ha comune, aggiungere un esempio;)
AB

Li ha aggiunti dopo un anno;) Ma meglio tardi che mai, giusto?
Sergiy Kolodyazhnyy,

0

Gli script di Shell non conoscono o si preoccupano di Windows. Nella migliore delle ipotesi funzionano in un terminale (che può o non può essere visualizzato in una finestra). Se si desidera ottenere la larghezza e l'altezza del terminale in caratteri, utilizzare l'utilità stty.


2
Sicuramente uno script di shell potrebbe in qualche modo interrogare i client X per la loro geometria? Altrimenti come verrebbero scritte le app X?
djeikyb,

@djeikyb sono scritti come client X e comunicano con il server X. Gli script della shell vengono eseguiti in una shell, che potrebbe essere o meno in esecuzione in un ambiente che ha persino un server X e non dovrebbe interessare X.
psusi,

2
Comprensibilmente sì. Ma ci sono soluzioni alternative! Usando wmctrl, un pacchetto dal repository, puoi spostare, ridimensionare, ridurre al minimo e persino modificare l'area di lavoro!
drnessie,

Secondo la logica di @ psusi, gli ambienti desktop non dovrebbero esistere. Dopotutto, sono solo un'enorme raccolta di script che interagiscono con il software scritto per X.
andyn,

0

Ho scoperto tput colsdi funzionare abbastanza bene!


2
Grazie per il tuo contributo. Suggerisco di migliorare la tua risposta: spiega cosa fa, modifica il comando per ottenere anche il conteggio delle righe. Magari mostra come usare i risultati in uno script di shell. - Vedi le risposte più votate come esempi.
Guntbert,

In riferimento alla menzione di OP wmctrl, non stiamo parlando di console ma di finestre di ambiente grafico.
Andyn,

0

Ha 3 schermate, questo ha prodotto 3 righe con le dimensioni:

xrandr | grep '*' | cut -d'*' -f1 | cut -d ' ' -f4
/* OUTPUT *
* 3840x2160
* 1920x1080
* 1920x1080
***********/
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.