web-dev-qa-db-fra.com

Abonnez-vous à l'événement DBUS de mise hors tension de l'écran

Mon MacBook Pro a un rétro-éclairage du clavier qui est assez génial, mais il y a un léger bug: l'écran s'éteint après un certain temps, mais le rétro-éclairage du clavier reste allumé.

J'ai copié et joué avec un petit DBUS Python pour surveiller les changements avec l'état de l'économiseur d'écran, mais il n'est pas déclenché lorsque l'écran s'éteint, uniquement lorsque l'économiseur d'écran s'active ou désactive:

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()

Cela fonctionne très bien chaque fois que l'économiseur d'écran est activé, mais ne se modifie pas si l'état de l'alimentation de l'écran change, ce qui peut se produire indépendamment de l'économiseur d'écran. En allant dans Luminosité et verrouillage dans les paramètres, vous pouvez configurer les écrans pour qu'ils s'éteignent après 1 minute et ne se verrouillent pas. Vous pouvez ensuite régler l'heure de l'économiseur d'écran sur une durée différente, par exemple 10 minutes.

J'ai essayé d'écouter le org.gnome.SettingsDaemon.Power.Screen interface pour le signal Changed, mais cela ne se produit que lorsque la luminosité de l'écran est modifiée manuellement.

Que puis-je écouter afin de déterminer quand l'état d'alimentation de l'écran a changé? Je veux écrire un script qui s'exécute chaque fois que l'écran s'éteint afin que je puisse désactiver le rétroéclairage de mon clavier.

2
Naftuli Kay

Eh bien, ça craint que je ne puisse pas laisser de commentaire car je n'ai pas la "réputation". Il s'agit plus d'un commentaire que d'une solution.

Je cherchais quelque chose de similaire, et je surveille plutôt 'org.gnome.SessionManager.Presence'. J'ai des LED derrière mon moniteur pour un éclairage biaisé, et je veux les éteindre/les allumer avec le moniteur.

Cela fonctionne si je verrouille mon ordinateur manuellement, mais si je laisse les paramètres "écran éteint" et "écran verrouillé après" à différents intervalles, les voyants s'éteignent lorsque le moniteur s'éteint, mais lorsque le verrouillage de l'économiseur d'écran se déclenche, il Les LED se rallument.

_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
}

Référence: https://www.organicdesign.co.nz/PoisonTap_solution

3
victorbrca

Je viens d'installer Ubuntu 18.04 et il s'avère qu'aucun économiseur d'écran n'est présent par défaut. Et honnêtement, je n'en veux pas, donc je ne prendrai pas la peine d'en installer un.

Cependant, j'ai trouvé des appels de méthode de gnome qui semblent faire l'affaire: AddUserActiveWatch et RemoveWatch de org.gnome.Mutter.IdleMonitor interface.

Voici mon script:

#!/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 ()

Le résultat est:

  • lorsque l'écran commence à s'éteindre, le rétroéclairage de mon clavier est éteint
  • le clavier ne s'allume qu'après que je me suis connecté avec succès, pas dans l'écran de connexion (mais c'est assez proche)

Avertissements:

  1. Le moniteur Word dans org.gnome.Mutter.IdleMonitor provient de l'action de surveillance, pas de l'écran aka du moniteur. Donc, fondamentalement, ces méthodes semblent être appelées lorsque l'utilisateur est déclaré inactif et non inactif par gnome. En fait, dans mon cas, cela coïncide avec la mise hors tension de l'écran. Dans votre cas, ce n'est peut-être pas le cas.
  2. Apparemment, vous ne pouvez pas ajouter cela en tant qu'entrée systemd, car il a besoin d'un écran. Cependant, vous pouvez l'ajouter dans le Startup Applications GUI et ça marche
  3. J'utilise un exécutable dirigé par g810 pour allumer et éteindre le rétroéclairage de mon clavier, qui devrait être traité comme un exemple, car cela ne fonctionnera évidemment pas sur d'autres claviers

PS: a trouvé un "bug". Si vous interrompez le fondu d'écran, le clavier reste éteint.

2
evilpenguin