diff --git a/g13gui/applet/manager.py b/g13gui/applet/manager.py index 35e6e08..b9250dc 100644 --- a/g13gui/applet/manager.py +++ b/g13gui/applet/manager.py @@ -47,7 +47,13 @@ class AppletManager(dbus.service.Object, Subject): @activeApplet.setter def activeApplet(self, appletName): (name, appletProxy) = self._applets[appletName] - self._activeApplet.Unpresent() + + 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): - frame = self._activeApplet.Present(time.time(), byte_arrays=True) - frame = bytes(frame) - self._updateLCD(frame) + 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']) - self._updateLCD(frame) + 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']) - self._updateLCD(frame) + 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') diff --git a/g13gui/applet/switcher.py b/g13gui/applet/switcher.py index ec5c934..d4ce824 100644 --- a/g13gui/applet/switcher.py +++ b/g13gui/applet/switcher.py @@ -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()