Aqui está outra solução aderente à maneira UNIX!
À primeira vista, não é tão bonito quanto o seu, @ 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'
Mas tenha paciência comigo! Há alguma beleza escondida nele.
Em suma,
- tem uma estrutura linear , em vez de uma estrutura em árvore, como uma em vez de duas dimensões
- usa sintaxe de shell mais conhecida .
- realmente responde à sua pergunta: ele localiza a janela.
(Se esses pontos são vantagens depende do contexto - vamos ignorar esse aspecto * .)
Mostrarei o mesmo código em um layout mais estruturado abaixo, para facilitar o entendimento passo a passo.
Mas observe que o recuo é para explicar o comando - ele não indica aninhamento, então tudo ainda é um pipeline UNIX linear.
O mesmo comando, basta dividir após os pipes ( |
):
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'
O comando completo, como mostrado acima, fornece a localização do pixel da gvim
janela, retornando as coordenadas do pixel em relação ao canto superior esquerdo da tela atual (possivelmente virtual) como x,y
, tipo 42,433
, ou talvez -5375,-3809
quando ele está na primeira das quatro por quatro telas virtuais , e a atual está em algum lugar do lado direito.
Por enquanto, reduzirei o comando para encontrar apenas um ID da janela X11 - talvez seja tudo o que realmente era necessário pelo OP, não tenho certeza:
O pipeline de comando reduzido, um comando shell separado em cada linha:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Agora, começa a ser legível:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
O xdotool
comando search
é usado para encontrar janelas com a " classe " gvim
, deixando de fora algumas janelas "internas". O resultado é listado como PID
's (identificadores de processo).
Para cada um PID
, xargs
executa outro xdotool search
, verificando o "nome" do nosso padrão de exemplo TODO
- depois de verificar o PID
.
(Apenas no caso: as linhas que terminam em \
- chamadas linhas de continuação - precisam realmente terminar com o \
espaço em branco antes da nova linha).
Agora, de volta ao comando original:
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'
A parte restante lista alguns detalhes sobre a janela, incluindo a posição. O sed
comando corresponde e retorna apenas o x,y
valor da posição.
Como exemplo, executando o comando na parte superior da minha 16ª tela virtual (de 4 por 4), com um "TODO" gvim
na tela 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
*) Isenção de responsabilidade: prefiro o código da @ t7ko. Muito!
xdotool
é uma merda ... esta é uma operação tão simples e não há como fazê-lo com elegância.