Bildschirm nach einer Zeit der Inaktivität sperren, jedoch nicht beim Schließen des Deckels

Bildschirm nach einer Zeit der Inaktivität sperren, jedoch nicht beim Schließen des Deckels

Wenn ich Ubuntu 16.04 mit Unity verwende, möchte ich das

  • Wenn ich meinen Laptop 5 Minuten lang unbenutzt lasse, schalte ich den Bildschirm aus
  • Sperren Sie den Bildschirm 1 Minute nach dem Ausschalten wegen Inaktivität.

  • wenn ich den Laptopdeckel schließe, wird der Bildschirm NICHT sofort gesperrt, sondern es wird so getan, als wäre der Deckel noch geöffnet und nach 5+1 Minuten (oder so) wird gesperrt.

InSystemeinstellungen → Helligkeit & Sperre, falls gesetztSperrenund ONkonfigurieren Sie die entsprechende Zeit (1 Minute). Der Bildschirm wird entsprechend gesperrt, nachdem er wegen Inaktivität ausgeschaltet wurde. Allerdings wird der Bildschirm auch sofort gesperrt, wenn der Deckel geschlossen wird, was ich nicht möchte. Wenn Sie
es auf einstellen, OFFwird der Bildschirm beim Schließen des Deckels nicht gesperrt, bleibt aber auch nach dem Ausschalten des Bildschirms wegen Inaktivität entsperrt.

Ich habe beide „Deckel-Schließen-Aktionen“ in dconf bereits auf „Nichts“ gesetzt:

$ 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'

Wie kann ich Ubuntu dazu bringen, den Bildschirm unabhängig von der Deckelposition erst nach einer bestimmten Zeit der Inaktivität des Benutzers zu sperren?

Antwort1

Das folgende Hintergrundskript führt so ziemlich genau das aus, was Sie beschreiben

  • schalte den Bildschirm nach x Sekunden aus
  • Bildschirm nach y Sekunden sperren

Das Drehbuch

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

Wie benutzt man

Wie Sie erwähnen, müssen Sie vorhandene Deckelaktionen ausschalten:

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

Und:

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

und außerdem:

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

Und

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

da wir uns mittlerweile selbst um die Abläufe kümmern.

Dann:

  1. Das Skript verwendet xprintidle, um die Leerlaufzeit zu überprüfen

    sudo apt-get install xprintidle
    
  2. Kopieren Sie das Skript in eine leere Datei und speichern Sie es unterset_times.py
  3. Legen Sie im Kopfbereich des Skripts die Leerlaufzeit zum Ausschalten des Bildschirms (in Sekunden) fest:

    # set screen off after x seconds
    off = 300
    

    und die Zeit zum Sperren des Bildschirms:

    # lock screen after x seconds
    lock = 360
    

    Die Zeiten werden unabhängig voneinander eingestellt, die Reihenfolge ist beliebig (entweder erst sperren, dann ausschalten oder andersherum).

    DudürfenStellen Sie die Zeitauflösung ein, also die Häufigkeit, mit der die Leerlaufzeit geprüft wird (und mit der die eingestellte Zeit somit gerundet wird):

    # check idle every x seconds
    res = 3
    

    aber du könntest genauso gut

  4. Testen Sie es:

    python3 /path/to/set_times.py
    
  5. Wenn alles gut funktioniert, fügen Sie es zu den Startanwendungen hinzu: Dash > Startanwendungen > Hinzufügen. Fügen Sie den Befehl hinzu:

    python3 /path/to/set_times.py
    

Erläuterung zum Konzept

  • Der Befehl xprintidlegibt die aktuelle Leerlaufzeit zurück (keine Eingabe von Maus oder Tastatur).
  • Das Skript prüft dann, ob dieZeit einstellenist kleiner als eindefinierter Schwellenwert, und vergleicht den Zustand mit dem von vor ein paar Sekunden.
  • Bei einer Zustandsänderung (True --> False) können beliebige Aktionen ausgeführt werden. Dies geschieht sowohl beim Ausschalten des Bildschirms als auch beim Ausführen von:

    xset dpms force off
    

    und Sperrbildschirm, läuft:

    gnome-screensaver-command -l
    

Anmerkungen

  • Natürlich können wir auch die Zeit(en) festlegen, um den Bildschirm auszuschalten und zu sperrenArgumenteum das Skript auszuführen mit:

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

    Dann ausführen:

    python3 /path/to/set_times.py 300 360
    

    schaltet den Bildschirm nach fünf Minuten aus und nach sechs Minuten sperrt er.

  • Der Mehraufwand durch das Skript liegt bei Null.

verwandte Informationen