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.
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
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:
Avertissements:
Startup Applications
GUI et ça marchePS: a trouvé un "bug". Si vous interrompez le fondu d'écran, le clavier reste éteint.