Я столкнулся с этой же проблемой, и мои исследования ничего не дали. Если кто-то может найти лучший способ запросить статус блокировки Unity, я хотел бы услышать об этом.
Недавно я узнал об именованных трубах, и в то время я задавался вопросом, для чего я могу использовать такую вещь. Эта проблема, оказывается, оказывается идеальным приложением.
Создайте следующий скрипт ...
#!/bin/bash
# this script is meant to be called in two different ways.
# 1. It can be called as a service by passing "service" as the first argument. In this
# mode, the script listens for requests for lock screen status. The script should be
# run in this mode with startup applications on user logon.
# 2. If this script is called without any arguments, it will call the service to request
# the current lock screen status. Call this script in this manner from your user
# service.
# this will be the named pipe we'll use for requesting and receiving screen lock status
pipe="/tmp/lockscreen-status"
if [ "$1" == "service" ]; then
# setup the named pipe
rm "$pipe"
mkfifo "$pipe"
# start watching for requests
while true
do
# watch the pipe for trigger events requesting lock screen status
read request < "$pipe"
# respond across the same pipe wit the current lock screen status
gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -oP "(true)|(false)" > "$pipe"
done
else
# make sure the pipe exists
if [ ! -e "$pipe" ]; then
echo "This script must started in service mode before lock status can be queried."
exit
fi
# send a request for screen lock status and read the response
touch "$pipe"
read status < "$pipe"
[ "$status" == "" ] && status="This script must started in service mode before lock status can be queried."
# print reponse to screen for use by calling application
echo $status
fi
Как было отмечено в комментариях, вам нужно вызвать этот сценарий двумя способами. Когда ваш пользователь входит в систему, запустите этот сценарий в сервисном режиме. Я использую программу «Запуск приложений» для вызова сценария, но на самом деле не имеет значения, как он вызывается до тех пор, пока он вызван вашей учетной записью пользователя при входе в систему. Затем из вашей пользовательской службы просто позвоните этому сценарию и он вернет «true», если экран заблокирован или «false», если экран разблокирован.
Является ли переменная DBUS_SESSION_BUS_ADDRESS в этом коде? –
Нет, это не так. Должно быть? –
Насколько мне известно, необходимо подключиться к шине, и pam_systemd должен установить это при входе в систему. Если он не установлен, запускается новый dbus, и вы не сможете разговаривать с другими вещами. Я ничего не знаю об этом, поэтому не забудь об этом. –