summaryrefslogtreecommitdiffstats
path: root/pylock/Locker.py
diff options
context:
space:
mode:
Diffstat (limited to 'pylock/Locker.py')
-rw-r--r--pylock/Locker.py73
1 files changed, 73 insertions, 0 deletions
diff --git a/pylock/Locker.py b/pylock/Locker.py
new file mode 100644
index 0000000..5243609
--- /dev/null
+++ b/pylock/Locker.py
@@ -0,0 +1,73 @@
+# Copyright (c) 2012, Matthias Schiffer <mschiffer@universe-factory.net>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# 1. Redistributions of source code must retain the above copyright notice,
+# this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright notice,
+# this list of conditions and the following disclaimer in the documentation
+# and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+from gi.repository import Gtk, GLib
+
+
+class Locker(object):
+ def __init__(self, doLock, doUnlock, logoutTimeout = None, doLogout = None, updateLogoutTimeout = None):
+ self.locked = False
+ self.logoutTimeout = logoutTimeout
+ self.doLock = doLock
+ self.doUnlock = doUnlock
+ self.doLogout = doLogout
+ self.updateLogoutTimeout = updateLogoutTimeout
+
+ def _checkLogout(self):
+ if not self.locked:
+ return False
+
+ self.currentLogoutTimeout = self.currentLogoutTimeout - 1
+ if self.updateLogoutTimeout is not None:
+ self.updateLogoutTimeout(self.currentLogoutTimeout)
+
+ return self.currentLogoutTimeout > 0
+
+ def lock(self):
+ if not self.locked:
+ self.locked = True
+ if not self.doLock(self.logoutTimeout):
+ self.locked = False
+ GLib.timeout_add_seconds(1, self.lock)
+ return False
+
+ if self.doLogout is not None:
+ self.currentLogoutTimeout = self.logoutTimeout
+
+ if self.currentLogoutTimeout > 0:
+ GLib.timeout_add_seconds(1, self._checkLogout)
+
+ return True
+
+ def unlock(self):
+ if self.locked:
+ self.doUnlock()
+ self.locked = False
+
+ def _canLogout(self):
+ return (self.locked and self.doLogout is not None and self.currentLogoutTimeout <= 0)
+
+ def logout(self):
+ if self._canLogout():
+ self.doLogout()