xdotool: Como procurar por janela por título e classe com padrões diferentes (semelhante ao AutoHotkey)

7

O xdotool permite procurar janelas usando seu subcomando de pesquisa. Eu preciso localizar uma janela, que tenha classe 'gvim' e título contendo a palavra 'TODO'. Como faço isso?

O que eu tentei:

  • Você pode fazer xdotool search --name --class , mas aceitará apenas um padrão para nome e título.
  • O xdotool suporta o encadeamento de comandos, mas não consegui encontrar uma maneira de encadear duas chamadas de pesquisa - o segundo simplesmente substitui o primeiro.
por t7ko 12.01.2016 / 11:02

4 respostas

11

Minha ajuda do xdotool me informa que seus dois comutadores são os mesmos (versão xdotool 3.20150503.1),

--name          check regexp_pattern agains the window name
--title         DEPRECATED. Same as --name.

e, como tal, não faz nada. Meu xdotool faz o mesmo que o seu com a substituição da pilha de janelas, então eu fiz isso com um script de shell. Um script de shell fazendo o que você quer é entregue abaixo:

pids=$(xdotool search --class "gvim")
for pid in $pids; do
    name=$(xdotool getwindowname $pid)
    if [[ $name == *"TODO"* ]]; then
        #Do what you want, $pid is your sought for PID,
        #matching both class gvim and TODO in title
    fi
done

Os asteriscos na instrução if estão lá para fazer uma correspondência de substring para TODO , para que possa ocorrer em qualquer lugar no título.

    
por 12.01.2016 / 13:37
6

Consegui identificar soluções curtas e unix-way:

comm -12 \
  <(xdotool search --name  'title-pattern'  | sort) \
  <(xdotool search --class 'class-pattern'  | sort)
    
por 16.01.2016 / 00:09
3

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,

  1. tem uma estrutura linear , em vez de uma estrutura de árvore, como uma em vez de duas dimensões
  2. usa mais sintaxe de shell bem conhecida .
  3. 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!

    
por 28.08.2016 / 01:49
1

Resposta curta e elegante (que usa wmctrl ):

result=$(wmctrl -l | grep 'TODO - gvim' | grep -Eo '0x[0-9a-f]+')

O ID da janela resultante está em hexadecimal, então você precisa convertê-lo em decimal (usado por xdotool ):

printf "%d\n" $result

Então você pode fazer qualquer coisa com xdotool .

    
por 21.05.2018 / 09:34