Detectando a janela atualmente ativa

52

A ferramenta de linha de comando do linux wmctrlpermite listar todas as janelas ou todos os desktops, entre outras coisas. No modo de listagem da área de trabalho, a área de trabalho atual é marcada com um asterisco.

Preciso de uma ferramenta que possa descobrir o título da janela atualmente ativa. Infelizmente, wmctrlnão tem um ajudante que faça isso - apesar de saber qual janela está ativa no momento (consulte o :ACTIVE:marcador).

Existe outra ferramenta de linha de comando que pode me fornecer o ID da janela e / ou o título da janela atual?

Dave Vogt
fonte

Respostas:

56

Instale xdotoole execute

xdotool getwindowfocus getwindowname

Dará, por exemplo, para a página atual aberta no Firefox:

linux - Detecting currently active window - Super User - Mozilla Firefox
Skippy le Grand Gourou
fonte
Ferramenta poderosa! Além de obter a janela ativa atual, também possui muitas outras funcionalidades úteis.
quer
Comparado à resposta de Jim Paris, isso tem a desvantagem de uma dependência de instalação, mas parece correr mais rápido, principalmente se o xdotool já estiver no cache do disco.
Mc0e
1
Se você deseja manipular a janela atual com wmctrl, você pode fazer :, wmctrl -i -r `xdotool getwindowfocus` -e 0,10,10,-1,-1onde -idiz ao wmctrl que espere o ID da janela em vez do título da janela.
precisa saber é
34

Isso é mais direto e usa apenas xprope cut:

xprop -id $(xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW | cut -f 2) _NET_WM_NAME

Esses comandos são apenas uma extração de propriedades da janela raiz e da janela do aplicativo, mas conforme a solicitação de Lorenzo von Matterhorn:

  • Primeiro,

    xprop -root 32x '\t$0' _NET_ACTIVE_WINDOW
    

    Extrai a _NET_ACTIVE_WINDOWpropriedade da raiz, que fornece o XID da janela ativa. O 32x '\t$0'diz xproppara formatar a saída de uma maneira que cutpossa ser analisada facilmente mais tarde.

  • Em seguida, extraia apenas o XID da saída com cut -f 2

  • Em seguida, passe o XID como parâmetro para

    xprop -id XID _NET_WM_NAME
    

Que imprime o nome dessa janela.

Jim Paris
fonte
1
oi lá, você pode explicar os argumentos e um pouco da sintaxe? pode ser útil para o controle de qualidade e futuros leitores.
Lorenzo Von Matterhorn
9

Existe, mas nenhuma resposta ou solução curta.

$ wmctrl -lp | grep $(xprop -root | grep _NET_ACTIVE_WINDOW | head -1 | \
    awk '{print $5}' | sed 's/,//' | sed 's/^0x/0x0/')

resultado:

0x03800004  0 16459  xxxxxxxxxx /bin/bash

Em uso:

$ for x in $(seq 1 10); do sleep 5; wmctrl -lp | grep $(xprop -root | \
    grep _NET_ACTIVE_WINDOW | head -1 | awk '{print $5}' | sed 's/,//' | \
    sed 's/^0x/0x0/'); done

0x03800004  0 16459  xxxxxxxxxx /bin/bash
0x020000a4  0 13524  xxxxxxxxxx linux - Detecting currently active window - Super User - Mozilla Firefox (Build 20120129142219)
tao
fonte
1
Parece uma boa solução, não sabia sobre o utilitário xprop. Enquanto isso, corrigi o wmctrl para fornecer essa opção e a enviei ao autor. Infelizmente, ainda não recebi uma resposta.
Dave Vogt
1
+1 para a eficácia e "simplicidade" no código
Lorenzo Von Matterhorn
5

Isto é o que funcionou para mim:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME

Dá:

WM_NAME(STRING) = "~"

Então, talvez você faça um pouco de feiúra para obter o nome por si só:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | sed -e 's/.*"\(.*\)".*/\1/'

Dá:

~

Qual é o meu nome de janela atualmente focado, por si só.

Ou, evite o sed com o menos feio:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | awk -F '"' '{print $2}'

Greg Bell
fonte
1
Ou desde corte laready foi introduzido, você poderia usar isso de novo:xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | cut -d '"' -f 2
mc0e
3

Relativamente curto e lida com nomes de janelas que contêm aspas corretamente:

xprop -id $(xprop -root _NET_ACTIVE_WINDOW | cut -d ' ' -f 5) WM_NAME | 
sed -nr 's/.*= "(.*)"$/\1/p'
Ton van den Heuvel
fonte