Executar script quando foca/desfoca um app

Contextualizando:
Tenho uma mesa digitalizadora da Huion com 6 botões, criei um script para alguns programas que uso, constando um conjunto de atalhos para cada botão da mesa e gostaria de executar o script quando foco no aplicativo.

Exemplo: Quando focar na tela do Gimp, executar o script com os atalhos do GImp;
Quando focar na tela do Libresprite, executar o script com os atalhos do Libresprite;
Quando nenhum deles estão com foco, executar o script com atalhos para o Desktop.

Resumindo, quero fazer como os programas de drivers do windows, que permitem que consiga setar conjunto de atalhos para cada programa e como não encontrei um aplicativo similar para o linux, queria fazer através de scripts (mas não tenho conhecimento ainda para isso e não encontrei solução em pesquisas na internet)

Agradeço desde já

Você pode usar comando xdotool getactivewindow getwindowclassname dentro de seja qual for o script que está utilizando aí para obter o nome do programa focado, e a partir disso construir uma condição.

#!/bin/sh
case "$(xdotool getactivewindow getwindowclassname)" in
(GIMP)
  coisas_do_gimp
;;
(Libresprite)
  coisas_do_libresprite
;;
(*)
  coisas_de_nenhum_dos_dois
;;
esac

Note que eu não garanto que os nomes aí estão certos (até mesmo maiúsculas e minúsculas afetam).

Uma maneira de verificar os nomes seria rodar sleep 5 && xdotool getactivewindow getwindowclassname dentro de um terminal para esperar 5 segundos (sleep 5) e em seguida (&&) emitir o nome da janela ativa (xdotool getactivewindow getwindowclassname). Nesse intervalo de 5 segundos, você ia focar na janela cujo nome quer descobrir.

2 curtidas

@Capezotte era isso mesmo!
O único ponto é que o getwindowclassname não funciona. O getwindowname funciona no lugar (Não sei se estou em uma versão mais nova ou mais antiga do xdotool).

Acrescentei também um “*” antes do nome do programa, pois como a janela altera para o nome do arquivo em uso, não executou corretamente (assim como você pontuou).

Coloquei também os comandos dentro de um while para sempre ficar rodando o script. Tenho 99,99% de certeza que fiz da maneira errada, mas não matei meu sistema ainda, então está tranquilo rs.

o script para meu uso ficou assim

#!/bin/sh
while [ true ]
do
  case "$(xdotool getactivewindow getwindowname)" in
  (*"GIMP")
    sh /home/maycon/.config/scripts/gimp.sh
  ;;
  
  (*"LibreSprite v1.0")
    sh /home/maycon/.config/scripts/libresprite.sh
  ;;
  (*)
    sh /home/maycon/.config/scripts/desktop.sh
  ;;
  esac
done

Irei incluir os outros apps a medida que for usando, pois não configurei os atalhos para eles ainda.

Muito obrigado! Fiquei quase duas semanas procurando por essa solução e você veio mais rápido que a luz do sol e me ajudou. vlw mesmo!

2 curtidas