То, как запустить скрипт в экранной блокировке / разблокировало в человечности 17.10

Моей проблемой является тот же этот вопрос, но я не могу получить его работающий в человечности 17.10:

Как выполнить команду, или сценарий в экране блокируют/разблокируют?

Я хочу запустить скрипт, который изменяет мою клавиатуру конфигурация RGB в экранных блокировках. Безупречные выполнения сценария. Проблема должна получить событие блокировки/разблокирования. У меня есть попытка с помощью dbus-монитора, как сказано в том вопросе и, как сказано здесь:

https://people.gnome.org/~mccann/gnome-screensaver/docs/gnome-screensaver.html

Так запущение этого скрипта:

#!/bin/bash

dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
( while true
    do read X
    if echo $X | grep "boolean true" &> /dev/null; then
        echo "locking at $(date)" >> $HOME/time_xprofile
    elif echo $X | grep "boolean false" &> /dev/null; then
        echo "unlocking at $(date)" >> $HOME/time_xprofile
    fi
    done )

Но это только работает... несколько раз (!).... Я не могу понять то, что происходит.

Я использую человечность 17.10 с гномом человечности по X-серверу (никакой Уэйленд) и имею гнома попытки ванили и имею ту же проблему.

У меня есть попытка также:

dbus-monitor > out.log

Для наблюдения ВСЕХ трассировок, которые происходят при блокировке/разблокировании и это не появляется тот сигнал... Только.... хорошо... буквально несколько раз...

Я не знаю, что сделать, знают, Любой совет будет полезен.

4
задан 13 November 2017 в 19:34

2 ответа

Если предположить, что вы используете Gnome, то сейчас я думаю, что лучше слушать сообщения LockedHint, а не заставки. Таким образом, вы не привязаны к реализации заставки.

Вот простой скрипт для этого:

gdbus monitor -y -d org.freedesktop.login1 | grep LockedHint

Дает это:

/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <true>}, @as [])
/org/freedesktop/login1/session/_32: org.freedesktop.DBus.Properties.PropertiesChanged ('org.freedesktop.login1.Session', {'LockedHint': <false>}, @as [])
3
ответ дан 1 December 2019 в 09:20

Использование существования процесса gnome-screensaver-dialog в качестве альтернативного триггера

Если dbus невозможно или не является предпочтительным по какой-либо причине, вы можете использовать существование процесса gnome-screensaver-dialog как триггер. Процесс вызывается на экране блокировки.

В скрипте Python:

#!/usr/bin/env python3
import psutil
import time
import subprocess

procname = "gnome-screensaver-dialog"
lock_command = "/path/to/lockscript"
unlock_command = "/path/to/unlockscript"

lock1 = None

while True:
    time.sleep(2)
    lock2 = procname in (p.name() for p in psutil.process_iter())
    if lock2 != lock1:
        if lock2:
            subprocess.Popen(lock_command)
            print("locked")
        else:
            subprocess.Popen(unlock_command)
            print("unlocked")
        lock1 = lock2

Как использовать

  1. Скопируйте скрипт в пустой файл, сохраните его как locktoggle.py
  2. [ 1115] В разделе заголовка:

    lock_command = "/path/to/lockscript"
    unlock_command = "/path/to/unlockscript"
    

    установите команды или пути к скриптам, которые вы хотите запустить (оставьте двойные кавычки!)

  3. Test - запустить скрипт с помощью команды:

    python3 /path/to/locktoggle.py
    

NB Если вы запускаете команду только для одного из событий блокировки / разблокировки, просто закомментируйте соответствующую строку в разделе:

if lock2 != lock1:
    if lock2:
        # subprocess.Popen(lock_command)
        print("locked")
    else:
        # subprocess.Popen(unlock_command)
        print("unlocked")
3
ответ дан 1 December 2019 в 09:20

Другие вопросы по тегам:

Похожие вопросы: