unidade - como detectar se a tela está bloqueada?

9

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

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 falhou igualmente.

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:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- daemon-que-estaria-ouvindo-dbus-e-fogo-script-em-messa

Poder do Aquário
fonte

Respostas:

6

A resposta de Aquarius Power parece funcionar muito bem. Aqui estão algumas adições que posso fazer à sua solução.

Consultando apenas o estado do bloqueio

Se você simplesmente precisar de uma linha única para consultar o estado de bloqueio, isso deve ser 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 do bloqueio e o tempo de rastreamento desde a última alteração no estado

Agora, se você precisar acompanhar por quanto tempo a tela está 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, esse script procura alterações no estado de bloqueio da tela. Quando as alterações ocorrem, a hora e o estado são despejados em um arquivo. Você pode ler este arquivo manualmente se gostar ou usar as funções que escrevi.

Se você deseja um carimbo de data e 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 datas a ignorar seu fuso horário.

b_laoshi
fonte
finalmente poderia testá-lo, thx! é por isso que eu gosto de não aceitar minha própria resposta quando me respondo para que coisas melhores possam sair mais tarde :) #
Aquarius Power
11
Pois grep -ioP "(true)|(false)", isso também funciona:grep -oE "true|false"
wjandrea
5

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

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

isso mostrará quando foi 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 ()
Poder do Aquário
fonte
Não estou muito familiarizado, mas como fazer isso sem o monitoramento? como apenas consulta?
Noitidart
11
a única opção que encontrei foi mantê-lo monitorando (pode haver uma maneira de apenas consultar, mas não consegui encontrar apesar de ter tentado), acho que é porque no momento em que a tela está bloqueada não é armazenada em nenhum lugar, o monitor ser a única maneira de mostrar quando isso acontece.
Poder de Aquário
Quero dizer, tente também, se você encontrar, me diga ou adicione uma resposta: D
Aquarius Power
Ah haha ​​ok, vou tentar achar que não sou bom com o linux sou um cara do Windows: Estou apenas codificando algumas coisas cruzadas para pesquisar na internet.
Noitidart
11
@ Noitidart askubuntu.com/a/890802/46437 :)
Aquarius Power
2

Eu tive uma pergunta semelhante aqui

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

Sverre
fonte