Comando Bash para focar uma janela específica

50

Existe uma maneira, na linha de comando do bash, de dar foco a uma janela específica de um processo em execução. Suponha que eu saiba o nome do processo, número e qualquer outra coisa que eu precise.

Por exemplo, se eu tenho uma única instância do Firefox em execução, mas é minimizada (ou há outra janela em cima). Eu preciso de um comando bash que traga e concentre a janela do Firefox, tornando-a a janela ativa.

Malabarba
fonte

Respostas:

78

O comando wmctrl parece fazer o trabalho. Ele já foi instalado para mim, mas está disponível nos repositórios, caso alguém precise.

wmctrl -l 

Lista as janelas atualmente abertas (incluindo os painéis gnome).

wmctrl -a STRING

Dá foco a uma janela que contém STRING no título. Não sei o que acontece se mais de uma janela atender a essa condição.
No meu caso, o comando foi:

wmctrl -a Firefox
Malabarba
fonte
6
É bom ver que alguém está lendo e não estou apenas divagando para mim mesma. =)
Malabarba
1
Tente também o xdotool .
Andres Riofrio
Isso é incrível para definir o foco de volta ao gdb (depurador) quando ele lança um destino do depurador com uma janela que rouba o foco, como o kvm. Use o comando gdb shell wmctrl -a something, onde algo está no título do terminal do depurador.
doug65536
Muito obrigado, isso é ouro puro, eu tinha medo de perder todo o meu trabalho pendente em alguma janela do Chrome que simplesmente desapareceu no fundo de alguma forma, funcionou!
Osmar
9

Usando wmctrlem conjunto, xdotoolvocê pode mudar o foco para o Firefox e executar ações de teclado ou mouse.

Neste exemplo:

wmctrl -R firefox && \
  xdotool key --clearmodifiers ctrl+t ctrl+l && \
  xdotool type --delay=250 google && \
  xdotool key --clearmodifiers Tab Return

Os seguintes passos são executados:

  1. Dê foco à primeira janela correspondente do Firefox
  2. Abra uma nova guia do navegador
  3. Coloca o foco na barra de endereço
  4. Digite "google"
  5. Guia para o primeiro resultado de preenchimento automático do navegador
  6. Pressione a tecla Return (ou Enter)
Christopher
fonte
4

Como é o script abaixo que eu uso no meu pc ubuntu? caso de uso é assim.

   $ ./focus_win.sh 1            # focus on a application window that executed at first
   $ ./focus_win.sh 2            # second executed application window

Estou usando depois de atribuí-lo no atalho personalizado do teclado. ctrl + 1, ctrl + 2, ...

cat focus_win.sh

#! /bin/sh

if [ "" = "$1" ] ; then
    echo "usage $0 <win index>"
    exit 1;
fi

WIN_ID=`wmctrl -l | cut -d ' ' -f1 | head -n $1 | tail -n 1`

if [ "" = "$WIN_ID" ] ; then
    echo "fail to get win id of index $1"
    exit 1;
fi
wmctrl -i -a $WIN_ID
swj
fonte