diff --git a/CLAUDE.md b/CLAUDE.md index 5040941..5557d88 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -17,9 +17,10 @@ Teil des Moonarch-Ökosystems. ## Projektstruktur - `src/moongreet/` — Quellcode +- `src/moongreet/data/` — Package-Assets (Default-Avatar, Icons) — werden mit dem Wheel ausgeliefert - `tests/` — pytest Tests -- `data/` — Assets (Icons, Default-Avatar) -- `config/` — Konfigurationsdateien +- `data/` — User-Assets (wallpaper.jpg) — nicht Teil des Packages +- `config/` — Beispiel-Konfigurationsdateien für `/etc/moongreet/` und `/etc/greetd/` ## Kommandos diff --git a/README.md b/README.md index c8ba533..5c1ed94 100644 --- a/README.md +++ b/README.md @@ -23,17 +23,31 @@ Part of the Moonarch ecosystem. ## Installation ```bash -uv pip install -e . +uv pip install . ``` -## Usage +## System Setup -Configure greetd to use Moongreet: +1. Copy configuration: + ```bash + sudo mkdir -p /etc/moongreet + sudo cp config/moongreet.toml /etc/moongreet/moongreet.toml + ``` -```ini -[default_session] -command = "moongreet" -``` +2. Edit `/etc/moongreet/moongreet.toml` — set an absolute path for the wallpaper. + +3. Create cache directory: + ```bash + sudo mkdir -p /var/cache/moongreet + sudo chown greeter:greeter /var/cache/moongreet + ``` + +4. Configure greetd (`/etc/greetd/config.toml`): + ```ini + [default_session] + command = "moongreet" + user = "greeter" + ``` ## Development @@ -43,6 +57,9 @@ uv run pytest tests/ -v # Type checking uv run pyright src/ + +# Run locally (without greetd) +uv run moongreet ``` ## License diff --git a/config/greetd.conf b/config/greetd.conf new file mode 100644 index 0000000..15c39db --- /dev/null +++ b/config/greetd.conf @@ -0,0 +1,9 @@ +# ABOUTME: Example greetd configuration for Moongreet. +# ABOUTME: Copy to /etc/greetd/config.toml and adjust as needed. + +[terminal] +vt = 1 + +[default_session] +command = "moongreet" +user = "greeter" diff --git a/config/moongreet.toml b/config/moongreet.toml index 1fff555..1bc0f18 100644 --- a/config/moongreet.toml +++ b/config/moongreet.toml @@ -1,8 +1,9 @@ -# ABOUTME: Optional configuration for the Moongreet greeter. -# ABOUTME: Background image and other visual settings. +# ABOUTME: Example configuration for the Moongreet greeter. +# ABOUTME: Copy to /etc/moongreet/moongreet.toml and adjust paths. [appearance] -background = "../data/wallpaper.jpg" +# Absolute path to wallpaper image +background = "/usr/share/backgrounds/wallpaper.jpg" [behavior] # show_user_list = true diff --git a/pkg/PKGBUILD b/pkg/PKGBUILD new file mode 100644 index 0000000..f714be7 --- /dev/null +++ b/pkg/PKGBUILD @@ -0,0 +1,42 @@ +# ABOUTME: AUR PKGBUILD for Moongreet — greetd greeter for Wayland. +# ABOUTME: Builds from local source, installs config and cache directory. + +# Maintainer: Dominik Kressler + +pkgname=moongreet +pkgver=0.1.0 +pkgrel=1 +pkgdesc="A greetd greeter for Wayland, built with Python + GTK4 + gtk4-layer-shell" +arch=('any') +license=('MIT') +depends=( + 'python' + 'python-gobject' + 'gtk4' + 'gtk4-layer-shell' + 'greetd' +) +makedepends=( + 'python-build' + 'python-installer' + 'python-hatchling' +) +install=moongreet.install +source=("$pkgname-$pkgver.tar.gz") +sha256sums=('SKIP') + +build() { + cd "$srcdir/$pkgname-$pkgver" + python -m build --wheel --no-isolation +} + +package() { + cd "$srcdir/$pkgname-$pkgver" + python -m installer --destdir="$pkgdir" dist/*.whl + + # Example config + install -Dm644 config/moongreet.toml "$pkgdir/etc/moongreet/moongreet.toml" + + # Cache directory + install -dm755 "$pkgdir/var/cache/moongreet" +} diff --git a/pkg/moongreet.install b/pkg/moongreet.install new file mode 100644 index 0000000..5dccda6 --- /dev/null +++ b/pkg/moongreet.install @@ -0,0 +1,18 @@ +# ABOUTME: pacman install hooks for Moongreet. +# ABOUTME: Sets ownership on cache directory for the greeter user. + +post_install() { + if getent passwd greeter > /dev/null 2>&1; then + chown greeter:greeter /var/cache/moongreet + fi + + echo "==> Copy /etc/moongreet/moongreet.toml and adjust the wallpaper path." + echo "==> Configure greetd to use moongreet:" + echo " [default_session]" + echo " command = \"moongreet\"" + echo " user = \"greeter\"" +} + +post_upgrade() { + post_install +} diff --git a/src/moongreet/config.py b/src/moongreet/config.py index 20e08c7..35876d1 100644 --- a/src/moongreet/config.py +++ b/src/moongreet/config.py @@ -7,7 +7,6 @@ from pathlib import Path DEFAULT_CONFIG_PATHS = [ Path("/etc/moongreet/moongreet.toml"), - Path(__file__).parent.parent.parent / "config" / "moongreet.toml", ] diff --git a/data/default-avatar.svg b/src/moongreet/data/default-avatar.svg similarity index 100% rename from data/default-avatar.svg rename to src/moongreet/data/default-avatar.svg diff --git a/data/icons/hicolor/scalable/apps/moongreet-default-avatar-symbolic.svg b/src/moongreet/data/icons/hicolor/scalable/apps/moongreet-default-avatar-symbolic.svg similarity index 100% rename from data/icons/hicolor/scalable/apps/moongreet-default-avatar-symbolic.svg rename to src/moongreet/data/icons/hicolor/scalable/apps/moongreet-default-avatar-symbolic.svg diff --git a/src/moongreet/greeter.py b/src/moongreet/greeter.py index cf387d2..2dc4e9c 100644 --- a/src/moongreet/greeter.py +++ b/src/moongreet/greeter.py @@ -3,6 +3,7 @@ import os import socket +from importlib.resources import files from pathlib import Path import gi @@ -17,7 +18,8 @@ from moongreet.sessions import Session, get_sessions from moongreet.power import reboot, shutdown LAST_USER_PATH = Path("/var/cache/moongreet/last-user") -DEFAULT_AVATAR_PATH = Path(__file__).parent.parent.parent / "data" / "default-avatar.svg" +PACKAGE_DATA = files("moongreet") / "data" +DEFAULT_AVATAR_PATH = PACKAGE_DATA / "default-avatar.svg" AVATAR_SIZE = 128 diff --git a/src/moongreet/main.py b/src/moongreet/main.py index dab02bf..893b7eb 100644 --- a/src/moongreet/main.py +++ b/src/moongreet/main.py @@ -2,7 +2,7 @@ # ABOUTME: Handles CLI invocation and initializes the greeter window. import sys -import os +from importlib.resources import files import gi gi.require_version("Gtk", "4.0") @@ -38,16 +38,16 @@ class MoongreetApp(Gtk.Application): window.present() def _register_icons(self) -> None: - """Register custom icons from the data/icons directory.""" - icons_dir = os.path.join(os.path.dirname(__file__), "..", "..", "data", "icons") + """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.add_search_path(os.path.realpath(icons_dir)) + icon_theme.add_search_path(str(icons_dir)) def _load_css(self) -> None: """Load the CSS stylesheet for the greeter.""" css_provider = Gtk.CssProvider() - css_path = os.path.join(os.path.dirname(__file__), "style.css") - css_provider.load_from_path(css_path) + css_path = files("moongreet") / "style.css" + css_provider.load_from_path(str(css_path)) Gtk.StyleContext.add_provider_for_display( Gdk.Display.get_default(), css_provider,