Выполнить команду в режиме ожидания / активно

Мне нужно запустить пользовательскую команду, когда:

  1. Компьютер бездействует в течение X минут (без нажатия клавиши)
  2. Нажатие клавиши

Что я на самом деле хочу достичь - это функция энергосбережения для моей клавиатуры.

Я хочу использовать:

g413-led -a 000000
g413-led -a FFFFFF

Для включения / выключения подсветки клавиатуры, используя https://github.com/MatMoul/g810-led .

Первое довольно легко, используя один из:

  • xidle
  • xprintidle
  • xautolock

Пожалуйста, советуйте, если есть лучше, более оптимальными способами?

Но как насчет того, чтобы снова зажечь его при нажатии клавиши или возобновить работу из режима ожидания? Я думаю, что выполнение команды при каждом нажатии клавиши является излишним. Есть ли событие для вариантов энергосбережения? Как работает энергосбережение дисплея?

enter image description here

Можно ли повторно использовать одни и те же события / тайм-аут?

2
задан 10 January 2018 в 13:05

2 ответа

Решение, которое я нашел, - это события 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.

4
ответ дан 10 January 2018 в 13:05

Крошечный фоновый процесс

Ваша установка кажется довольно сложной для простого вопроса. Я бы просто запустил крошечный фоновый процесс, проверяя время простоя раз в 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)
    
2
ответ дан 10 January 2018 в 13:05
  • 1
    Я пытался добавить за 20 секунд до рабочего гнома-демона настроек, но не имел никакой удачи. Это просто задержало 20-е, затем покажите мой рабочий стол. Но ничто не изменяется на экране входа в систему. – quangtruong1985 7 June 2012 в 17:03
  • 2
    Я пытался добавить за 20 секунд до рабочего гнома-демона настроек, но не имел никакой удачи. Это просто задержало 20-е, затем покажите мой рабочий стол. Но ничто не изменяется на экране входа в систему. – quangtruong1985 7 June 2012 в 17:03

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

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