web-dev-qa-db-ja.com

画面の電源オフのDBUSイベントを購読する

私のMacBook Proにはかなり素晴らしいキーボードバックライトがありますが、わずかなバグがあります。一定の時間が経過すると画面が消えますが、キーボードバックライトは点灯したままです。

コピーして小さなDBUSを台無しにしましたPythonスクリプトはスクリーンセーバーの状態で変更が発生したときに監視しますが、スクリーンセーバーがアクティブになったときのみ、スクリーンがオフになったときにトリガーされませんまたは無効化:

from dbus.mainloop.glib import DBusGMainLoop

import dbus
import gobject
import logging

logging.basicConfig()

logger = logging.getLogger(__name__)

dbus_loop = DBusGMainLoop(set_as_default=True)

def message_callback(bus, message):
    if message.get_interface() == "org.gnome.ScreenSaver":
        if message.get_member() == "ActiveChanged":
            screensaver_enabled = bool(message.get_args_list()[0])
            logger.info("Screen saver changed. Active: %s", screensaver_enabled)

session = dbus.SessionBus(mainloop=dbus_loop)
session.add_match_string_non_blocking("interface='org.gnome.ScreenSaver'")

session.add_message_filter(message_callback)

logger.info("Starting up.")

loop = gobject.MainLoop()
loop.run()

これは、スクリーンセーバーがアクティブになっているときはいつでもうまく機能しますが、スクリーンの電源状態が変更されても変更されません。 [明るさ]および[設定のロック]に移動することで、1分後に画面の電源がオフになり、ロックされないように設定できます。その後、スクリーンセーバーの時間を別の時間(10分など)に設定できます。

Changed信号のorg.gnome.SettingsDaemon.Power.Screenインターフェイスでリッスンしようとしましたが、これは画面の輝度が手動で変更された場合にのみ発生します。

画面の電源状態がいつ変化したかを判断するために、何を聞くことができますか?キーボードのバックライトを無効にできるように、画面の電源がオフになるたびに実行するスクリプトを作成したいと思います。

2
Naftuli Kay

まあ、「評判」を持っていないのでコメントを残せないのは残念だ。これはソリューションというよりもコメントです。

似たようなものを探していましたが、代わりに「org.gnome.SessionManager.Presence」を監視しています。モニターの後ろにバイアス照明用のLEDがあり、モニターでLEDをオン/オフにしたい。

これは、コンピューターを手動でロックした場合に機能しますが、「スクリーンオフ」設定と「後のスクリーンロック」設定を異なる間隔のままにすると、モニターがオフになるとLEDがオフになりますが、スクリーンセーバーロックが作動するとLEDがオフになりますLEDが再び点灯します。

_getState () {
  dbus-monitor --session "type=signal,interface=org.gnome.SessionManager.Presence,member=StatusChanged" |
  while read x; do
    case "$x" in 
      *"uint32 3"*)
          /home/victor/bin/devices/kasa_cntrl.sh off
          echo -e "$(date)\t-\tTurned off" >> "$log"
          ;;
      *"uint32 0"*)
          /home/victor/bin/devices/kasa_cntrl.sh on
          echo -e "$(date)\t-\tTurned on" >> "$log"
          ;;
    esac
  done
}

リファレンスhttps://www.organicdesign.co.nz/PoisonTap_solution

3
victorbrca

Ubuntu 18.04をインストールしたところ、デフォルトではスクリーンセーバーが表示されていませんでした。そして、正直なところ、私はそれを欲しくないので、インストールを気にしません。

しかし、私はAddUserActiveWatchおよびorg.gnome.Mutter.IdleMonitorインターフェースからのRemoveWatchとトリックを行うように見えるgnomeからのメソッド呼び出しをいくつか見つけました。

これが私のスクリプトです。

#!/usr/bin/env python

import dbus, gobject
from dbus.mainloop.glib import DBusGMainLoop
from subprocess import call

def filter_cb(bus,message):
    if message.get_member() == "AddUserActiveWatch":
        print("Monitor off")
        call("/usr/bin/g810-led -dv 046d -dp c337 -a 000000", Shell=True)
    Elif message.get_member() == "RemoveWatch":
        print("Monitor on")
        call("/usr/bin/g810-led -dv 046d -dp c337 -p /etc/g810-led/profile", Shell=True)
    return

DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()

bus.add_match_string_non_blocking("interface='org.gnome.Mutter.IdleMonitor',eavesdrop='true'")
bus.add_message_filter(filter_cb)

mainloop = gobject.MainLoop ()
mainloop.run ()

結果は次のとおりです。

  • ディスプレイが暗くなり始めると、キーボードのバックライトがシャットダウンします
  • キーボードは、ログイン画面ではなく、正常にログインした後にのみ点灯します(ただし、十分近くにあります)

免責事項:

  1. Org.gnome.Mutter.IdleMonitorのWordモニターは、モニター(スクリーン)からではなく、モニタリングアクションから取得されます。したがって、これらは基本的に、ユーザーがgnomeによってアイドルであり、アイドルではないと宣言されたときに呼び出されるメソッドのようです。実際のところ、私の場合は、画面の電源が切れているのと同じです。あなたの場合、そうではないかもしれません。
  2. 画面が必要なため、これをsystemdエントリとして追加することはできません。ただし、Startup Applications GUIで追加することができ、動作します
  3. 私はg810主導の実行可能ファイルを使用してキーボードのバックライトをオンまたはオフにしますが、これは単なる例として扱う必要があります。他のキーボードでは動作しないことは明らかです。

PS:「バグ」が見つかりました。画面のフェードを中断すると、キーボードは消灯したままになります。

2
evilpenguin