web-dev-qa-db-fra.com

Verrouiller l'écran après une période d'inactivité, mais pas à la fermeture du couvercle

Sous Ubuntu 16.04 avec Unity, je le veux

  • lorsque je laisse mon ordinateur portable intact pendant 5 minutes, éteignez l'écran
  • 1 minute après avoir éteint l'écran pour l'inactivité, verrouillez l'écran.

  • lorsque je ferme le couvercle de l'ordinateur portable, ne verrouillez PAS immédiatement l'écran, mais agissez comme si le couvercle était toujours ouvert et verrouillez après 5 + 1 minutes (ou similaire).

Dans Paramètres système → Luminosité et verrouillage, si défini Lock sur ON et configurer le temps approprié (1 minute), il verrouille l'écran en conséquence après qu'il a été éteint pour inactivité. Cependant, il verrouille également l'écran à la fermeture du couvercle, ce que je ne veux pas.
Réglage sur OFF ne verrouille pas l'écran en fermant le couvercle, mais le laisse également déverrouillé après avoir éteint l'écran pour l'inactivité.

J'ai déjà défini les deux "actions de fermeture du couvercle" sur "rien" dans 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'

Comment puis-je faire en sorte qu'Ubuntu ne verrouille l'écran qu'après un certain temps d'inactivité de l'utilisateur, quelle que soit la position du couvercle?

2
Byte Commander

Le script d'arrière-plan ci-dessous fera à peu près exactement ce que vous décrivez

  • éteindre l'écran après x secondes
  • verrouiller l'écran après y secondes

Le 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

Comment utiliser

Comme vous le mentionnez, vous devez désactiver les actions de couvercle existantes:

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

et:

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

et plus encore:

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

et

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

puisque nous prenons maintenant soin de nos propres procédures.

puis:

  1. Le script utilise xprintidle, pour vérifier le temps d'inactivité

    Sudo apt-get install xprintidle
    
  2. Copiez le script dans un fichier vide, enregistrez-le sous set_times.py
  3. Dans la section head du script, définissez le temps d'inactivité pour éteindre l'écran (en secondes):

    # set screen off after x seconds
    off = 300
    

    et le temps de verrouiller l'écran:

    # lock screen after x seconds
    lock = 360
    

    Ces heures sont réglées indépendamment les unes des autres, vous pouvez définir les deux dans l'ordre que vous souhaitez (soit verrouiller d'abord, puis éteindre, ou l'inverse)

    Vous pouvez régler la "résolution" du temps, la fréquence du temps d'inactivité est vérifiée, (et donc le temps réglé est arrondi par):

    # check idle every x seconds
    res = 3
    

    mais vous pourriez aussi bien

  4. Testez-le:

    python3 /path/to/set_times.py
    
  5. Si tout fonctionne bien, ajoutez-le aux applications de démarrage: Dash> Applications de démarrage> Ajouter. Ajoutez la commande:

    python3 /path/to/set_times.py
    

Explication sur le concept

  • La commande xprintidle renvoie le temps d'inactivité actuel (aucune entrée de la souris ou du clavier)
  • Le script teste ensuite si le temps défini est inférieur à un seuil défini , et compare l'état avec il y a quelques secondes.
  • S'il y a un changement d'état (Vrai -> Faux), n'importe quelle action peut être entreprise. Cela se fait pour les deux éteindre l'écran, en cours d'exécution:

    xset dpms force off
    

    et écran de verrouillage, en cours d'exécution:

    gnome-screensaver-command -l
    

Remarques

  • Bien sûr, nous pouvons également prendre le temps de désactiver et de verrouiller les arguments de l'écran pour exécuter le script avec:

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

    Puis en cours d'exécution:

    python3 /path/to/set_times.py 300 360
    

    éteindra l'écran après cinq minutes, verrouillera l'écran après six minutes.

  • La charge supplémentaire du script est nulle.

2
Jacob Vlijm