Merge pull request #21 from jtgans/dbus-fixes

applet: Make the AppletManager more resilient in the face of errors
This commit is contained in:
June Tate-Gans 2021-05-09 10:33:11 -07:00 committed by GitHub
commit d8fa49c1ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 12 deletions

View File

@ -47,7 +47,13 @@ class AppletManager(dbus.service.Object, Subject):
@activeApplet.setter
def activeApplet(self, appletName):
(name, appletProxy) = self._applets[appletName]
try:
self._activeApplet.Unpresent()
except dbus.exceptions.DBusException as err:
print('Failed to unpresent %s: %s' % (appletName, err))
self._removeActiveApplet()
self.setProperty('activeApplet', appletProxy)
self.onPresent()
@ -62,10 +68,24 @@ class AppletManager(dbus.service.Object, Subject):
def _updateLCD(self, frame):
self._manager.setLCDBuffer(frame)
def _removeActiveApplet(self):
senders = {proxy: name for (name, (_, proxy)) in self._applets.items()}
print('senders is %s' % (repr(senders)))
name = senders[self._activeApplet]
del self._applets[name]
self.addChange(ChangeType.REMOVE, 'applet', name)
self._activeApplet = self._switcher
self.activeApplet = 'Switcher'
def onPresent(self):
try:
frame = self._activeApplet.Present(time.time(), byte_arrays=True)
frame = bytes(frame)
self._updateLCD(frame)
except dbus.exceptions.DBusException as err:
print('Failed to present applet: %s' % (err))
self._removeActiveApplet()
def onKeyPressed(self, key):
# Swap to the switcher
@ -73,12 +93,22 @@ class AppletManager(dbus.service.Object, Subject):
self.activeApplet = 'Switcher'
return
frame = self._activeApplet.KeyPressed(time.time(), key.value['bit'])
try:
frame = self._activeApplet.KeyPressed(time.time(),
key.value['bit'])
self._updateLCD(frame)
except dbus.exceptions.DBusException as err:
print('Failed to send keyPressed for applet: %s' % (err))
self._removeActiveApplet()
def onKeyReleased(self, key):
frame = self._activeApplet.KeyReleased(time.time(), key.value['bit'])
try:
frame = self._activeApplet.KeyReleased(time.time(),
key.value['bit'])
self._updateLCD(frame)
except dbus.exceptions.DBusException as err:
print('Failed to send keyReleased for applet: %s' % (err))
self._removeActiveApplet()
def _registerApplet(self, name, sender):
proxy = self._bus.get_object(sender, '/com/theonelab/g13/Applet')

View File

@ -27,9 +27,7 @@ class Switcher(Observer):
self._applets = []
self._appletManager.registerObserver(self, {'activeApplet', 'applet'})
self.changeTrigger(self.onNewApplet,
changeType=ChangeType.ADD,
keys={'applet'})
self.changeTrigger(self.onAppletChange, keys={'applet'})
self._initWidgets()
@ -37,7 +35,7 @@ class Switcher(Observer):
def bus_name(self):
return self
def onNewApplet(self, subject, changeType, key, data):
def onAppletChange(self, subject, changeType, key, data):
self._applets = sorted(self._appletManager.appletNames)
self._lv.model = self._applets
self._lv.update()