unity - como detectar se a tela está bloqueada?

7

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

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

Eu tentei com qdbus também:

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

mas também falhou.

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

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

Perguntas relacionadas: link link

    
por Aquarius Power 02.08.2014 / 03:44

3 respostas

4

A resposta do Aquarius Power parece funcionar muito bem. Aqui estão alguns acréscimos 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 como falso se estiver desbloqueado.

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

Consulta do estado de bloqueio e tempo de rastreio desde a última alteração no estado

Agora, se você precisar acompanhar por quanto tempo a tela foi bloqueada, convém 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, este script observa as alterações no estado de bloqueio da tela. Quando ocorrem mudanças, a hora e o estado são despejados em um arquivo. Você pode ler este arquivo manualmente se quiser ou usar as funções que eu escrevi.

Se você quiser um timestamp em vez do número de segundos, tente:

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

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

    
por b_laoshi 08.03.2017 / 09:18
3

a tela está bloqueada pelo Unity, e precisamos usar gdbus

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

isso será exibido 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 ()
    
por Aquarius Power 02.08.2014 / 08:18
1

Eu tive uma pergunta semelhante aqui

e a ajuda que recebi foi semelhante ao que o Aquarius Power disse antes, exceto que foi incluído em um daemon de scripts bash, que pode ser executado em segundo plano. Achei muito útil. Então, dê uma olhada na minha pergunta e responda, e veja se isso também ajuda você.

    
por Sverre 10.10.2014 / 09:10