O script de plano de fundo abaixo fará exatamente exatamente como você descreve
- desliga a tela após x segundos
- bloqueia a tela após y segundos
O script
#!/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, é necessário desativar as ações de cobertura existentes:
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 furtermore:
gsettings set org.gnome.desktop.screensaver lock-enabled false
e
gsettings set org.gnome.desktop.session idle-delay 0
já que agora cuidamos dos 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, salve-o como
set_times.py
-
Na seção principal do script, defina o tempo ocioso para desativar a tela (em segundos):
# set screen off after x seconds off = 300
e o horário para bloquear a tela:
# lock screen after x seconds lock = 360
Estes horários são definidos de forma independente entre si, você pode definir os dois na ordem que desejar (bloquear primeiro, depois desligar ou vice-versa)
Você pode definir a hora "resolução", a frequência em que o tempo ocioso é verificado (e assim o tempo definido é arredondado):
# check idle every x seconds res = 3
mas você também pode
-
Teste-o:
python3 /path/to/set_times.py
-
Se tudo funcionar bem, adicione-o aos 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 o tempo definido é menor do que o limite definido e compara o estado com alguns segundos atrás.
-
Se houver uma mudança no estado (True - > False), qualquer ação poderá ser tomada. Isso é feito para ambas as telas desligadas, em execução:
xset dpms force off
e tela de bloqueio, em execução:
gnome-screensaver-command -l
Notas
-
Claro que também podemos fazer o (s) horário (s) para desligar e bloquear a tela argumentos para 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
Em seguida, execute:
python3 /path/to/set_times.py 300 360
desligará a tela depois de cinco minutos, bloqueie a tela depois das seis.
-
A carga adicional do script é zero.