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

9

ces deux ne fonctionnent que lorsque l'écran qui a été verrouillé est masqué; mais ils échouent parfois aussi, quand, pour une raison quelconque, l'écran ne se vide pas ...

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

J'ai essayé avec qdbusaussi:

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

mais il a également échoué.

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

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

Questions connexes:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- démon-qui-serait-à-écouter-dbus-et-fire-script-on-messa

Puissance du Verseau
la source

Réponses:

6

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

Interrogation de l'état de verrouillage uniquement

Si vous avez simplement besoin d'une ligne unique pour interroger l'état de verrouillage, cela devrait être vrai si verrouillé et faux s'il est 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 du verrou et du temps de suivi depuis le dernier changement d'état

Maintenant, si vous devez garder une trace de la durée de verrouillage de l'écran, 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 ont lieu, 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 -ucommutateur qui force le programme de date à ignorer votre fuseau horaire.

b_laoshi
la source
pourrait enfin le tester, thx! c'est pourquoi j'aime ne pas accepter ma propre réponse quand je me réponds pour que de meilleures choses puissent sortir plus tard :)
Aquarius Power
1
Pour grep -ioP "(true)|(false)", cela fonctionne aussi:grep -oE "true|false"
wjandrea
5

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

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

cela montrera quand il a été 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 ()
Puissance du Verseau
la source
Je ne suis pas très familier, mais comment faire cela sans surveillance? comme simplement interroger?
Noitidart
1
la seule option que j'ai trouvée était de le garder sous surveillance (il y a peut-être un moyen de simplement interroger, mais je n'ai pas pu le trouver malgré que j'aie essayé), je suppose que c'est parce que le moment où l'écran est verrouillé n'est stocké nulle part, le moniteur être le seul moyen de montrer quand cela se produit.
Aquarius Power
Je veux dire, essayez aussi, si vous trouvez, dites-moi ou ajoutez une réponse: D
Aquarius Power
Ah haha ​​ok mal essayer de le trouver im pas bon avec linux im un gars windows: P im juste coder des trucs cross os afin de rechercher sur internet.
Noitidart
1
@Noitidart askubuntu.com/a/890802/46437 :)
Aquarius Power
2

J'avais une question similaire ici

et l'aide que j'ai reçue était similaire à ce qu'Aquarius Power avait dit auparavant, sauf qu'elle était incluse 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 oeil à ma question, et répondez, et voyez si cela vous aide aussi.

Sverre
la source