From 5780d3dafff90dc0a77590b875cbc27682a0c262 Mon Sep 17 00:00:00 2001 From: aclist <92275929+aclist@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:02:18 +0900 Subject: [PATCH] feat: abort gracefully if libgirepository is missing --- dzgui/app_init.py | 103 +++++++++++++++++++++++++++++++++++++++++ dzgui/init/libgi.py | 2 +- dzgui/main.py | 109 +++----------------------------------------- 3 files changed, 110 insertions(+), 104 deletions(-) create mode 100644 dzgui/app_init.py diff --git a/dzgui/app_init.py b/dzgui/app_init.py new file mode 100644 index 0000000..d468ae7 --- /dev/null +++ b/dzgui/app_init.py @@ -0,0 +1,103 @@ +import logging +import os +from typing import TYPE_CHECKING + + +from dzgui.const.constants import APP_NAME +from dzgui.const.enum import Preferences +from dzgui.config.query import lookup +from dzgui.config.userprefs import UserPrefs +from dzgui.config.xdg import get_xdg_paths, parse_filepaths +from dzgui.init.migrate import ( + has_new_config, + copy_state_files, + migrate_cols_file, +) +from dzgui.init.prereqs import has_steam_client +from dzgui.strings import boot + +# from dzgui.util.map_count import get_map_count +from dzgui.util.deck import is_steam_deck, is_game_mode +from dzgui.util.localize import set_locale +from dzgui.util.strings import init + +from dzgui.views.base import App +from dzgui.views.dialogs.boot import BootWindow +from dzgui.views.dialogs.early_alert import EarlyAlertDialog +from dzgui.views.dialogs.wizard import SetupWizard + +if TYPE_CHECKING: + from pathlib import Path + +logger = logging.getLogger(APP_NAME) + +# TODO: profile load time +def make_parents(path: "Path") -> None: + path.parent.mkdir(parents=True, exist_ok=True) + +def setup_logger(log_path: "Path") -> None: + _format = ( + "%(asctime)s␞%(levelname)s␞%(filename)s::%(funcName)s::%(lineno)s␞%(message)s" + ) + fh = logging.FileHandler(log_path) + formatter = logging.Formatter(_format) + fh.setFormatter(formatter) + fh.setLevel(logging.DEBUG) + logger.setLevel(logging.DEBUG) + logger.addHandler(fh) + +def load_gui(version: str, is_debug: bool) -> None: + set_locale() + # NOTE: consider aborting this check if steam deck + xdg_paths = get_xdg_paths() + XDG = parse_filepaths(xdg_paths) + + if XDG.resolution.parent.is_dir() is False: + make_parents(XDG.resolution) + + if XDG.debug.is_file() is False: + make_parents(XDG.debug) + + _is_steam_deck = is_steam_deck() + _is_game_mode = is_game_mode() if _is_steam_deck else False + if _is_game_mode: + # NOTE: this may no longer be necessary on newer versions of SteamOS + del os.environ["GTK_IM_MODULE"] + + if has_new_config(XDG.config) is False: + migrate_cols_file(XDG.columns) + copy_state_files(xdg_paths["XDG_STATE_HOME"]) + # TODO: add logging inside wizard + SetupWizard(_is_steam_deck, XDG.config) + + # NOTE: implies that setup wizard failed or was closed + if has_new_config(XDG.config) is False: + return + + setup_logger(XDG.debug) + with open(XDG.debug, "w") as f: + f.truncate(0) + + if _is_steam_deck is False: + # TODO: sudo escalation dialog + # count = get_map_count() + # TODO: move into module + if has_steam_client() is False: + EarlyAlertDialog(init.requires_steam) + + bootwin = BootWindow(XDG, version) + local_coords, latest_release = bootwin.get_results() + + use_miles = lookup(XDG.config, Preferences.DIST) + prefs = UserPrefs( + is_steam_deck=_is_steam_deck, + is_game_mode=_is_game_mode, + is_debug=is_debug, + coords=local_coords, + version=version, + paths=XDG, + latest_release=latest_release, + use_miles=use_miles, + ) + print(boot.all_ok) + App(prefs) diff --git a/dzgui/init/libgi.py b/dzgui/init/libgi.py index 4ebc660..e8874d5 100644 --- a/dzgui/init/libgi.py +++ b/dzgui/init/libgi.py @@ -44,7 +44,7 @@ def has_libgi() -> bool: return exists -def test_missing_lib() -> bool: +def test_libgi_missing() -> None: msg = f"System is missing the required library '{LIB}'. Install it via your system package manager." if has_libgi() is False: print(msg) diff --git a/dzgui/main.py b/dzgui/main.py index 7a05637..0bc84a8 100644 --- a/dzgui/main.py +++ b/dzgui/main.py @@ -1,40 +1,12 @@ import argparse -import logging -import os import sys import warnings -from typing import TYPE_CHECKING - from dzgui.const.constants import APP_NAME -from dzgui.const.enum import Preferences -from dzgui.config.query import lookup -from dzgui.config.userprefs import UserPrefs -from dzgui.config.xdg import get_xdg_paths, parse_filepaths from dzgui.init.flock import lock_acquire -from dzgui.init.migrate import ( - has_new_config, - copy_state_files, - migrate_cols_file, -) +from dzgui.init.libgi import test_libgi_missing from dzgui.init.prefix import get_version -from dzgui.init.prereqs import has_steam_client -from dzgui.strings import boot - -# from dzgui.util.map_count import get_map_count -from dzgui.util.deck import is_steam_deck, is_game_mode -from dzgui.util.localize import set_locale -from dzgui.util.strings import init, flags - -from dzgui.views.base import App -from dzgui.views.dialogs.boot import BootWindow -from dzgui.views.dialogs.early_alert import EarlyAlertDialog -from dzgui.views.dialogs.wizard import SetupWizard - -if TYPE_CHECKING: - from pathlib import Path - -logger = logging.getLogger(APP_NAME) +from dzgui.util.strings import flags parser = argparse.ArgumentParser(description=flags.description) parser.add_argument("-v", "--version", action="store_true", help=flags.version) @@ -42,12 +14,6 @@ parser.add_argument("-u", "--uninstall", action="store_true", help=flags.uninsta parser.add_argument("-d", "--debug", action="store_true", help=flags.debug) args = parser.parse_args() - -# TODO: profile load time -def make_parents(path: "Path") -> None: - path.parent.mkdir(parents=True, exist_ok=True) - - def uninstall() -> None: # TODO: uninstall data files (-u) # -u removes state, log, freedesktop @@ -56,19 +22,6 @@ def uninstall() -> None: # XDG_DATA_HOME/dzgui pass - -def setup_logger(log_path: "Path") -> None: - _format = ( - "%(asctime)s␞%(levelname)s␞%(filename)s::%(funcName)s::%(lineno)s␞%(message)s" - ) - fh = logging.FileHandler(log_path) - formatter = logging.Formatter(_format) - fh.setFormatter(formatter) - fh.setLevel(logging.DEBUG) - logger.setLevel(logging.DEBUG) - logger.addHandler(fh) - - def main() -> None: lock = lock_acquire() # noqa @@ -82,60 +35,10 @@ def main() -> None: warnings.filterwarnings("default", category=DeprecationWarning) version = get_version() - set_locale() print(f"{APP_NAME} {version}") + test_libgi_missing() - # NOTE: consider aborting this check if steam deck - xdg_paths = get_xdg_paths() - XDG = parse_filepaths(xdg_paths) - - if XDG.resolution.parent.is_dir() is False: - make_parents(XDG.resolution) - - if XDG.debug.is_file() is False: - make_parents(XDG.debug) - - _is_steam_deck = is_steam_deck() - _is_game_mode = is_game_mode() if _is_steam_deck else False - if _is_game_mode: - # NOTE: this may no longer be necessary on newer versions of SteamOS - del os.environ["GTK_IM_MODULE"] - - if has_new_config(XDG.config) is False: - migrate_cols_file(XDG.columns) - copy_state_files(xdg_paths["XDG_STATE_HOME"]) - # TODO: add logging inside wizard - SetupWizard(_is_steam_deck, XDG.config) - - # NOTE: implies that setup wizard failed or was closed - if has_new_config(XDG.config) is False: - return - - setup_logger(XDG.debug) - with open(XDG.debug, "w") as f: - f.truncate(0) - - if _is_steam_deck is False: - # TODO: sudo escalation dialog - # count = get_map_count() - # TODO: move into module - if has_steam_client() is False: - EarlyAlertDialog(init.requires_steam) - - bootwin = BootWindow(XDG, version) - local_coords, latest_release = bootwin.get_results() - - use_miles = lookup(XDG.config, Preferences.DIST) - prefs = UserPrefs( - is_steam_deck=_is_steam_deck, - is_game_mode=_is_game_mode, - is_debug=args.debug, - coords=local_coords, - version=version, - paths=XDG, - latest_release=latest_release, - use_miles=use_miles, - ) - print(boot.all_ok) - App(prefs) + # NOTE: only import ligbi modules after the above check + from dzgui.app_init import load_gui + load_gui(version, args.debug)