Aqui está outra solução que adere ao modo 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]+) .*//p'
Mas tenha paciência comigo! Há alguma beleza oculta nele.
Em resumo,
- tem uma estrutura linear , em vez de uma estrutura de árvore, como uma em vez de duas dimensões
- usa mais sintaxe de shell bem conhecida .
- responde realmente à sua pergunta: localiza a janela.
(Se esses pontos são vantagens depende do contexto - vamos simplesmente ignorar este aspecto * .
Mostrarei o mesmo código em um layout mais estruturado abaixo, para facilitar o entendimento passo a passo.
Mas observe que o recuo é explicar o comando - ele não indica um aninhamento ou algo assim, tudo ainda é um pipeline UNIX linear.
O mesmo comando, apenas dividido depois dos tubos ( |
):
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO' getwindowgeometry |
sed -r -n 's/.*Position: ([-0-9,+x]+) .*//p'
O comando completo, como mostrado acima, fornece a localização de pixel da janela gvim
, retornando coordenadas de pixel relativas ao canto superior esquerdo da tela atual (possivelmente virtual) como x,y
, como 42,433
ou talvez -5375,-3809
quando está no primeiro de quatro por quatro telas virtuais, e o atual está em algum lugar no lado direito.
Por enquanto, vou encurtar o comando para encontrar apenas uma ID de janela X11 - talvez seja tudo o que realmente foi necessário para o OP, não tenho certeza:
O pipeline de comando encurtado, um comando shell separado em cada linha:
xdotool search --onlyvisible --class 'gvim' getwindowpid %@ |
xargs -I{} xdotool search --all --pid {} --name 'TODO'
Agora, ele começa a ser legível:
xdotool \
search --onlyvisible --class 'gvim' \
getwindowpid %@ |
xargs -I{} \
xdotool search --all --pid {} --name 'TODO'
O xdotool
command search
é usado para localizar janelas com a " classe " gvim
, deixando de fora algumas janelas "internas". O resultado é listado como PID
(identificadores de processo).
Para cada 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 terminar com \
e nenhum 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]+) .*//p'
A parte restante lista alguns detalhes sobre a janela, incluindo a posição. O comando sed
corresponde e retorna apenas o valor x,y
position.
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]+) .*//p'
-7653,-4732
*) Disclaimer: Eu prefiro o código do @ t7ko. Muito!