єдність - як виявити, чи екран заблокований?


9

вони працюють лише після заблокованого екрана; але вони іноді виходять з ладу і тоді, коли з будь-якої причини екран не замикається ...

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

Я спробував qdbusтакож:

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

але це однаково не вдалося.

Я щойно виявив, що хто насправді блокує екран, це Єдність!

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

Питання, пов’язані з цим:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- демон-який-би-був-прослуховував-на-dbus-і-вогонь-сценарій-на-messa

Відповіді:


6

Відповідь Водолія Сила, здається, працює досить добре. Ось кілька доповнень, які я можу внести до його рішення.

Лише запит стану блокування

Якщо вам просто потрібен однолінійний запит про стан блокування, він повинен оцінювати справжній, якщо заблокований, і хибний, якщо розблокований.

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

Запит запиту про стан блокування та час відстеження з моменту останньої зміни стану

Тепер, якщо вам потрібно слідкувати за тим, як довго був заблокований екран, можливо, ви захочете скористатися іншим підходом.

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

По суті, цей скрипт спостерігає за змінами стану блокування екрана. Коли відбуваються зміни, час і стан скидаються у файл. Ви можете прочитати цей файл вручну, якщо вам подобається, або використовувати функції, які я написав.

Якщо вам потрібна мітка часу, а не кількість секунд, спробуйте:

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

Не забувайте про -uперемикач, який змушує програму дати ігнорувати ваш часовий пояс.


нарешті міг би протестувати, THX! ось чому мені подобається не приймати власну відповідь, коли я відповідаю собі, щоб кращі речі могли з’явитися пізніше :)
Power Aquarius Power

1
Бо grep -ioP "(true)|(false)"це також працює:grep -oE "true|false"
wjandrea

5

Екран насправді заблокований Unity, і нам потрібно користуватися gdbus

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

це покаже, коли він заблокувався, як:

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

Я не дуже знайомий, але як це зробити без моніторингу? як просто запитувати?
Noitidart

1
Єдиний варіант, який я знайшов, - це тримати його моніторинг (можливо, є спосіб просто запитувати, але я не міг знайти, незважаючи на те, що я намагався), я думаю, це тому, що момент, коли екран заблокований, ніде не зберігається, тому монітор бути єдиним способом показати, коли це відбувається.
Сила Водолія

Я маю на увазі, спробуйте також, якщо ви знайдете, скажіть мені або додайте відповідь: D
Водолій Сила

Ах-ха-ха, погано намагаюся знайти це їм непогано з Linux, їм хлопець з Windows: P їм просто кодування деяких крос-речей, щоб шукати в Інтернеті.
Noitidart


2

У мене був подібний питання тут

і допомога, яку я отримав, була схожа на те, що сказала Водолій Володар раніше, за винятком того, що вона була включена в демона сценарію, який може працювати на задньому плані .. Я вважав це дуже корисним. тож подивіться на моє запитання та дайте відповідь, і подивіться, чи це теж вам допоможе.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.