From 7334ea1970f0b26555a2d90e330f82be9c8e3c9f Mon Sep 17 00:00:00 2001 From: fedebuyito <126606287+fedebuyito@users.noreply.github.com> Date: Thu, 29 Aug 2024 10:24:22 -0300 Subject: [PATCH 01/88] solves issue #555 (Update keyboard.py) Growning "del" button size property (from 2 to 3) solves navigation issue ("6th dice" -> "del"). solves issue #555 --- src/seedsigner/gui/keyboard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/seedsigner/gui/keyboard.py b/src/seedsigner/gui/keyboard.py index 96f83441..e09f0acc 100644 --- a/src/seedsigner/gui/keyboard.py +++ b/src/seedsigner/gui/keyboard.py @@ -31,7 +31,7 @@ class Keyboard: "code": "DEL", "letter": "del", "font": COMPACT_KEY_FONT, - "size": 2, + "size": 3, } KEY_SPACE = { "code": "SPACE", From 37ed4a0510e4c1b5a8bb156c3258ce52bd0992eb Mon Sep 17 00:00:00 2001 From: fedebuyito <126606287+fedebuyito@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:12:18 -0300 Subject: [PATCH 02/88] Update keyboard.py Additional differents sizes "del" buttons --- src/seedsigner/gui/keyboard.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/seedsigner/gui/keyboard.py b/src/seedsigner/gui/keyboard.py index e09f0acc..a094f8e1 100644 --- a/src/seedsigner/gui/keyboard.py +++ b/src/seedsigner/gui/keyboard.py @@ -33,6 +33,30 @@ class Keyboard: "font": COMPACT_KEY_FONT, "size": 3, } + KEY_BACKSPACE_2 = { + "code": "DEL", + "letter": "del", + "font": COMPACT_KEY_FONT, + "size": 2, + } + KEY_BACKSPACE_4 = { + "code": "DEL", + "letter": "del", + "font": COMPACT_KEY_FONT, + "size": 4, + } + KEY_BACKSPACE_5 = { + "code": "DEL", + "letter": "del", + "font": COMPACT_KEY_FONT, + "size": 5, + } + KEY_BACKSPACE_6 = { + "code": "DEL", + "letter": "del", + "font": COMPACT_KEY_FONT, + "size": 6, + } KEY_SPACE = { "code": "SPACE", "letter": "space", From 939114a53244ffbc094d90d1ac280a07deb5575b Mon Sep 17 00:00:00 2001 From: fedebuyito <126606287+fedebuyito@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:18:49 -0300 Subject: [PATCH 03/88] Update screen.py new custom_additional_keys prop on KeyboardScreen class for can to change additional button (KEY_BACKSPACE) on its childs classes --- src/seedsigner/gui/screens/screen.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/seedsigner/gui/screens/screen.py b/src/seedsigner/gui/screens/screen.py index a77997ab..fc1d5e8e 100644 --- a/src/seedsigner/gui/screens/screen.py +++ b/src/seedsigner/gui/screens/screen.py @@ -1051,6 +1051,8 @@ class KeyboardScreen(BaseTopNavScreen): return_after_n_chars: int = None show_save_button: bool = False initial_value: str = "" + from dataclasses import dataclass, field + custom_additional_keys: dict = field(default_factory=lambda: Keyboard.ADDITIONAL_KEYS) def __post_init__(self): super().__post_init__() @@ -1106,6 +1108,7 @@ class KeyboardScreen(BaseTopNavScreen): GUIConstants.EDGE_PADDING + self.keyboard_width, keyboard_start_y + self.rows * self.key_height + (self.rows - 1) * 2 ), + additional_keys=self.custom_additional_keys, auto_wrap=[Keyboard.WRAP_LEFT, Keyboard.WRAP_RIGHT], render_now=False ) From 508a326e400cb0bc7d18419fae700253b03463dd Mon Sep 17 00:00:00 2001 From: fedebuyito <126606287+fedebuyito@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:30:22 -0300 Subject: [PATCH 04/88] Update seed_screens.py Changing KEY_BACKSPACE size on BIP39, SeedBIP85, SeedCustomDerivation, symbols_1, symbols_2 screens --- src/seedsigner/gui/screens/seed_screens.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/seedsigner/gui/screens/seed_screens.py b/src/seedsigner/gui/screens/seed_screens.py index 64fb7ea9..2fc66987 100644 --- a/src/seedsigner/gui/screens/seed_screens.py +++ b/src/seedsigner/gui/screens/seed_screens.py @@ -50,6 +50,7 @@ class SeedMnemonicEntryScreen(BaseTopNavScreen): GUIConstants.EDGE_PADDING + self.keyboard_width, self.canvas_height ), + additional_keys=[Keyboard.KEY_BACKSPACE_4], auto_wrap=[Keyboard.WRAP_LEFT, Keyboard.WRAP_RIGHT] ) @@ -540,6 +541,7 @@ class SeedBIP85SelectChildIndexScreen(KeyboardScreen): self.cols = 5 self.keys_charset = "0123456789" self.show_save_button = True + self.custom_additional_keys = [Keyboard.KEY_BACKSPACE_5] super().__post_init__() @@ -572,6 +574,7 @@ class SeedExportXpubCustomDerivationScreen(KeyboardScreen): self.cols = 6 self.keys_charset = "/'0123456789" self.show_save_button = True + self.custom_additional_keys = [Keyboard.KEY_BACKSPACE_6] super().__post_init__() @@ -741,7 +744,7 @@ class SeedAddPassphraseScreen(BaseTopNavScreen): Keyboard.KEY_SPACE_2, Keyboard.KEY_CURSOR_LEFT, Keyboard.KEY_CURSOR_RIGHT, - Keyboard.KEY_BACKSPACE + Keyboard.KEY_BACKSPACE_2 ], auto_wrap=[Keyboard.WRAP_LEFT, Keyboard.WRAP_RIGHT], render_now=False @@ -762,7 +765,7 @@ class SeedAddPassphraseScreen(BaseTopNavScreen): Keyboard.KEY_SPACE_2, Keyboard.KEY_CURSOR_LEFT, Keyboard.KEY_CURSOR_RIGHT, - Keyboard.KEY_BACKSPACE + Keyboard.KEY_BACKSPACE_2 ], auto_wrap=[Keyboard.WRAP_LEFT, Keyboard.WRAP_RIGHT], render_now=False From bab88097b4ad487ea833be222919e4ec101c8e93 Mon Sep 17 00:00:00 2001 From: fedebuyito <126606287+fedebuyito@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:52:05 -0300 Subject: [PATCH 05/88] Update tools_screens.py Changing KEY_BACKSPACE size on ToolsDiceEntropy and ToolsCoinFlip screens --- src/seedsigner/gui/screens/tools_screens.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/seedsigner/gui/screens/tools_screens.py b/src/seedsigner/gui/screens/tools_screens.py index 13fa33be..1b57ecf7 100644 --- a/src/seedsigner/gui/screens/tools_screens.py +++ b/src/seedsigner/gui/screens/tools_screens.py @@ -129,6 +129,7 @@ class ToolsDiceEntropyEntryScreen(KeyboardScreen): def __post_init__(self): # Override values set by the parent class self.title = f"Dice Roll 1/{self.return_after_n_chars}" + self.custom_additional_keys = [Keyboard.KEY_BACKSPACE] # Specify the keys in the keyboard self.rows = 3 @@ -187,7 +188,8 @@ class ToolsCoinFlipEntryScreen(KeyboardScreen): def __post_init__(self): # Override values set by the parent class self.title = f"Coin Flip 1/{self.return_after_n_chars}" - + self.custom_additional_keys = [Keyboard.KEY_BACKSPACE_2] + # Specify the keys in the keyboard self.rows = 1 self.cols = 4 From 3c967a0e02aa1ebdcad523b556bc84755637d13a Mon Sep 17 00:00:00 2001 From: fedebuyito <126606287+fedebuyito@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:54:54 -0300 Subject: [PATCH 06/88] Update tools_screens.py Missed import sentence for commands on last commit --- src/seedsigner/gui/screens/tools_screens.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/seedsigner/gui/screens/tools_screens.py b/src/seedsigner/gui/screens/tools_screens.py index 1b57ecf7..d5e6106b 100644 --- a/src/seedsigner/gui/screens/tools_screens.py +++ b/src/seedsigner/gui/screens/tools_screens.py @@ -9,6 +9,7 @@ from seedsigner.gui.components import FontAwesomeIconConstants, Fonts, GUIConsta from seedsigner.gui.screens.screen import RET_CODE__BACK_BUTTON, BaseScreen, ButtonListScreen, KeyboardScreen from seedsigner.hardware.buttons import HardwareButtonsConstants from seedsigner.models.settings_definition import SettingsConstants, SettingsDefinition +from seedsigner.gui.keyboard import Keyboard From f596febf5c878f8443b86bd7ba5949743883a859 Mon Sep 17 00:00:00 2001 From: 1abdelhalim Date: Thu, 3 Apr 2025 01:35:33 +0200 Subject: [PATCH 07/88] Update Linux section in USB relay Docs --- docs/usb_relay.md | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/docs/usb_relay.md b/docs/usb_relay.md index 38526571..243aaab9 100644 --- a/docs/usb_relay.md +++ b/docs/usb_relay.md @@ -142,19 +142,47 @@ see: https://www.circuitbasics.com/raspberry-pi-zero-ethernet-gadget/ ### Linux -To enable IP forwarding on your Host: -``` -nano /etc/sysctl.conf -``` -and uncomment the following line: +To enable internet sharing on your Linux host: + +#### Step 1: Enable IP Forwarding +```bash +# Check current IP forwarding status +cat /proc/sys/net/ipv4/ip_forward + +# Enable IP forwarding temporarily +sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" + +# Enable permanently +sudo nano /etc/sysctl.conf +``` +Uncomment or add: ``` net.ipv4.ip_forward = 1 ``` +Save and apply: +```bash +sudo sysctl -p +``` -Then run `sudo sysctl -p` to have immediate effect. +#### Step 2: Configure Network Sharing +```bash +# Assuming eth0 is your internet-connected interface and usb0 is the USB interface +sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE +sudo iptables -A FORWARD -i usb0 -o eth0 -j ACCEPT +sudo iptables -A FORWARD -i eth0 -o usb0 -m state --state RELATED,ESTABLISHED -j ACCEPT -You should now be able to SSH into your internet connected Pi Zero 1.3, as described in the ["Get started"](#get-started) section. +# Save the rules +sudo apt install iptables-persistent +sudo netfilter-persistent save +sudo netfilter-persistent reload +``` + +#### Step 3: Test the Connection +```bash +ping 8.8.8.8 +``` +If you see responses, the Pi has internet access. ## Set a static IP on Linux From 936865b8b2ec28f520436a4d7aa5768eebbe9882 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Thu, 17 Apr 2025 12:28:26 -0500 Subject: [PATCH 08/88] [IMP] Disable screensaver during SeedQR transcription Disables the screensaver entirely while the SeedQR transcription routine is active. Any view can be configured to allow or disallow screensaver activation. --- src/seedsigner/controller.py | 7 ++++++- src/seedsigner/hardware/buttons.py | 8 +++++++- src/seedsigner/views/seed_views.py | 3 ++- src/seedsigner/views/view.py | 1 + 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index d8a3467a..667d7753 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -1,6 +1,7 @@ import logging import time import traceback +from typing import Optional from embit.descriptor import Descriptor from embit.psbt import PSBT @@ -14,7 +15,7 @@ from seedsigner.models.settings import Settings from seedsigner.models.singleton import Singleton from seedsigner.models.threads import BaseThread from seedsigner.views.screensaver import ScreensaverScreen -from seedsigner.views.view import Destination +from seedsigner.views.view import Destination, View logger = logging.getLogger(__name__) @@ -466,3 +467,7 @@ class Controller(Singleton): exception_msg, ] return Destination(UnhandledExceptionView, view_args={"error": error}, clear_history=True) + + @property + def active_view(self) -> Optional[View]: + return self.back_stack[-1].view if self.back_stack else None diff --git a/src/seedsigner/hardware/buttons.py b/src/seedsigner/hardware/buttons.py index 2f1a6725..450b009c 100644 --- a/src/seedsigner/hardware/buttons.py +++ b/src/seedsigner/hardware/buttons.py @@ -89,7 +89,13 @@ class HardwareButtons(Singleton): return HardwareButtonsConstants.OVERRIDE cur_time = int(time.time() * 1000) - if cur_time - self.last_input_time > controller.screensaver_activation_ms and not controller.is_screensaver_running: + active_view = controller.active_view + active_view_allows_screensaver = True + if active_view: + active_view_allows_screensaver = active_view.allow_screensaver + + if (cur_time - self.last_input_time > controller.screensaver_activation_ms + and not controller.is_screensaver_running and active_view_allows_screensaver): # Start the screensaver. Will block execution until input detected. controller.start_screensaver() diff --git a/src/seedsigner/views/seed_views.py b/src/seedsigner/views/seed_views.py index cd7d9cc9..74438153 100644 --- a/src/seedsigner/views/seed_views.py +++ b/src/seedsigner/views/seed_views.py @@ -1567,7 +1567,8 @@ class SeedTranscribeSeedQRZoomedInView(View): self.seedqr_format = seedqr_format self.seed = self.controller.get_seed(seed_num) self.initial_zone_x = initial_zone_x - self.initial_zone_y = initial_zone_y + self.initial_zone_y = initial_zone_y + self.allow_screensaver = False def run(self): diff --git a/src/seedsigner/views/view.py b/src/seedsigner/views/view.py index 66c3a229..425ec222 100644 --- a/src/seedsigner/views/view.py +++ b/src/seedsigner/views/view.py @@ -67,6 +67,7 @@ class View: self.screen = None self._redirect: 'Destination' = None + self.allow_screensaver = True def __init__(self): From 1c0737b1950fdbb1984c45a21e59235035d1dc92 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Sun, 20 Apr 2025 02:43:13 -0500 Subject: [PATCH 09/88] [FIX] active_view returns MainMenuView when back stack is empty --- src/seedsigner/controller.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 667d7753..c60fe143 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -1,7 +1,6 @@ import logging import time import traceback -from typing import Optional from embit.descriptor import Descriptor from embit.psbt import PSBT @@ -471,3 +470,7 @@ class Controller(Singleton): @property def active_view(self) -> Optional[View]: return self.back_stack[-1].view if self.back_stack else None + def active_view(self) -> View: + from seedsigner.views import MainMenuView + return self.back_stack[-1].view if self.back_stack else MainMenuView() + From b0276b73a25d2b53faec64dba9582521ae0d0ff6 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Sun, 20 Apr 2025 02:44:53 -0500 Subject: [PATCH 10/88] [IMP] can_run_screensaver implemented to handle screensaver runable logics --- src/seedsigner/controller.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index c60fe143..8e43ae10 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -468,9 +468,19 @@ class Controller(Singleton): return Destination(UnhandledExceptionView, view_args={"error": error}, clear_history=True) @property - def active_view(self) -> Optional[View]: - return self.back_stack[-1].view if self.back_stack else None def active_view(self) -> View: from seedsigner.views import MainMenuView return self.back_stack[-1].view if self.back_stack else MainMenuView() + def can_run_screensaver(self) -> bool: + """ + Determines whether the screensaver is allowed to run. + + The screensaver can run only if: + - It is not currently running. + - The current active view allows screensaver activity. + + Returns: + bool: True if the screensaver can run, False otherwise. + """ + return not self.is_screensaver_running and self.active_view.allow_screensaver From 499a17a6ec7b382276257d3b94bbcd0c844a2094 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Sun, 20 Apr 2025 02:46:36 -0500 Subject: [PATCH 11/88] [IMP] code cleanup --- src/seedsigner/hardware/buttons.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/seedsigner/hardware/buttons.py b/src/seedsigner/hardware/buttons.py index 450b009c..2e8c53b2 100644 --- a/src/seedsigner/hardware/buttons.py +++ b/src/seedsigner/hardware/buttons.py @@ -89,13 +89,7 @@ class HardwareButtons(Singleton): return HardwareButtonsConstants.OVERRIDE cur_time = int(time.time() * 1000) - active_view = controller.active_view - active_view_allows_screensaver = True - if active_view: - active_view_allows_screensaver = active_view.allow_screensaver - - if (cur_time - self.last_input_time > controller.screensaver_activation_ms - and not controller.is_screensaver_running and active_view_allows_screensaver): + if cur_time - self.last_input_time > controller.screensaver_activation_ms and controller.can_run_screensaver(): # Start the screensaver. Will block execution until input detected. controller.start_screensaver() From a0fdfb187c396945478541b72e222290658b06a3 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Mon, 21 Apr 2025 20:41:45 -0500 Subject: [PATCH 12/88] [REF] active_view property removed and can_start_screensaver renamed to is_screensaver_start_allowed --- src/seedsigner/controller.py | 10 ++++------ src/seedsigner/hardware/buttons.py | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 8e43ae10..07265a32 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -468,11 +468,7 @@ class Controller(Singleton): return Destination(UnhandledExceptionView, view_args={"error": error}, clear_history=True) @property - def active_view(self) -> View: - from seedsigner.views import MainMenuView - return self.back_stack[-1].view if self.back_stack else MainMenuView() - - def can_run_screensaver(self) -> bool: + def is_screensaver_start_allowed(self) -> bool: """ Determines whether the screensaver is allowed to run. @@ -483,4 +479,6 @@ class Controller(Singleton): Returns: bool: True if the screensaver can run, False otherwise. """ - return not self.is_screensaver_running and self.active_view.allow_screensaver + from seedsigner.views import MainMenuView + active_view = self.back_stack[-1].view if self.back_stack else MainMenuView() + return not self.is_screensaver_running and active_view.allow_screensaver diff --git a/src/seedsigner/hardware/buttons.py b/src/seedsigner/hardware/buttons.py index 2e8c53b2..c98fdea1 100644 --- a/src/seedsigner/hardware/buttons.py +++ b/src/seedsigner/hardware/buttons.py @@ -89,7 +89,7 @@ class HardwareButtons(Singleton): return HardwareButtonsConstants.OVERRIDE cur_time = int(time.time() * 1000) - if cur_time - self.last_input_time > controller.screensaver_activation_ms and controller.can_run_screensaver(): + if cur_time - self.last_input_time > controller.screensaver_activation_ms and controller.is_screensaver_start_allowed: # Start the screensaver. Will block execution until input detected. controller.start_screensaver() From 0f183fdb3cc13f30c0eabec24bb4c7b48d6b37d8 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Sun, 27 Apr 2025 02:32:35 -0500 Subject: [PATCH 13/88] [Temporary] rough test included that test the screensaver start status when the current view is SeedTranscribeSeedQRZoomedInView --- tests/test_flows_seed.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tests/test_flows_seed.py b/tests/test_flows_seed.py index a9a7f663..3f85c888 100644 --- a/tests/test_flows_seed.py +++ b/tests/test_flows_seed.py @@ -476,6 +476,25 @@ class TestSeedFlows(FlowTest): FlowStep(seed_views.SeedOptionsView), ]) + def test_transcribe_seedqr_screensaver_startable_status(self): + """ + The controller should return False for screensaver startable status when SeedTranscribeSeedQRZoomedInView + is active. + """ + # Load a finalized Seed into the Controller + mnemonic = ["abandon"] * 11 + ["about"] + self.controller.storage.set_pending_seed(Seed(mnemonic=mnemonic)) + self.controller.storage.finalize_pending_seed() + + self.run_sequence( + initial_destination_view_args={'num_modules': 21, 'seed_num': 0, 'seedqr_format': 'seed__seedqr'}, + sequence=[ + FlowStep(seed_views.SeedTranscribeSeedQRWholeQRView), + FlowStep(seed_views.SeedTranscribeSeedQRZoomedInView, is_redirect=True), # Live interactive screens are a bit weird; not sure why `is_redirect` is necessary here + ]) + + assert self.controller.is_screensaver_start_allowed == False + class TestMessageSigningFlows(FlowTest): From c85de0947680e2f390fc888f0315e4d53de27493 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Sun, 27 Apr 2025 02:37:16 -0500 Subject: [PATCH 14/88] [Temporary] TODO added --- tests/test_flows_seed.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_flows_seed.py b/tests/test_flows_seed.py index 3f85c888..c62547ad 100644 --- a/tests/test_flows_seed.py +++ b/tests/test_flows_seed.py @@ -476,6 +476,7 @@ class TestSeedFlows(FlowTest): FlowStep(seed_views.SeedOptionsView), ]) + # TODO: ideally this test should be part of controller related test? move it there def test_transcribe_seedqr_screensaver_startable_status(self): """ The controller should return False for screensaver startable status when SeedTranscribeSeedQRZoomedInView From fee38bd94e82ef957b5947a030cb1e59ea10cf99 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Wed, 30 Jul 2025 04:31:01 -0500 Subject: [PATCH 15/88] Seedsigner 2 lines convention for method --- src/seedsigner/controller.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 07265a32..032e7ff2 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -467,6 +467,7 @@ class Controller(Singleton): ] return Destination(UnhandledExceptionView, view_args={"error": error}, clear_history=True) + @property def is_screensaver_start_allowed(self) -> bool: """ From dfa445b765c2d590780666557525a0ae82303031 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Wed, 30 Jul 2025 04:31:18 -0500 Subject: [PATCH 16/88] doc string update --- src/seedsigner/controller.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index 032e7ff2..bec52ede 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -471,14 +471,11 @@ class Controller(Singleton): @property def is_screensaver_start_allowed(self) -> bool: """ - Determines whether the screensaver is allowed to run. + Determines whether the screensaver is allowed to start. - The screensaver can run only if: - - It is not currently running. - - The current active view allows screensaver activity. - - Returns: - bool: True if the screensaver can run, False otherwise. + The screensaver can start only if: + - It is not currently running. + - The current active view allows screensaver activity. """ from seedsigner.views import MainMenuView active_view = self.back_stack[-1].view if self.back_stack else MainMenuView() From 8440d451479297a299ccce0fc5641b209e87ffab Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Wed, 30 Jul 2025 04:31:54 -0500 Subject: [PATCH 17/88] backstack comment update --- src/seedsigner/controller.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index bec52ede..e3736a7a 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -478,5 +478,6 @@ class Controller(Singleton): - The current active view allows screensaver activity. """ from seedsigner.views import MainMenuView + # Confusingly, the top item in the `BackStack` is actually the *current* View active_view = self.back_stack[-1].view if self.back_stack else MainMenuView() return not self.is_screensaver_running and active_view.allow_screensaver From d92f377dc945c333616f87cc3f36190b2faea81c Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Wed, 30 Jul 2025 04:33:01 -0500 Subject: [PATCH 18/88] property renamed as per suggestion --- src/seedsigner/controller.py | 2 +- src/seedsigner/views/seed_views.py | 2 +- src/seedsigner/views/view.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/seedsigner/controller.py b/src/seedsigner/controller.py index e3736a7a..5ea62246 100644 --- a/src/seedsigner/controller.py +++ b/src/seedsigner/controller.py @@ -480,4 +480,4 @@ class Controller(Singleton): from seedsigner.views import MainMenuView # Confusingly, the top item in the `BackStack` is actually the *current* View active_view = self.back_stack[-1].view if self.back_stack else MainMenuView() - return not self.is_screensaver_running and active_view.allow_screensaver + return not self.is_screensaver_running and active_view.is_screensaver_allowed diff --git a/src/seedsigner/views/seed_views.py b/src/seedsigner/views/seed_views.py index 74438153..7c99a29a 100644 --- a/src/seedsigner/views/seed_views.py +++ b/src/seedsigner/views/seed_views.py @@ -1568,7 +1568,7 @@ class SeedTranscribeSeedQRZoomedInView(View): self.seed = self.controller.get_seed(seed_num) self.initial_zone_x = initial_zone_x self.initial_zone_y = initial_zone_y - self.allow_screensaver = False + self.is_screensaver_allowed = False def run(self): diff --git a/src/seedsigner/views/view.py b/src/seedsigner/views/view.py index 425ec222..7412932c 100644 --- a/src/seedsigner/views/view.py +++ b/src/seedsigner/views/view.py @@ -67,7 +67,7 @@ class View: self.screen = None self._redirect: 'Destination' = None - self.allow_screensaver = True + self.is_screensaver_allowed = True def __init__(self): From 8e9fa85dae9846122cf6c8418b467dff792d2ae5 Mon Sep 17 00:00:00 2001 From: FazleRabbbiferdaus172 Date: Wed, 30 Jul 2025 04:33:27 -0500 Subject: [PATCH 19/88] todo removed --- tests/test_flows_seed.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_flows_seed.py b/tests/test_flows_seed.py index c62547ad..3f85c888 100644 --- a/tests/test_flows_seed.py +++ b/tests/test_flows_seed.py @@ -476,7 +476,6 @@ class TestSeedFlows(FlowTest): FlowStep(seed_views.SeedOptionsView), ]) - # TODO: ideally this test should be part of controller related test? move it there def test_transcribe_seedqr_screensaver_startable_status(self): """ The controller should return False for screensaver startable status when SeedTranscribeSeedQRZoomedInView From fb73cfb77f79cda251a46ce7836b63a348b89dad Mon Sep 17 00:00:00 2001 From: Nick Klockenga Date: Fri, 24 Oct 2025 16:09:49 -0400 Subject: [PATCH 20/88] remove foreign language fonts copied to seedsigner-translations --- .../resources/fonts/NotoSansAR-Regular.ttf | Bin 194176 -> 0 bytes .../resources/fonts/NotoSansJP-Regular.ttf | Bin 5733060 -> 0 bytes .../resources/fonts/NotoSansKR-Regular.ttf | Bin 6192764 -> 0 bytes .../resources/fonts/NotoSansSC-Regular.ttf | Bin 10560616 -> 0 bytes .../resources/fonts/NotoSansTH-Regular.ttf | Bin 47484 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/seedsigner/resources/fonts/NotoSansAR-Regular.ttf delete mode 100644 src/seedsigner/resources/fonts/NotoSansJP-Regular.ttf delete mode 100644 src/seedsigner/resources/fonts/NotoSansKR-Regular.ttf delete mode 100644 src/seedsigner/resources/fonts/NotoSansSC-Regular.ttf delete mode 100644 src/seedsigner/resources/fonts/NotoSansTH-Regular.ttf diff --git a/src/seedsigner/resources/fonts/NotoSansAR-Regular.ttf b/src/seedsigner/resources/fonts/NotoSansAR-Regular.ttf deleted file mode 100644 index 08a5b52d91556077309762aebe3901d76653c585..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 194176 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