
Executando o Ubuntu 16.04 com Unity, eu quero isso
- quando deixo meu laptop intocado por 5 minutos, desligo a tela
1 minuto após desligar a tela por inatividade, bloqueie a tela.
quando eu fechar a tampa do laptop, NÃO bloqueie a tela imediatamente, mas aja como se a tampa ainda estivesse aberta e trave após 5 + 1 minutos (ou similar).
EmConfigurações do sistema → Brilho e bloqueio, se definidoTrancare ONconfigurar o tempo apropriado (1 minuto), ele bloqueia a tela adequadamente após ser desligada por inatividade. Porém, ele também bloqueia imediatamente a tela ao fechar a tampa, o que eu não quero.
Configurá-lo para OFFnão bloqueia a tela ao fechar a tampa, mas também a deixa desbloqueada após desligar a tela por inatividade.
Eu já configurei ambas as "ações de fechamento de tampa" como "nada" no dconf:
$ gsettings get org.gnome.settings-daemon.plugins.power lid-close-ac-action
'nothing'
$ gsettings get org.gnome.settings-daemon.plugins.power lid-close-battery-action
'nothing'
Como posso fazer o Ubuntu bloquear a tela somente após um tempo específico de inatividade do usuário, independente da posição da tampa?
Responder1
O script de plano de fundo abaixo funcionará exatamente como você descreve
- desligue a tela após x segundos
- bloquear a tela após y segundos
O roteiro
#!/usr/bin/env python3
import subprocess
import time
# set screen off after x seconds
off = 300
# lock screen after x seconds
lock = 360
# check idle every x seconds
res = 3
def get(cmd):
return subprocess.check_output(cmd).decode("utf-8").strip()
def test(t, threshold):
return int(t)/1000 < threshold
testoff1 = True
testlock1 = True
t1 = 0
while True:
time.sleep(res)
t2 = get("xprintidle")
testoff2 = test(t2, off); testlock2 = test(t2, lock)
if (testoff2, testoff1) == (False, True):
subprocess.Popen(["xset", "dpms", "force", "off"])
if (testlock2, testlock1) == (False, True):
subprocess.Popen(["gnome-screensaver-command", "-l"])
testoff1 = testoff2; testlock1 = testlock2
Como usar
Como você mencionou, você precisa desativar as ações existentes da tampa:
gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'
e:
gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'
e ainda:
gsettings set org.gnome.desktop.screensaver lock-enabled false
e
gsettings set org.gnome.desktop.session idle-delay 0
já que agora cuidamos de nossos próprios procedimentos.
então:
O script usa
xprintidle
, para verificar o tempo ociososudo apt-get install xprintidle
- Copie o script em um arquivo vazio e salve-o como
set_times.py
Na seção head do script, defina o tempo ocioso para desligar a tela (em segundos):
# set screen off after x seconds off = 300
e a hora de bloquear a tela:
# lock screen after x seconds lock = 360
Esses tempos são definidos independentemente um do outro, você pode definir ambos na ordem que desejar (bloquear primeiro, depois desligar ou vice-versa)
Vocêpodedefina a "resolução" do tempo, a frequência em que o tempo ocioso é verificado (e, portanto, o tempo definido é arredondado):
# check idle every x seconds res = 3
mas você também pode
Teste - execute:
python3 /path/to/set_times.py
Se tudo funcionar bem, adicione-o a Aplicativos de inicialização: Dash > Aplicativos de inicialização > Adicionar. Adicione o comando:
python3 /path/to/set_times.py
Explicação sobre o conceito
- O comando
xprintidle
retorna o tempo ocioso atual (sem entrada do mouse ou teclado) - O script então testa se odefinir tempoé menor que umlimite definidoe compara o estado com alguns segundos atrás.
Se houver uma mudança de estado (Verdadeiro -> Falso), qualquer ação poderá ser tomada. Isso é feito para desligar a tela, executando:
xset dpms force off
e tela de bloqueio, executando:
gnome-screensaver-command -l
Notas
Claro que também podemos reservar um(s) tempo(s) para desligar e bloquear a telaargumentospara executar o script com:
#!/usr/bin/env python3 import subprocess import time import sys off = int(sys.argv[1]) if len(sys.argv) > 1 else 300 lock = int(sys.argv[2]) if len(sys.argv) > 2 else off + 60 # check idle every x seconds res = int(sys.argv[3]) if len(sys.argv) > 3 else 5 def get(cmd): return subprocess.check_output(cmd).decode("utf-8").strip() def test(t, threshold): return int(t)/1000 < threshold testoff1 = True testlock1 = True t1 = 0 while True: time.sleep(res) t2 = get("xprintidle") testoff2 = test(t2, off); testlock2 = test(t2, lock) if (testoff2, testoff1) == (False, True): subprocess.Popen(["xset", "dpms", "force", "off"]) if (testlock2, testlock1) == (False, True): subprocess.Popen(["gnome-screensaver-command", "-l"]) testoff1 = testoff2; testlock1 = testlock2
Então executando:
python3 /path/to/set_times.py 300 360
desligará a tela após cinco minutos, bloqueará a tela após seis.
A carga adicional do script é zero.