web-dev-qa-db-pt.com

Comando Bash para focar uma janela específica

Existe uma maneira, no bash linha de comando, para dar foco a uma janela específica de um processo em execução. Suponha que eu saiba o nome, 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á alguma outra janela em cima dela). Eu preciso de um comando bash que traz e dá foco à janela do Firefox, tornando a janela ativa.

48
Malabarba

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

wmctrl -l 

Lista janelas abertas no momento (incluindo os painéis do gnome).

wmctrl -a STRING

Dá foco a uma janela contendo STRING em seu título. Não tenho certeza do que acontece se mais de uma janela atender a essa condição.
No meu caso, o comando era:

wmctrl -a Firefox
76
Malabarba

Usando wmctrl em combinação com xdotool, você pode alternar o foco para o Firefox e, em seguida, realizar 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. Concentre-se na primeira janela do Firefox correspondente
  2. Abra uma nova guia do navegador
  3. Coloca o foco na barra de endereços
  4. Digite "google"
  5. Tabulação para o primeiro resultado de preenchimento automático do navegador
  6. Pressione a tecla Return (ou Enter)
8
Christopher

Como é o script abaixo que eu uso no meu pc do 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

Eu estou usando isso depois de atribuí-lo no atalho personalizado de teclado. ctrl + 1, ctrl + 2, ...

gato 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
4
swj