From f20d6fe9c5a91c6308c1a5949e8c3f74f011e32d Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Sun, 2 Aug 2026 13:37:10 +0545 Subject: [PATCH] perf(desktop): defer widget imports to first rebuild --- src/window/desktop/main.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/window/desktop/main.py b/src/window/desktop/main.py index 7a7a6bf..75cfc39 100644 --- a/src/window/desktop/main.py +++ b/src/window/desktop/main.py @@ -14,14 +14,29 @@ from shared.widgets.animator import Animator from utils.gtk_utils import toml_file from window.desktop.registry import DesktopWidgetRegistry -# Dynamically import all modules in this package to register widgets _dir = os.path.dirname(__file__) -for _, _name, _ in pkgutil.iter_modules([_dir]): - if _name not in ("main", "registry", "widgets"): - try: - importlib.import_module(f".{_name}", package=__package__) - except Exception as e: - logger.error(f"Failed to load desktop widget module {_name}: {e}") +_widget_modules_loaded = False + + +def _ensure_widget_modules() -> None: + """Import built-in desktop widget modules and user widgets on first use. + + Deferred from import time so the ~0.27s of widget imports don't block + startup; the desktop window builds its contents after a 50ms idle + timeout anyway. + """ + global _widget_modules_loaded + if _widget_modules_loaded: + return + _widget_modules_loaded = True + for _, _name, _ in pkgutil.iter_modules([_dir]): + if _name not in ("main", "registry", "widgets"): + try: + importlib.import_module(f".{_name}", package=__package__) + except Exception as e: + logger.error(f"Failed to load desktop widget module {_name}: {e}") + _load_user_widgets() + # Config-backed position manager (stores percentage-based positions) # @@ -64,9 +79,6 @@ def _load_user_widgets() -> set[str]: return loaded_keys -_load_user_widgets() - - class PositionManager: """Merges widget defaults from registry with user overrides in desktop.toml. @@ -481,6 +493,7 @@ class DesktopWidgetWindow(WaylandWindow): # widget management def rebuild(self) -> None: + _ensure_widget_modules() self._dragging_eb = None self._dragging_key = None