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.