Bloquear tela após período de inatividade, mas não ao fechar a tampa

Bloquear tela após período de inatividade, mas não ao fechar a tampa

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:

  1. O script usa xprintidle, para verificar o tempo ocioso

    sudo apt-get install xprintidle
    
  2. Copie o script em um arquivo vazio e salve-o comoset_times.py
  3. 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

  4. Teste - execute:

    python3 /path/to/set_times.py
    
  5. 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 xprintidleretorna 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.

informação relacionada