unidade - como detectar se a tela está bloqueada?

unidade - como detectar se a tela está bloqueada?

ambos só funcionam depois que a tela bloqueada fica em branco; mas às vezes eles também falham, quando por algum motivo a tela não fica em branco...

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

Eu tentei com qdbustambém:

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

mas igualmente falhou.

Acabei de descobrir que quem realmente bloqueia a tela é o Unity!

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

Perguntas relacionadas:
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

Responder1

A resposta do Poder de Aquárioparece funcionar muito bem. Aqui estão algumas adições que posso fazer à sua solução.

Consultando apenas o estado de bloqueio

Se você simplesmente precisa de uma linha para consultar o estado de bloqueio, isso deve ser avaliado como verdadeiro se bloqueado e falso se desbloqueado.

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

Consultando o estado de bloqueioerastrear o tempo desde a última mudança de estado

Agora, se você precisar acompanhar por quanto tempo a tela ficou bloqueada, talvez você queira adotar uma abordagem diferente.

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

Essencialmente, esse script observa alterações no estado de bloqueio da tela. Quando ocorrem alterações, a hora e o estado são transferidos para um arquivo. Você pode ler este arquivo manualmente se quiser ou usar as funções que escrevi.

Se você quiser um carimbo de data/hora em vez do número de segundos, tente:

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

Não se esqueça da -uopção que força o programa de data a ignorar seu fuso horário.

Responder2

a tela está realmente bloqueada pelo Unity e precisamos usargdbus

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

isso será mostrado quando for bloqueado como:

/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 ()

Responder3

Eu tive uma pergunta semelhanteaqui

e a ajuda que recebi foi semelhante à que o Aquarius Power disse antes, exceto que foi incluída em um daemon de script bash, que pode ser executado em segundo plano. então, dê uma olhada na minha pergunta e resposta e veja se isso ajuda você também.

informação relacionada