diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 054cac30..279adba4 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -402,6 +402,7 @@ class Controller(Singleton): """ if self.is_screensaver_running: # New toast notifications break out of the Screensaver + print("Controller: stopping screensaver") self.screensaver.stop() if self.toast_notification_thread and self.toast_notification_thread.is_alive(): diff --git a/src/seedsigner/gui/toast.py b/src/seedsigner/gui/toast.py index 5d4a0403..a82fb33b 100644 --- a/src/seedsigner/gui/toast.py +++ b/src/seedsigner/gui/toast.py @@ -119,7 +119,7 @@ class BaseToastOverlayManagerThread(BaseThread): print(f"{self.__class__.__name__}: started") start = time.time() has_rendered = False - self.previous_screen_state = None + previous_screen_state = None if self.activation_delay > 0: time.sleep(self.activation_delay) @@ -151,7 +151,7 @@ class BaseToastOverlayManagerThread(BaseThread): print(f"{self.__class__.__name__}: Lock re-acquired") if not has_rendered: - self.previous_screen_state = self.renderer.canvas.copy() + previous_screen_state = self.renderer.canvas.copy() print(f"{self.__class__.__name__}: Showing toast") self.toast.render() has_rendered = True @@ -167,7 +167,8 @@ class BaseToastOverlayManagerThread(BaseThread): print(f"{self.__class__.__name__}: exiting") if has_rendered and self.renderer.lock.locked(): # As far as we know, we currently hold the Renderer.lock - self.renderer.show_image(self.previous_screen_state) + self.renderer.show_image(previous_screen_state) + print(f"{self.__class__.__name__}: restored previous screen state") # We're done, release the lock self.renderer.lock.release() diff --git a/src/seedsigner/views/screensaver.py b/src/seedsigner/views/screensaver.py index 9204690e..960df6c8 100644 --- a/src/seedsigner/views/screensaver.py +++ b/src/seedsigner/views/screensaver.py @@ -140,9 +140,9 @@ class ScreensaverScreen(LogoScreen): # never gives up the lock until it returns. with self.renderer.lock: try: - while True: + while self._is_running: if self.buttons.has_any_input() or self.buttons.override_ind: - return self.stop() + break # Must crop the image to the exact display size crop = self.image.crop(( @@ -175,20 +175,23 @@ class ScreensaverScreen(LogoScreen): self.increment_y = self.rand_increment() if self.increment_y > 0.0: self.increment_y *= -1.0 + except KeyboardInterrupt as e: # Exit triggered; close gracefully print("Shutting down Screensaver") - self.stop() # Have to let the interrupt bubble up to exit the main app raise e + finally: + self._is_running = False + + # Restore the original screen + self.renderer.show_image(self.last_screen) + def stop(self): - # Restore the original screen - self.renderer.show_image(self.last_screen) - self._is_running = False