É possível recuperar o processo / título da janela ativa no Gnome?

28

Preciso de uma solução para obter as informações atuais da janela ativa (focada) em uma área de trabalho do Gnome 2. Estou interessado principalmente no processo que executa essa janela e o título da janela.

É possível?

SOLUÇÃO:

Obtendo o título da janela:

xwininfo -root -children | grep $(printf '%x\n' $(xdotool getwindowfocus)) | grep -oEi '"[^"]+"' | head -1

Obtendo o nome do processo:

ps -e | grep $(xdotool getwindowpid $(xdotool getwindowfocus)) | grep -v grep | awk '{print $4}'

ou:

cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm
Rogach
fonte

Respostas:

17

Você pode usar o xdotool , uma ferramenta versátil de automação de janelas X.

focused_window_id=$(xdotool getwindowfocus)
active_window_id=$(xdotool getactivewindow)
active_window_pid=$(xdotool getwindowpid "$active_window_id")

(Não sei qual é a diferença entre focado e ativo.)

(Eu pensei que o wmctrl poderia fazer isso, mas aparentemente não.)

Gilles 'SO- parar de ser mau'
fonte
26

É tão simples quanto isto:

xdotool getactivewindow getwindowname

Boa sorte espero que funcione para você!

Eric
fonte
Isso funciona, alguém pode explicar por que foi rebaixado?
Lfzawacki
8

Mais simples (IMO) do que a solução do OP (ou seja ps, sem grepe awk), para obter o nome do processo:

cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm

Ou se você deseja um fim de linha:

echo $(cat /proc/$(xdotool getwindowpid $(xdotool getwindowfocus))/comm)
Skippy le Grand Gourou
fonte
Sim, cat /proc/é bom (e sem dúvida mais rápido, pois não envolve saudar toda a pssaída). Eu o adicionei à solução no corpo da pergunta, para que futuros usuários possam encontrá-lo.
Rogach 6/07/2013
4

Tente o comando xwininfo, http://www.xfree86.org/4.2.0/xwininfo.1.html , ele definitivamente retorna o título da janela e, no que diz respeito ao processo, bem ...

X atribuiu um ID a ele e se tornou o PID pai da janela e também o ocultou por padrão, assumindo que o Gnome tem suporte a NET_WM_PID, como esse patch de 2001 indica, http://mail.gnome.org/ archives / gtk-devel-list / 2001-October / msg00238.html , podemos revisar este post, http://www.mail-archive.com/[email protected]/msg05809.html , onde o autor escreve um programa C curto para converter Window ID em PID, voila.

rhoyerboat
fonte
Mas parece que isso xwininfoexige que eu selecione manualmente a janela necessária. Eu esperava uma maneira de obter a janela focada do bash.
Rogach
Algo como em, `xwininfo -root -children | grep -oEi 'ID da janela: (? [0-9a-zA-Z] +) | grep -oEi '(? 0-9a-zA-Z)' - edit: meu dedo escorregou, meu regex para o ID da janela estava ruim. verificar este outro site para referência variando: davygoat.com/software/rizzle/How_it_works.html
rhoyerboat
Este comando fornece apenas o ID da janela "raiz" e não o ativo :(
Rogach
1

Eu sei que a pergunta é antiga, mas acho que xproptambém deve ser mencionada aqui. Está prontamente disponível no X. Pode ser usado de maneira interativa:

  1. digite xprope selecione a janela desejada usando o cursor do mouse e, em seguida,
  2. WM_NAMEdá o título da janela, _NET_WM_PIDdá o pid

Ou você pode dizer diretamente de xpropque janela precisa passando -idou -nameopção. Usando awkvocê pode obter o ID da janela ativa e passá-lo de volta para o xpropseguinte (extraído daqui ):

xprop -id $(xprop -root -f _NET_ACTIVE_WINDOW 0x " \$0\\n" _NET_ACTIVE_WINDOW | awk "{print \$2}")

Por fim, usando sua Ferramenta favorita ™ (por exemplo, grepou sed), você pode exibir os valores necessários. Por exemplo, para pida saída do comando acima pode ser canalizado para sed:sed -nE 's/^_NET_WM_PID.*= ([0-9]+)/\1/p'

jjj
fonte