xautolock: 사용자 활동에 따라 자동으로 잠금을 해제하는 방법은 무엇입니까?

xautolock: 사용자 활동에 따라 자동으로 잠금을 해제하는 방법은 무엇입니까?

일정 기간 동안 사용자 활동이 없으면 스크립트를 실행해야 합니다. 나는 이것을 위해 훌륭한 프로그램을 사용합니다 xautolock.

지금도 난 여전히 필요해활동이 재개되면 다른 스크립트 실행(마우스를 움직이거나 키를 누르는 등)

어떻게 해야 하나요? 어떤 종류의 xautolock 방지 장치가 있나요? xautoUNlock?

아니면 아마도 다른 어떤 것단순한'게으름'이 멈추는 순간을 어떻게 포착할 수 있을까?

답변1

유휴 상태를 확인하고 이에 따라 systemd-logind를 사용하여 세션 유휴 상태를 업데이트하기 위해 다음 스크립트를 작성했습니다. (일반적으로 이 작업은 세션 관리자에 의해 수행되지만 저는 세션 관리자를 실행하지 않습니다.) 이를 통해 systemd는 시스템이 자동으로 절전 모드로 전환될 수 IdleAction있는지 여부를 결정할 때 X11 및 ssh 로그인을 모두 고려하여 ( 및 기반) 시스템을 자동으로 절전 모드로 전환할 수 있습니다. 실행 중입니다. 게으른. 부분적으로 기반IdleActionSec/etc/systemd/logind.conf이것그리고이것.

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 구현과 관련된 또 다른 유사한 문제는 다음과 같습니다.시스템이 유휴 상태일 때와 다시 활성화될 때 명령을 실행합니다..

관련 정보