xautolock: comment déverrouiller automatiquement l'activité de l'user?

J'ai besoin d'exécuter un script après une période d'inactivité de l'user. Pour cela j'utilise le magnifique programme xautolock .

Maintenant, j'ai aussi besoin d' exécuter un autre script lorsque l'activité est reprise (par exemple, la souris est déplacée ou une touche est enfoncée).

Comment je fais ça? Toute sorte d'anti-xautolock? Un xautoUNlock?

Ou, peut-être, d'autres moyens faciles pour saisir le moment où la «paresse» s'arrête?

J'ai écrit le script suivant pour vérifier l'inactivité et mettre à jour le statut d'inactivité de la session avec systemd-logind en conséquence. (Normalement cela serait fait par le gestionnaire de session, mais je n'en lance pas). Cela permet à systemd de mettre automatiquement le système en veille (basé sur IdleAction et IdleActionSec dans /etc/systemd/logind.conf ), en /etc/systemd/logind.conf en count à la fois X11 et ssh pour déterminer si le système est inactif. Basé en partie sur ceci et ceci .

Vous pouvez modifier la class login1_idle pour exécuter les scripts que vous voulez.

 #!/usr/bin/python import ctypes import os import dbus import time # Timing parameters, in s idle_threshold = 60 # Amount of idle time required to consider things truly idle check_interval = 50 # How often to check the X server idle indication class login1_idle: def __init__(self): self.flag = 0 bus = dbus.SystemBus() seat = bus.get_object('org.freedesktop.login1', '/org/freedesktop/login1/seat/' + os.environ['XDG_SEAT']) active_session = seat.Get('org.freedesktop.login1.Seat', 'ActiveSession', dbus_interface='org.freedesktop.DBus.Properties') session_obj_path = active_session[1] self.session = bus.get_object('org.freedesktop.login1', session_obj_path); def on_busy(self): self.flag = 0 self.session.SetIdleHint(False, dbus_interface='org.freedesktop.login1.Session') def on_idle(self): self.flag = 1 self.session.SetIdleHint(True, dbus_interface='org.freedesktop.login1.Session') class XScreenSaverInfo(ctypes.Structure): """ typedef struct { ... } XScreenSaverInfo; """ _fields_ = [('window', ctypes.c_ulong), # screen saver window ('state', ctypes.c_int), # off,on,disabled ('kind', ctypes.c_int), # blanked,internal,external ('since', ctypes.c_ulong), # milliseconds ('idle', ctypes.c_ulong), # milliseconds ('event_mask', ctypes.c_ulong)] # events xlib = ctypes.cdll.LoadLibrary('libX11.so') display = xlib.XOpenDisplay(os.environ['DISPLAY']) xss = ctypes.cdll.LoadLibrary('libXss.so.1') xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo) xssinfo = xss.XScreenSaverAllocInfo() idle = login1_idle() while True: xss.XScreenSaverQueryInfo(display, xlib.XDefaultRootWindow(display), xssinfo) #print "idle: %d ms" % xssinfo.contents.idle if xssinfo.contents.idle > idle_threshold * 1000 and not idle.flag: print time.strftime('%c') + " doing on_idle" idle.on_idle() elif xssinfo.contents.idle < idle_threshold * 1000 and idle.flag: print time.strftime('%c') + " doing on_busy" idle.on_busy() #print idle.session.Get('org.freedesktop.login1.Session', # 'IdleHint', # dbus_interface='org.freedesktop.DBus.Properties') time.sleep(check_interval) 

Une autre question similaire avec une implémentation C / bash est Exécuter une command lorsque le système est inactif et quand est de nouveau actif .