Unity – wie erkennt man, ob der Bildschirm gesperrt ist?

Unity – wie erkennt man, ob der Bildschirm gesperrt ist?

beide funktionieren nur, nachdem der gesperrte Bildschirm gelöscht wurde. Manchmal schlagen sie aber auch fehl, wenn der Bildschirm aus irgendeinem Grund nicht gelöscht wird ...

gnome-screensaver-command --query
gnome-screensaver-command --time

Ich habe es qdbusauch mit Folgendem versucht:

qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime

Aber auch dieser Versuch schlug fehl.

Ich habe gerade herausgefunden, dass Unity tatsächlich den Bildschirm sperrt!

qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock

Ähnliche Fragen:
https://unix.stackexchange.com/questions/28181/run-script-on-screen-lock-unlock https://unix.stackexchange.com/questions/80143/how-to-create-a-daemon-which-would-be-listening-to-dbus-and-fire-script-on-messa

Antwort1

Antwort von Aquarius Powerscheint ganz gut zu funktionieren. Hier sind einige Ergänzungen, die ich zu seiner Lösung hinzufügen könnte.

Nur Abfrage des Sperrzustands

Wenn Sie einfach eine einzeilige Abfrage zum Sperrstatus benötigen, sollte diese als „true“ ausgewertet werden, wenn der Sperrstatus gesperrt ist, und als „false“, wenn der Sperrstatus entsperrt ist.

isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")

Abfragen des SperrzustandsUndZeit seit der letzten Statusänderung verfolgen

Wenn Sie nun im Auge behalten müssen, wie lange der Bildschirm gesperrt war, sollten Sie möglicherweise einen anderen Ansatz wählen.

#!/bin/bash
# To implement this, you can put this at the top of a bash script or you can run
# it the subshell in a separate process and pull the functions into other scripts.

# We need a file to keep track of variable inside subshell the file will contain
# two elements, the state and timestamp of time changed, separated by a tab.
# A timestamp of 0 indicates that the state has not changed since we started
# polling for changes and therefore, the time lapsed in the current state is
# unknown.
vars="/tmp/lock-state"

# start watching the screen lock state
(
    # set the initial value for lock state
    [ "$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")" == "true" ] && state="locked" || state="unlocked"
    printf "%s\t%d" $state 0 > "$vars"
    
    # start watching changes in state
    gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session | while read line
    do 
        state=$(grep -ioP "((un)?locked)" <<< "$line")
        # If the line read denotes a change in state, save it to a file with timestamp for access outside this subshell
        [ "$state" != "" ] && printf "%s\t%d" ${state,,} $(date +%s)> "$vars"
    done
) & # don't wait for this subshell to finish

# Get the current state from the vars exported in the subshell
function getState {
    echo $(cut -f1 "$vars")
}

# Get the time in seconds that has passed since the state last changed
function getSecondsElapsed {
    if [ $(cut -f2 "$vars") -ne 0 ]; then
        echo $(($(date +%s)-$(cut -f2 "$vars")))
    else
        echo "unknown"
    fi
}

Im Wesentlichen überwacht dieses Skript Änderungen im Sperrzustand des Bildschirms. Wenn Änderungen stattfinden, werden Zeit und Zustand in eine Datei geschrieben. Sie können diese Datei manuell lesen, wenn Sie möchten, oder die von mir geschriebenen Funktionen verwenden.

Wenn Sie statt der Anzahl der Sekunden einen Zeitstempel wünschen, versuchen Sie Folgendes:

date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"

Vergessen Sie nicht den -uSchalter, der das Datumsprogramm zwingt, Ihre Zeitzone zu ignorieren.

Antwort2

Der Bildschirm ist tatsächlich von Unity gesperrt, und wir müssen verwendengdbus

gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session

Dies wird angezeigt, wenn es gesperrt wurde, etwa:

/com/canonical/Unity/Session: com.canonical.Unity.Session.LockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Locked ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.UnlockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Unlocked ()

Antwort3

Ich hatte eine ähnliche FrageHier

und die Hilfe, die ich bekam, war ähnlich der, die Aquarius Power zuvor gesagt hatte, außer dass sie in einen Bash-Skript-Daemon integriert war, der im Hintergrund ausgeführt werden kann. Ich fand sie sehr hilfreich. Sehen Sie sich also meine Frage und Antwort an und prüfen Sie, ob Ihnen das auch hilft.

verwandte Informationen