diff --git a/src/moongreet/main.py b/src/moongreet/main.py index ecca7fe..3907f01 100644 --- a/src/moongreet/main.py +++ b/src/moongreet/main.py @@ -4,6 +4,7 @@ import logging import sys from importlib.resources import files +from pathlib import Path import gi gi.require_version("Gtk", "4.0") @@ -21,9 +22,38 @@ try: except (ValueError, ImportError): HAS_LAYER_SHELL = False +LOG_DIR = Path("/var/cache/moongreet") +LOG_FILE = LOG_DIR / "moongreet.log" + logger = logging.getLogger(__name__) +def _setup_logging() -> None: + """Configure logging to file and stderr.""" + root = logging.getLogger() + root.setLevel(logging.DEBUG) + + formatter = logging.Formatter( + "%(asctime)s %(levelname)s %(name)s: %(message)s" + ) + + # Always log to stderr + stderr_handler = logging.StreamHandler(sys.stderr) + stderr_handler.setLevel(logging.DEBUG) + stderr_handler.setFormatter(formatter) + root.addHandler(stderr_handler) + + # Log to file if the directory is writable + if LOG_DIR.is_dir(): + try: + file_handler = logging.FileHandler(LOG_FILE) + file_handler.setLevel(logging.DEBUG) + file_handler.setFormatter(formatter) + root.addHandler(file_handler) + except PermissionError: + logger.warning("Cannot write to %s", LOG_FILE) + + class MoongreetApp(Gtk.Application): """GTK Application for the Moongreet greeter.""" @@ -34,14 +64,18 @@ class MoongreetApp(Gtk.Application): def do_activate(self) -> None: """Create and present greeter windows on all monitors.""" - self._register_icons() - self._load_css() + display = Gdk.Display.get_default() + if display is None: + logger.error("No display available — cannot start greeter UI") + return + + self._register_icons(display) + self._load_css(display) # Resolve wallpaper once, share across all windows config = load_config() bg_path, self._wallpaper_ctx = resolve_wallpaper_path(config) - display = Gdk.Display.get_default() monitors = display.get_monitors() primary_monitor = None @@ -81,19 +115,19 @@ class MoongreetApp(Gtk.Application): self._wallpaper_ctx = None Gtk.Application.do_shutdown(self) - def _register_icons(self) -> None: + def _register_icons(self, display: Gdk.Display) -> None: """Register custom icons from the package data/icons directory.""" icons_dir = files("moongreet") / "data" / "icons" - icon_theme = Gtk.IconTheme.get_for_display(Gdk.Display.get_default()) + icon_theme = Gtk.IconTheme.get_for_display(display) icon_theme.add_search_path(str(icons_dir)) - def _load_css(self) -> None: + def _load_css(self, display: Gdk.Display) -> None: """Load the CSS stylesheet for the greeter.""" css_provider = Gtk.CssProvider() css_path = files("moongreet") / "style.css" css_provider.load_from_path(str(css_path)) Gtk.StyleContext.add_provider_for_display( - Gdk.Display.get_default(), + display, css_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION, ) @@ -118,6 +152,8 @@ class MoongreetApp(Gtk.Application): def main() -> None: """Run the Moongreet application.""" + _setup_logging() + logger.info("Moongreet starting") app = MoongreetApp() app.run(sys.argv)