Dentro de um script de shell, preciso aguardar a exibição de uma janela com uma string no título, executar alguma ação e esperar que ela desapareça e executar outra ação.
Até ontem, eu tinha esse código simples. O problema é que o disco não pode ser colocado em um estado de economia de energia enquanto o script permanece em execução, e isso pode ocorrer por muitas horas:
while :; do
until wmctrl -l | grep -q "$string"; do # until
sleep 0.5
done
: do action 1
while wmctrl -l | grep -q "$string"; do # while
sleep 0.5
done
: do action 2
done
Como decidi que o código mencionado estava despertando insanamente o disco, consultei a documentação de algumas ferramentas de linha de comando e decidi xdotoolesperar a janela aparecer e xpropdescobrir quando a janela desapareceu:
while :; do
# we use `until' because sometimes xdotool just crashes
until xdotool search -sync -all -onlyvisible -pid $pid -name "$string"; do
:
done
# xdotool isn't trustworthy either, so check again
wmctrl -l | grep -q "$string" ||
continue
: do action 1
xprop -spy -root _NET_CLIENT_LIST_STACKING | while read line; do
if [[ ! ${_line:-} || $_line = $line ]]; then
_line=$line
continue
else
_line=$line
if wmctrl -l | grep -q "$string"; then
continue
else
: do action 2
break
fi
fi
done
done
Agora eu tenho dois novos problemas com o código acima:
xdotoolnão apenas trava e dá resultados estranhos, como eu já havia contornado antes, mas também suga cerca de 15% da CPU enquanto aguarda a janela aparecer. Isso significa que me livrei do código simples que ativa o disco, para escrever o código que resta desperdiçando a CPU por horas, e minha intenção era economizar energia em primeiro lugar.xprop -spyme notificará toda vez que eu mudar o foco (que eu contornei$_line) ou criar e destruir janelas. Isso ativa o disco com mais frequência que o xdotool.
Estou procurando um programa simples que apenas aguarde a janela com o título $stringaparecer ou desaparecer. Pode ser uma ferramenta de linha de comando existente, um script python, código C compilável ..., mas eu devo ser capaz de integrá-lo de alguma forma ao meu script (mesmo que apenas grave algumas informações em um fifo)!
fatracepara verificar se há ativações de disco, e isso me diz bashleituras /bin/sleepe a /usr/bin/wmctrlcada meio segundo, é por isso que estou procurando por algum programa que realmente espere eventos da janela. Estou esquecendo de algo?
btracefrom blktracepara investigar as fontes de atividade do disco.
xwininfopode ser útil, certamente cargas muito menos bibliotecas compartilhadas do que wmctrl e opera em um nível mais próximo X. nua
strace -f -e trace=file wmctrl -ldeveria ser informativo.