unità - come rilevare se lo schermo è bloccato?


9

entrambi funzionano solo dopo che lo schermo bloccato è stato oscurato; ma a volte falliscono anche, quando per qualsiasi motivo lo schermo non si oscura ...

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

Ho provato qdbusanche con :

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

ma ha ugualmente fallito.

Ho appena scoperto che chi blocca effettivamente lo schermo è Unity!

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

Domande correlate:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- daemon-che-potrebbe-essere-ascolto-to-dbus-e-il-fuoco-script-on-messa

Risposte:


6

La risposta di Aquarius Power sembra funzionare abbastanza bene. Ecco alcune aggiunte che potrei fare alla sua soluzione.

Interrogazione solo dello stato di blocco

Se hai semplicemente bisogno di un one-liner per interrogare lo stato di blocco, questo dovrebbe essere considerato vero se bloccato e falso se sbloccato.

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

Interrogazione dello stato di blocco e traccia del tempo dall'ultima modifica dello stato

Ora, se devi tenere traccia di quanto tempo lo schermo è stato bloccato, potresti voler adottare un approccio diverso.

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

Fondamentalmente, questo script osserva i cambiamenti nello stato di blocco dello schermo. Quando vengono apportate modifiche, l'ora e lo stato vengono scaricati in un file. Puoi leggere questo file manualmente se ti piace o utilizzare le funzioni che ho scritto.

Se si desidera un timestamp anziché il numero di secondi, provare:

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

Non dimenticare l' -uinterruttore che forza il programma data a ignorare il tuo fuso orario.


finalmente potrei provarlo, grazie! ecco perché mi piace non accettare la mia risposta quando rispondo a me stessa, quindi le cose migliori potrebbero venire fuori più tardi :)
Aquarius Power

1
Per grep -ioP "(true)|(false)", questo funziona anche:grep -oE "true|false"
wjandrea,

5

lo schermo è in realtà bloccato da Unity e, dobbiamo usarlo gdbus

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

questo mostrerà quando è stato bloccato come:

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

Non ho molta familiarità, ma come farlo senza il monitoraggio? come solo interrogare?
Noitidart,

1
l'unica opzione che ho trovato è stata quella di mantenerlo monitorato (potrebbe esserci un modo per interrogare, ma non sono riuscito a trovarlo nonostante ci abbia provato), immagino sia perché il momento in cui lo schermo è bloccato non viene memorizzato da nessuna parte, quindi il monitor dovrebbe essere l'unico modo per mostrare quando succede.
Aquarius Power

Voglio dire, prova anche tu, se trovi, dimmi o aggiungi una risposta: D
Aquarius Power

Ah ah ah ok, cerco di trovarlo non va bene con Linux sono un ragazzo di Windows: sto solo programmando un po 'di roba cross-os in modo da cercare su Internet.
Noitidart,


2

Ho avuto una domanda simile qui

e l'aiuto che ho ricevuto è stato simile a quello che aveva detto Aquarius Power prima, tranne per il fatto che era incluso in un demone script bash, che può essere eseguito in background .. L'ho trovato molto utile. quindi, dai un'occhiata alla mia domanda e rispondi e vedi se anche questo ti aiuta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.