Handle failed device grabs and retry lock
This commit is contained in:
parent
76532c4965
commit
e342d5c724
3 changed files with 21 additions and 4 deletions
|
@ -42,6 +42,7 @@ class LockWindow(Gtk.Window):
|
||||||
|
|
||||||
self.display = Gdk.Display.get_default()
|
self.display = Gdk.Display.get_default()
|
||||||
self.screen = self.display.get_default_screen()
|
self.screen = self.display.get_default_screen()
|
||||||
|
self.devicesGrabbed = False
|
||||||
|
|
||||||
self.overlay = Gtk.Overlay()
|
self.overlay = Gtk.Overlay()
|
||||||
self.add(self.overlay)
|
self.add(self.overlay)
|
||||||
|
@ -135,22 +136,33 @@ class LockWindow(Gtk.Window):
|
||||||
def _grabDevices(self, w, e):
|
def _grabDevices(self, w, e):
|
||||||
self.promptEntry.grab_focus()
|
self.promptEntry.grab_focus()
|
||||||
|
|
||||||
|
if not self.devicesGrabbed:
|
||||||
for device in self.deviceManager.list_devices(Gdk.DeviceType.MASTER):
|
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.present()
|
||||||
|
|
||||||
|
self.devicesGrabbed = True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _ungrabDevices(self):
|
def _ungrabDevices(self):
|
||||||
for device in self.deviceManager.list_devices(Gdk.DeviceType.MASTER):
|
for device in self.deviceManager.list_devices(Gdk.DeviceType.MASTER):
|
||||||
device.ungrab(Gdk.CURRENT_TIME)
|
device.ungrab(Gdk.CURRENT_TIME)
|
||||||
|
self.devicesGrabbed = False
|
||||||
|
|
||||||
def lock(self):
|
def lock(self):
|
||||||
self.show_all()
|
self.show_all()
|
||||||
|
self.display.sync()
|
||||||
|
self._grabDevices(self, None)
|
||||||
|
return self.devicesGrabbed
|
||||||
|
|
||||||
def unlock(self):
|
def unlock(self):
|
||||||
self._ungrabDevices()
|
self._ungrabDevices()
|
||||||
|
|
||||||
self.hide()
|
self.hide()
|
||||||
|
|
||||||
self.reset(False, True)
|
self.reset(False, True)
|
||||||
|
|
|
@ -66,7 +66,10 @@ class Locker(object):
|
||||||
def lock(self):
|
def lock(self):
|
||||||
if not self.locked:
|
if not self.locked:
|
||||||
self.locked = True
|
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:
|
if self.doLogout is not None:
|
||||||
self.currentLogoutTimeout = self.logoutTimeout
|
self.currentLogoutTimeout = self.logoutTimeout
|
||||||
|
@ -74,6 +77,8 @@ class Locker(object):
|
||||||
if self.currentLogoutTimeout > 0:
|
if self.currentLogoutTimeout > 0:
|
||||||
GLib.timeout_add_seconds(1, self._checkLogout)
|
GLib.timeout_add_seconds(1, self._checkLogout)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
def unlock(self):
|
def unlock(self):
|
||||||
if self.locked:
|
if self.locked:
|
||||||
self.doUnlock()
|
self.doUnlock()
|
||||||
|
|
|
@ -91,7 +91,7 @@ if not Message.acquireSelection(window):
|
||||||
|
|
||||||
def lock(timeLeft):
|
def lock(timeLeft):
|
||||||
window.updateLockMessage(args.username, timeLeft)
|
window.updateLockMessage(args.username, timeLeft)
|
||||||
window.lock()
|
return window.lock()
|
||||||
|
|
||||||
def logout():
|
def logout():
|
||||||
try:
|
try:
|
||||||
|
|
Reference in a new issue