Pantalla de bloqueo después de un período de inactividad, pero no al cerrar la tapa

Pantalla de bloqueo después de un período de inactividad, pero no al cerrar la tapa

Ejecutando Ubuntu 16.04 con Unity, quiero eso

  • Cuando dejo mi computadora portátil sin tocar durante 5 minutos, apago la pantalla
  • 1 minuto después de apagar la pantalla por inactividad, bloquee la pantalla.

  • Cuando cierro la tapa de la computadora portátil, NO bloquee inmediatamente la pantalla, actúe como si la tapa aún estuviera abierta y se bloquee después de 5+1 minutos (o similar).

EnConfiguración del sistema → Brillo y bloqueo, si está configuradoCerrary configura ONel tiempo apropiado (1 minuto), bloquea la pantalla en consecuencia después de que se haya apagado por inactividad. Sin embargo, también bloquea inmediatamente la pantalla al cerrar la tapa, lo cual no quiero.
Configurarlo en OFFhace que no bloquee la pantalla al cerrar la tapa, pero también la deja desbloqueada después de apagar la pantalla por inactividad.

Ya configuré ambas "acciones de cierre de tapa" en "nada" en 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'

¿Cómo puedo hacer que Ubuntu bloquee la pantalla sólo después de un tiempo específico de inactividad del usuario, independientemente de la posición de la tapa?

Respuesta1

El script de fondo a continuación funcionará prácticamente exactamente como lo describe

  • apagar la pantalla después de x segundos
  • bloquear la pantalla después de y segundos

La secuencia de comandos

#!/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

Cómo utilizar

Como mencionas, debes desactivar las acciones de tapa existentes:

gsettings set org.gnome.settings-daemon.plugins.power lid-close-ac-action 'nothing'

y:

gsettings set org.gnome.settings-daemon.plugins.power lid-close-battery-action 'nothing'

y además:

gsettings set org.gnome.desktop.screensaver lock-enabled false

y

gsettings set org.gnome.desktop.session idle-delay 0

ya que ahora nos encargamos de nuestros propios procedimientos.

entonces:

  1. El script utiliza xprintidlepara comprobar el tiempo de inactividad.

    sudo apt-get install xprintidle
    
  2. Copie el script en un archivo vacío, guárdelo comoset_times.py
  3. En la sección principal del script, establezca el tiempo de inactividad para apagar la pantalla (en segundos):

    # set screen off after x seconds
    off = 300
    

    y el tiempo para bloquear la pantalla:

    # lock screen after x seconds
    lock = 360
    

    Estos tiempos se configuran de forma independiente entre sí, puede configurar ambos en el orden que desee (primero bloquear, luego apagar o al revés)

    poderestablezca la "resolución" del tiempo, la frecuencia con la que se verifica el tiempo de inactividad (y, por lo tanto, el tiempo establecido se redondea por):

    # check idle every x seconds
    res = 3
    

    pero tú también podrías

  4. Pruébalo y ejecútalo:

    python3 /path/to/set_times.py
    
  5. Si todo funciona bien, agréguelo a Aplicaciones de inicio: Tablero > Aplicaciones de inicio > Agregar. Agregue el comando:

    python3 /path/to/set_times.py
    

Explicación del concepto.

  • El comando xprintidledevuelve el tiempo de inactividad actual (sin entrada desde el mouse o el teclado)
  • Luego, el script prueba si elfijar tiempoes más pequeño que unumbral definido, y compara el estado con el de hace unos segundos.
  • Si hay un cambio de estado (Verdadero --> Falso) se puede realizar cualquier acción. Esto se hace para apagar la pantalla, ejecutando:

    xset dpms force off
    

    y pantalla de bloqueo, ejecutando:

    gnome-screensaver-command -l
    

Notas

  • Por supuesto, también podemos hacer tiempo para apagar y bloquear la pantalla.argumentospara ejecutar el script con:

    #!/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
    

    Luego ejecutando:

    python3 /path/to/set_times.py 300 360
    

    apagará la pantalla después de cinco minutos, bloqueará la pantalla después de seis.

  • La carga adicional del guión es cero.

información relacionada