web-dev-qa-db-ja.com

xautolock:ユーザーアクティビティを自動ロック解除する方法は?

ユーザーが一定期間操作を行わなかった後、スクリプトを実行する必要があります。そのために私は素晴らしいプログラムxautolockを使用します。

ここで、アクティビティが再開されたときに別のスクリプトを実行する(たとえば、マウスを動かしたり、キーを押したりする)も必要です。

それ、どうやったら出来るの?なんらかのアンチxautolock? xautoUNlock?

または、おそらく、「アイドル」が止まる瞬間を捉える他の簡単な方法はありますか?

アイドル状態をチェックし、それに応じてsystemd-logindでセッションのアイドル状態を更新する次のスクリプトを作成しました。 (通常、これはセッションマネージャーによって実行されますが、実行しません。)これにより、systemdはシステムを自動的にスリープ状態にします(IdleActionおよびIdleActionSecに基づいて/etc/systemd/logind.conf)、システムがアイドル状態であるかどうかを判断するときにX11ログインとsshログインの両方を考慮します。 this および this に部分的に基づいています。

Login1_idleクラスを変更して、必要なスクリプトを実行できます。

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

C/bashの実装に関する別の同様の質問は システムがアイドル状態のときにコマンドを実行し、再びアクティブになったときにコマンドを実行する です。

2
Andy