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

3

Rodando o Ubuntu 16.04 com o Unity, quero que

  • quando deixo meu laptop intacto por 5 minutos, desligue a tela
  • 1 minuto depois de desligar a tela por inatividade, bloqueie a tela.

  • quando fecho a tampa do laptop, NÃO bloqueio imediatamente a tela, mas aja como se a tampa ainda estivesse aberta e travasse após 5 + 1 minutos (ou similar).

Em Configurações do sistema → Brilho e & amp; Bloqueio , se definir Bloquear para LIGAR e configurar o tempo apropriado (1 minuto), bloqueia o ecrã em conformidade depois de ter sido desligado por inatividade. No entanto, ele também bloqueia a tela no fechamento da tampa, o que eu não quero. Configurar para OFF faz com que ele não bloqueie a tela ao fechar a tampa, mas também a deixa destravada depois de desligar a tela por inatividade.

Eu já defini "lid-close-actions" para "nothing" 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, independentemente da posição da tampa?

    
por Byte Commander 06.01.2017 / 15:04

1 resposta

2

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:

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

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

  4. Teste-o:

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

por Jacob Vlijm 07.01.2017 / 09:26