unity - как определить, заблокирован ли экран?

7

обе эти работы работают только после того, как экран, который был заблокирован, закроется; но иногда они также выходят из строя, когда по какой-либо причине экран не имеет пробелов ...

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

Я тоже пытался с qdbus :

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

, но он также не прошел.

Я только обнаружил, что кто на самом деле блокирует экран Unity!

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

Связанные вопросы:
Ссылка Ссылка

    
задан Aquarius Power 02.08.2014 в 01:44
источник

3 ответа

4

Ответ Aquarius Power , кажется, работает достаточно хорошо. Вот некоторые дополнения, которые я мог бы внести в его решение.

Только запрос состояния блокировки

Если вам просто нужен однострочный запрос для запроса состояния блокировки, это должно оцениваться как true, если заблокировано и false, если разблокировано.

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 , который заставляет программу даты игнорировать ваш часовой пояс.

    
ответ дан b_laoshi 08.03.2017 в 08:18
источник
3

экран действительно заблокирован 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 ()
    
ответ дан Aquarius Power 02.08.2014 в 06:18
1

У меня был аналогичный вопрос здесь

и помощь, которую я получил, была похожа на то, о чем говорила ранее компания Aquarius Power, за исключением того, что она была включена в демон скрипта bash, который может работать в фоновом режиме. Я нашел его очень полезным. поэтому, взгляните на мой вопрос и ответьте, и посмотрите, поможет ли это вам.     

ответ дан Sverre 10.10.2014 в 07:10