0 votos positivos 0 votos negativos
316 visitas
em Programas por curioso (2,0K pontos)

No Debian Testing (com i3wm), uso o recurso de desligamento automático da tela após 5 minutos de inatividade através do comando xset, conforme configurado no meu arquivo .xsessionrc:

xset s 300 300
xset dpms 300 300 300
xset r rate 300 50
compton &

Mas gostaria evitar tal desligamento caso o terminal esteja executando algum programa. Por exemplo, suponhamos que estivesse sendo executado um ping 192.168.0.1, nesse caso eu gostaria que tela continuasse ligada durante essa execução; e após terminar o programa, o comportamento voltar ao que estiver configurado no .xsessionrc.

1 Resposta

1 voto positivo 0 votos negativos
por monitor (15,8K pontos)
selecionada por
 
Melhor resposta

Não sei se você pretende fazer isso sempre que estiver executando algo no terminal ou se seria apenas na execução de alguns programas específicos, mas creio que seja possível desabilitar a proteção de tela e o gerenciamento de energia com esses dois comandos:

:~$ xset s off; xset -dpms

Para habilitá-los novamente, utilizando as suas configurações, você executaria algo como:

:~$ xset s 300 300; xset dpms 300 300 300

Se quiser que isso aconteça antes e depois de cada comando executado no terminal, você pode definir no seu .bashrc:

desliga_screensaver() { xset s off; xset -dpms; }
liga_screensaver() { xset s 300 300; xset dpms 300 300 300; }

export -f desliga_screensaver

PS0=$(desliga_screensaver)
PROMPT_COMMAND=liga_screensaver

A variável PS0 foi introduzida no Bash 4.4, se não me engano, e é executada depois da linha do comando ser lida e antes dela ser executada, enquanto a variável PROMPT_COMMAND é executada após a finalização do comando e antes da exibição do prompt PS1.

Como só podemos atribuir strings e expansões de saídas de comandos à variável PS0, eu tive que exportar a função desliga... e fazer a atribuição como uma substituição de comando. Já a variável PROMPT_COMMAND, como o nome diz, só aceita receber comandos, daí uma função ser perfeita para ela.

Antes de testar com seu screensaver, seria uma boa ideia entender como as duas variáveis se comportam com o seguinte exemplo:

:~$ echo "Olá, mundo"; sleep 5
Olá, mundo
:~$ PS0="comecei\n"
:~$ PROMPT_COMMAND=date
comecei
sáb dez 19 09:25:47 -03 2020
:~$ echo "Olá, mundo"; sleep 5
comecei
Olá, mundo
sáb dez 19 09:25:56 -03 2020
:~$ 
por curioso (2,0K pontos)
editado por
0 0
Inicialmente eu pensei que poderia haver algum arquivo de configuração para definir exclusões do xset s 300 300.  Mas essa resposta foi um ótimo hack para a questão.
Eu gostaria que a tela continuasse ligada somente para programas específicos como ping e top, por exemplo, e para todos os outros - como nano, vim, ranger, etc - que o comportamento fosse o que defini ( desligar tela após 5 minutos de inatividade).
Assim utilizei a sua resposta em conjunto ao recurso de aliases do Bash para fazer essas definições, ficando assim no arquivo .bashrc:

    scsvon() { xset s 300 300; xset dpms 300 300 300; }
    scsvoff() { xset s off; xset -dpms; }
    nosv_ping() { export -f scsvoff; PS0=$( scsvoff ); PROMPT_COMMAND=scsvon; ping "$@"; }
    nosv_top () { export -f scsvoff; PS0=$( scsvoff ); PROMPT_COMMAND=scsvon; top "$@"; }

    alias ping='nosv_ping'
    alias top='nosv_top'

Dessa forma, chamando o comando top ou ping pelo terminal a tela não desliga enquanto o programa estiver rodando e o screensaver só ativa novamente após o termino do programa.
Fiz um teste e ficou perfeito aqui.
Muito obrigado! \o/
Seja bem-vindo(a) à comunidade debxp, onde você pode fazer perguntas e receber respostas de outros membros.
Atenção pessoal, esta plataforma não é um fórum, embora se pareça muito com um. Neste tipo de ferramenta, o objetivo é fazer e responder perguntas que possam resultar em material de consulta para outras pessoas que tenham as mesmas dúvidas e dificuldades. Portanto, não há sentido em utilizarmos o Ask para socialização, para emitir opiniões pessoais ou para perguntas do tipo "quem usa isso ou aquilo". Espero que compreendam o nosso propósito. :-)
...