Ecco un'altra soluzione che aderisce al modo UNIX!
A prima vista, non è bello come il tuo, @ t7ko:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Ma abbi pazienza! C'è un po 'di bellezza nascosta in esso.
Insomma
- ha una struttura lineare , anziché una struttura ad albero, come una anziché due dimensioni
- utilizza una sintassi della shell più nota .
- in realtà risponde alla tua domanda: individua la finestra.
(Se questi punti sono vantaggi dipende dal contesto - ignoriamo questo aspetto * .)
Mostrerò lo stesso codice in un layout più strutturato di seguito, per facilitare la comprensione passo dopo passo.
Ma si noti che il rientro serve a spiegare il comando: non indica l'annidamento o giù di lì, tutto è ancora una pipeline UNIX lineare.
Lo stesso comando, appena diviso dopo le pipe ( |
):
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
Il comando completo, come mostrato sopra, fornisce la posizione dei pixel della gvim
finestra, restituendo le coordinate dei pixel relative all'angolo in alto a sinistra della schermata corrente (possibilmente virtuale) come x,y
, come 42,433
, o forse -5375,-3809
quando si trova sulla prima delle quattro schermate virtuali quattro e quello attuale è da qualche parte in basso sul lato destro.
Per ora, accorcerò il comando per trovare solo un ID finestra X11 - forse è tutto ciò che era effettivamente necessario dall'OP, non sono sicuro:
Pipeline di comandi abbreviata, un comando shell separato su ogni riga:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Ora inizia a essere leggibile:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
Il xdotool
comando search
viene utilizzato per trovare finestre con la " classe " gvim
, tralasciando alcune finestre "interne". Il risultato è elencato come PID
'(identificatori di processo).
Per ciascuno PID
, ne xargs
esegue un altro xdotool search
, controllando il "nome" per il nostro modello di esempio TODO
- dopo aver verificato il PID
.
(Per ogni evenienza: le linee che finiscono in \
- chiamate linee di continuazione - devono effettivamente terminare con lo \
spazio vuoto e senza prima della nuova riga.)
Ora torniamo al comando originale:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool \
search --all --pid {} --name 'TODO' \
getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
La parte rimanente elenca alcuni dettagli sulla finestra, inclusa la posizione. Il sed
comando corrisponde e restituisce solo il x,y
valore della posizione.
Ad esempio, eseguendo il comando in alto sul mio 16 ° schermo virtuale (di 4 per 4), con un "TODO" gvim
sullo schermo 1:
$ xdotool search --onlyvisible --class 'gvim' getwindowpid %@ | xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry | sed -r -n 's/.*Position: ([-0-9,+x]+) .*/\1/p'
-7653,-4732
*) Disclaimer: preferisco il codice di @ t7ko. Un sacco!
xdotool
fa schifo ... questa è un'operazione così semplice e non c'è modo di farlo elegantemente.