web-dev-qa-db-fra.com

unité - comment détecter si l'écran est verrouillé?

les deux ne fonctionnent que lorsque l'écran verrouillé est effacé; mais ils échouent parfois aussi, quand pour une raison quelconque l'écran ne vide pas ...

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

J'ai essayé avec qdbus aussi:

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

mais cela a également échoué.

Je viens de découvrir que celui qui verrouille l'écran est Unity!

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

Questions connexes:
https://unix.stackexchange.com/questions/28181/run-script-on-screen-lock-unlockhttps://unix.stackexchange.com/questions/80143/comment-créer-un-démon -qui voudrait-être-écouter-à-dbus-et-fire-script-sur-messa

9
Aquarius Power

La réponse d'Aquarius Power semble fonctionner assez bien. Voici quelques ajouts que je pourrais faire à sa solution.

Interroger seulement l'état de verrouillage

Si vous avez simplement besoin d’une ligne pour interroger l’état de verrouillage, vous devez indiquer true si verrouillé et false si déverrouillé.

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

Interrogation de l'état de verrouillage et du temps écoulé depuis le dernier changement d'état

Maintenant, si vous devez savoir depuis combien de temps l'écran est verrouillé, vous voudrez peut-être adopter une approche différente.

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

Essentiellement, ce script surveille les modifications de l'état de verrouillage de l'écran. Lorsque des modifications sont apportées, l'heure et l'état sont sauvegardés dans un fichier. Vous pouvez lire ce fichier manuellement si vous le souhaitez ou utiliser les fonctions que j'ai écrites.

Si vous voulez un horodatage plutôt que le nombre de secondes, essayez:

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

N'oubliez pas le commutateur -u qui oblige le programme de date à ignorer votre fuseau horaire.

6
b_laoshi

l'écran est actuellement verrouillé par Unity, et nous devons utiliser gdbus

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

cela montrera quand il s'est verrouillé comme:

/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 ()
4
Aquarius Power

J'ai eu une question similaire ici

et l'aide que j'ai obtenue était similaire à celle d'Aquarius Power, à l'exception du fait qu'il était inclus dans un démon de script bash, qui peut s'exécuter en arrière-plan. Je l'ai trouvé très utile. alors, jetez un coup d'œil à ma question, répondez-y et voyez si cela vous aide également.

1
Sverre