jedność - jak wykryć, czy ekran jest zablokowany?


9

oba działają tylko po wygaszeniu ekranu, który został zablokowany; ale czasami również zawodzą, gdy z jakiegoś powodu ekran nie jest pusty ...

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

Próbowałem qdbusrównież z :

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

ale równie dobrze zawiodło.

Właśnie odkryłem, że tym, który blokuje ekran, jest Unity!

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

Powiązane pytania:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- daemon-which-will-be-listening-to-dbus-and-fire-script-on-messa

Odpowiedzi:


6

Odpowiedź Aquarius Power wydaje się działać całkiem dobrze. Oto kilka uzupełnień, które mogę wprowadzić do jego rozwiązania.

Tylko zapytanie o stan blokady

Jeśli potrzebujesz po prostu linijki do zapytania o stan blokady, powinna to być prawda, jeśli zablokowana i fałsz, jeśli odblokowana.

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

Sprawdzanie stanu blokady i czasu śledzenia od ostatniej zmiany stanu

Teraz, jeśli chcesz śledzić, jak długo ekran był zablokowany, możesz zastosować inne podejście.

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

Zasadniczo ten skrypt sprawdza zmiany w stanie zablokowania ekranu. Po wprowadzeniu zmian czas i stan są zrzucane do pliku. Możesz przeczytać ten plik ręcznie, jeśli chcesz lub korzystasz z funkcji, które napisałem.

Jeśli chcesz znacznika czasu zamiast liczby sekund, spróbuj:

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

Nie zapomnij o -uprzełączniku, który zmusza program daty do ignorowania strefy czasowej.


w końcu mogę to przetestować, dzięki! dlatego lubię nie przyjmować własnej odpowiedzi, kiedy odpowiadam sobie, aby później mogły wyjść lepsze rzeczy :)
Aquarius Power

1
Na grep -ioP "(true)|(false)"ten działa również:grep -oE "true|false"
wjandrea

5

ekran jest faktycznie zablokowany przez Unity i musimy go użyć gdbus

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

pokaże to, kiedy zostanie zablokowane, np .:

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

Nie jestem zbyt dobrze zaznajomiony, ale jak to zrobić bez monitorowania? jak tylko zapytanie?
Noitidart,

1
jedyną opcją, jaką znalazłem, było monitorowanie go (być może istnieje sposób na zapytanie, ale nie mogłem znaleźć, mimo że próbowałem), myślę, że dzieje się tak, ponieważ moment, w którym ekran jest zablokowany, nie jest już przechowywany, więc monitor być jedynym sposobem, aby pokazać, kiedy to się stanie.
Wodnik Moc

Mam na myśli, spróbuj też, jeśli znajdziesz, powiedz mi lub dodaj odpowiedź: D
Aquarius Power

Ach, haha, ok, spróbuj znaleźć to nie jest dobre z Linuksem, jestem facetem z Windows: P po prostu koduję kilka rzeczy, więc przeszukuję Internet.
Noitidart


2

Miałem podobny pytanie tutaj

a pomoc, którą otrzymałem, była podobna do tego, co powiedziała wcześniej Aquarius Power, z tym wyjątkiem, że była zawarta w demonie bash scrip, który może działać w tle. Uważam, że jest to bardzo pomocne. więc spójrz na moje Pytanie i odpowiedz, i zobacz, czy to ci również pomoże.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.