Handle failed device grabs and retry lock

This commit is contained in:
Matthias Schiffer 2013-01-28 14:31:07 +01:00
parent 76532c4965
commit e342d5c724
3 changed files with 21 additions and 4 deletions

View file

@ -42,6 +42,7 @@ class LockWindow(Gtk.Window):
self.display = Gdk.Display.get_default()
self.screen = self.display.get_default_screen()
self.devicesGrabbed = False
self.overlay = Gtk.Overlay()
self.add(self.overlay)
@ -135,22 +136,33 @@ class LockWindow(Gtk.Window):
def _grabDevices(self, w, e):
self.promptEntry.grab_focus()
if not self.devicesGrabbed:
for device in self.deviceManager.list_devices(Gdk.DeviceType.MASTER):
device.grab(self.get_window(), Gdk.GrabOwnership.APPLICATION, True, Gdk.EventMask.ALL_EVENTS_MASK, None, Gdk.CURRENT_TIME)
if device.grab(self.get_window(), Gdk.GrabOwnership.APPLICATION, True, Gdk.EventMask.ALL_EVENTS_MASK, None, Gdk.CURRENT_TIME) != Gdk.GrabStatus.SUCCESS:
self._ungrabDevices()
self.get_window().lower()
return False
self.present()
self.devicesGrabbed = True
return False
def _ungrabDevices(self):
for device in self.deviceManager.list_devices(Gdk.DeviceType.MASTER):
device.ungrab(Gdk.CURRENT_TIME)
self.devicesGrabbed = False
def lock(self):
self.show_all()
self.display.sync()
self._grabDevices(self, None)
return self.devicesGrabbed
def unlock(self):
self._ungrabDevices()
self.hide()
self.reset(False, True)

View file

@ -66,7 +66,10 @@ class Locker(object):
def lock(self):
if not self.locked:
self.locked = True
self.doLock(self.logoutTimeout)
if not self.doLock(self.logoutTimeout):
self.locked = False
GLib.timeout_add_seconds(1, self._checkLock)
return False
if self.doLogout is not None:
self.currentLogoutTimeout = self.logoutTimeout
@ -74,6 +77,8 @@ class Locker(object):
if self.currentLogoutTimeout > 0:
GLib.timeout_add_seconds(1, self._checkLogout)
return True
def unlock(self):
if self.locked:
self.doUnlock()

View file

@ -91,7 +91,7 @@ if not Message.acquireSelection(window):
def lock(timeLeft):
window.updateLockMessage(args.username, timeLeft)
window.lock()
return window.lock()
def logout():
try: