Eu uso um programa chamado xprintidle
para descobrir o tempo ocioso do X, que estou achando que usa a mesma fonte de dados que os protetores de tela. xprintidle
realmente não parece ter mais um upstream, mas o pacote Debian está vivo e bem.
É uma aplicação muito simples: devolve a quantidade de milissegundos desde a última interação X:
$ sleep 1 && xprintidle
940
$ sleep 5 && xprintidle
4916
$ sleep 10 && xprintidle
9932
(nota: devido ao sistema subjacente, ele fornecerá consistentemente um valor em ms um pouco menor que o tempo ocioso "real").
Você pode usar isso para criar um script que execute uma determinada sequência depois de cinco minutos de tempo ocioso, por exemplo:
#!/bin/sh
# Wanted trigger timeout in milliseconds.
IDLE_TIME=$((5*60*1000))
# Sequence to execute when timeout triggers.
trigger_cmd() {
echo "Triggered action $(date)"
}
sleep_time=$IDLE_TIME
triggered=false
# ceil() instead of floor()
while sleep $(((sleep_time+999)/1000)); do
idle=$(xprintidle)
if [ $idle -ge $IDLE_TIME ]; then
if ! $triggered; then
trigger_cmd
triggered=true
sleep_time=$IDLE_TIME
fi
else
triggered=false
# Give 100 ms buffer to avoid frantic loops shortly before triggers.
sleep_time=$((IDLE_TIME-idle+100))
fi
done
O deslocamento de 100 ms é devido à peculiaridade observada anteriormente de que xprintidle
sempre retornará um tempo um pouco menor que o tempo ocioso "real" quando executado assim. Ele funcionará sem esse deslocamento e será mais preciso até um décimo de segundo, mas acionará a verificação xprintidle
freneticamente durante os últimos milésimos de segundo antes de um término do intervalo. Não é um especialista em performance, mas eu acharia isso deselegante.
Eu usei uma abordagem semelhante em um script Perl (um plugin irssi) por algum tempo, mas o acima foi escrito e não foi realmente testado, exceto por algumas tentativas durante a escrita.
Experimente, executando-o em um terminal no X. Recomendo definir o tempo limite para, por exemplo, 5000 ms para teste e adicionando set -x
diretamente abaixo de #!/bin/sh
para obter saída informativa para ver como funciona.