summaryrefslogtreecommitdiffstats
path: root/Idle.py
diff options
context:
space:
mode:
Diffstat (limited to 'Idle.py')
-rw-r--r--Idle.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/Idle.py b/Idle.py
new file mode 100644
index 0000000..38137ea
--- /dev/null
+++ b/Idle.py
@@ -0,0 +1,47 @@
+import ctypes
+import ctypes.util
+
+from gi.repository import GdkX11
+
+
+class XScreenSaverInfo(ctypes.Structure):
+ _fields_ = [
+ ('window', ctypes.c_ulong),
+ ('state', ctypes.c_int),
+ ('kind', ctypes.c_int),
+ ('til_or_since', ctypes.c_ulong),
+ ('idle', ctypes.c_ulong),
+ ('eventMask', ctypes.c_ulong)
+ ]
+XScreenSaverInfo_p = ctypes.POINTER(XScreenSaverInfo)
+
+display_p = ctypes.c_void_p
+xid = ctypes.c_ulong
+c_int_p = ctypes.POINTER(ctypes.c_int)
+
+libXsspath = ctypes.util.find_library('Xss')
+if libXsspath == None:
+ raise OSError('libXss could not be found.')
+libXss = ctypes.cdll.LoadLibrary(libXsspath)
+libXss.XScreenSaverQueryExtension.argtypes = display_p, c_int_p, c_int_p
+libXss.XScreenSaverAllocInfo.restype = XScreenSaverInfo_p
+libXss.XScreenSaverQueryInfo.argtypes = (display_p, xid, XScreenSaverInfo_p)
+
+dpy_p = hash(GdkX11.x11_get_default_xdisplay())
+rootwindow = GdkX11.x11_get_default_root_xwindow()
+
+_event_basep = ctypes.c_int()
+_error_basep = ctypes.c_int()
+if libXss.XScreenSaverQueryExtension(ctypes.c_void_p(dpy_p), ctypes.byref(_event_basep),
+ ctypes.byref(_error_basep)) == 0:
+ raise OSError('XScreenSaver Extension not available on display.')
+
+xss_info_p = libXss.XScreenSaverAllocInfo()
+if xss_info_p == None:
+ raise OSError('XScreenSaverAllocInfo: Out of Memory.')
+
+def getIdleSec():
+ if libXss.XScreenSaverQueryInfo(dpy_p, rootwindow, xss_info_p) == 0:
+ return 0
+ else:
+ return int(xss_info_p.contents.idle) / 1000