Мне нужно запустить пользовательскую команду, когда:
Что я на самом деле хочу достичь - это функция энергосбережения для моей клавиатуры.
Я хочу использовать:
g413-led -a 000000
g413-led -a FFFFFF
Для включения / выключения подсветки клавиатуры, используя https://github.com/MatMoul/g810-led .
Первое довольно легко, используя один из:
Пожалуйста, советуйте, если есть лучше, более оптимальными способами?
Но как насчет того, чтобы снова зажечь его при нажатии клавиши или возобновить работу из режима ожидания? Я думаю, что выполнение команды при каждом нажатии клавиши является излишним. Есть ли событие для вариантов энергосбережения? Как работает энергосбережение дисплея?
Можно ли повторно использовать одни и те же события / тайм-аут?
Решение, которое я нашел, - это события DBUS.
Сначала я запустил dbus-monitor
, чтобы посмотреть, какие события будут срабатывать, когда монитор выходит из сна или выходит из него:
signal time=1515274499.244468 sender=org.freedesktop.DBus -> destination=:1.394 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.394"
signal time=1515274499.244502 sender=org.freedesktop.DBus -> destination=:1.394 serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string ":1.394"
signal time=1515274559.337480 sender=:1.6 -> destination=:1.2 serial=29015 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515274559.337878 sender=:1.2 -> destination=(null destination) serial=3288 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515274559.338267 sender=:1.2 -> destination=(null destination) serial=3290 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515274569.389778 sender=:1.6 -> destination=(null destination) serial=29018 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 2
string ""
signal time=1515274569.398929 sender=:1.6 -> destination=(null destination) serial=29019 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 2
string ""
signal time=1515274569.399633 sender=org.freedesktop.DBus -> destination=:1.6 serial=5195 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string "org.kde.StatusNotifierWatcher"
signal time=1515274569.399660 sender=org.freedesktop.DBus -> destination=(null destination) serial=850 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ":1.6"
string ""
signal time=1515274569.404274 sender=:1.6 -> destination=(null destination) serial=29022 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 2
string ""
signal time=1515274569.442137 sender=:1.6 -> destination=(null destination) serial=29025 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 2
string ""
signal time=1515274569.455035 sender=:1.6 -> destination=(null destination) serial=29027 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true
signal time=1515274569.657300 sender=:1.6 -> destination=:1.42 serial=29037 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515274569.657404 sender=:1.6 -> destination=(null destination) serial=29038 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276608.243100 sender=:1.6 -> destination=:1.2 serial=29039 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 489
signal time=1515276608.243573 sender=:1.2 -> destination=(null destination) serial=3291 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515276608.243843 sender=:1.2 -> destination=(null destination) serial=3292 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515276608.244032 sender=:1.6 -> destination=:1.42 serial=29040 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 494
signal time=1515276608.270459 sender=:1.6 -> destination=(null destination) serial=29042 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515276623.523917 sender=:1.6 -> destination=:1.42 serial=29043 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515276623.554451 sender=:1.6 -> destination=(null destination) serial=29047 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276668.529836 sender=:1.6 -> destination=:1.2 serial=29048 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515276668.530236 sender=:1.2 -> destination=(null destination) serial=3293 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515276668.530565 sender=:1.2 -> destination=(null destination) serial=3295 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515279067.394398 sender=:1.6 -> destination=:1.2 serial=29051 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 498
signal time=1515279067.394982 sender=:1.2 -> destination=(null destination) serial=3296 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515279067.395139 sender=:1.2 -> destination=(null destination) serial=3297 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515279067.395662 sender=:1.6 -> destination=:1.42 serial=29052 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 496
signal time=1515279067.414904 sender=:1.6 -> destination=(null destination) serial=29054 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515279076.828255 sender=:1.6 -> destination=(null destination) serial=29063 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 1
string ""
signal time=1515279076.829775 sender=org.freedesktop.DBus -> destination=(null destination) serial=851 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ""
string ":1.6"
signal time=1515279076.829812 sender=org.freedesktop.DBus -> destination=:1.6 serial=5215 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string "org.kde.StatusNotifierWatcher"
signal time=1515279076.829824 sender=:1.6 -> destination=(null destination) serial=29066 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 1
string ""
signal time=1515279076.841923 sender=:1.6 -> destination=(null destination) serial=29067 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 1
string ""
signal time=1515279076.844396 sender=:1.6 -> destination=(null destination) serial=29068 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 1
string ""
signal time=1515279076.851323 sender=:1.6 -> destination=(null destination) serial=29069 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean false
signal time=1515279076.896958 sender=:1.6 -> destination=(null destination) serial=29218 path=/StatusNotifierWatcher; interface=org.kde.StatusNotifierWatcher; member=StatusNotifierItemRegistered
string "/"
signal time=1515279076.921110 sender=:1.38 -> destination=(null destination) serial=2735 path=/org/gnome/evolution/dataserver/CalendarView/1887/93; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279076.924727 sender=:1.34 -> destination=(null destination) serial=2701 path=/org/gnome/evolution/dataserver/CalendarView/1870/92; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279077.686970 sender=:1.6 -> destination=(null destination) serial=30014 path=/StatusNotifierWatcher; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.kde.StatusNotifierWatcher"
array [
dict entry(
string "RegisteredStatusNotifierItems"
variant array [
string ":1.66/org/ayatana/NotificationItem/software_update_available"
]
)
]
array [
Сначала я пытался перейти к org.gnome.Mutter.IdleMonitor
, но значения uint32
постоянно увеличивались , не уверен почему?
Я согласился с StatusChanged, вот последний сценарий:
#!/bin/bash
# Turn keyboard backlight on/off using https://github.com/MatMoul/g810-led
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type=signal,interface=org.gnome.SessionManager.Presence,member=StatusChanged" |
while read x; do
case "$x" in
*"uint32 3"*) g413-led -a 000000;;
*"uint32 0"*) g413-led -a FFFFFF;;
esac
done
Также могут работать события заставки:
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) g413-led -a 000000;;
*"boolean false"*) g413-led -a FFFFFF;;
esac
done
Конечно, вы Можно поставить любую команду, какую пожелаете. Преимущество первого сценария по сравнению с этим состоит в том, что он освещает клавиатуру перед входом пользователя, что облегчает ввод пароля.
Единственным недостатком является то, что клавиатура загорается после входа пользователя, а не нажатия клавиш, но я могу жить с этим.
Я экспериментировал с:
dbus-monitor --session "type='signal',interface='org.freedesktop.DBus.Properties',path='/org/gnome/Mutter/DisplayConfig'" | grep 'variant int32' |
while read x; do
case "$x" in
*"variant int32 3"*) g413-led -a 000000;;
*"variant int32 0"*) g413-led -a FFFFFF;;
esac
done
, но по какой-то причине это не сработало, возможно, проблема с grep.
Ваша установка кажется довольно сложной для простого вопроса. Я бы просто запустил крошечный фоновый процесс, проверяя время простоя раз в 2 секунды или около того, предпринимал одно действие, если время простоя превышает лимит, и другое действие, если он переключался на значение ниже установленного времени простоя.
#!/usr/bin/env python3
import time
import subprocess
# set idle time (seconds)
t = 60
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
def set_state(cmd):
subprocess.Popen(cmd)
def get_idle():
return int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000
idle1 = 0
while True:
time.sleep(2)
idle2 = get_idle()
# if idle time exceeds (passes) the limit, run one command
if all([idle2 >= t, idle1 < t]):
set_state(on_idle)
# if idle time switches to below (passes) the limit, run another command
elif all([idle2 <= t, idle1 > t]):
set_state(on_active)
idle1 = idle2
Убедитесь, что xprintidle
установлено
sudo apt install xprintidle
Скопируйте скрипт в пустой файл, сохраните его как switch_light.py
Установите желаемое время простоя для выполнения действий после:
# set idle time (seconds)
t = 60
Запустите его командой:
python3 /path/to/switch_light.py
Если все работает нормально, добавьте его в Startup Applications.
Не удалось проверить это, так как у меня нет вашей клавиатуры, но я тестировал с другими командами, он отлично справляется со своей работой.
Вы можете использовать скрипт с любой другой командой:
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
Просто убедитесь, что вы разделяете аргументы, как в примере.
Если вы хотите, чтобы действие превышало время простоя (или наоборот), просто закомментируйте:
# if idle time switches to below (passes) the limit, run another
elif all([idle2 <= t, idle1 > t]):
set_state(on_active)