Compare commits
2 Commits
ecd89f5b10
...
ba4f30f254
| Author | SHA1 | Date | |
|---|---|---|---|
| ba4f30f254 | |||
| e37b273913 |
@ -5,5 +5,7 @@
|
|||||||
vt = 1
|
vt = 1
|
||||||
|
|
||||||
[default_session]
|
[default_session]
|
||||||
command = "moongreet"
|
# Moongreet braucht einen Wayland-Compositor — niri stellt diesen bereit.
|
||||||
|
# Siehe niri-greeter.kdl fuer die Compositor-Konfiguration.
|
||||||
|
command = "niri -c /etc/greetd/niri-greeter.kdl"
|
||||||
user = "greeter"
|
user = "greeter"
|
||||||
|
|||||||
59
config/niri-greeter.kdl
Normal file
59
config/niri-greeter.kdl
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// ABOUTME: Niri-Konfiguration fuer den Moongreet Login-Greeter.
|
||||||
|
// ABOUTME: Wird von greetd gestartet — minimale Config ohne Keybinds fuer Sicherheit.
|
||||||
|
|
||||||
|
input {
|
||||||
|
keyboard {
|
||||||
|
xkb {
|
||||||
|
layout "de"
|
||||||
|
}
|
||||||
|
numlock
|
||||||
|
}
|
||||||
|
|
||||||
|
touchpad {
|
||||||
|
tap
|
||||||
|
natural-scroll
|
||||||
|
}
|
||||||
|
|
||||||
|
mouse {
|
||||||
|
accel-profile "flat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cursor {
|
||||||
|
xcursor-theme "Sweet-cursors"
|
||||||
|
}
|
||||||
|
|
||||||
|
layout {
|
||||||
|
gaps 0
|
||||||
|
|
||||||
|
focus-ring {
|
||||||
|
off
|
||||||
|
}
|
||||||
|
|
||||||
|
border {
|
||||||
|
off
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Moongreet starten und niri beenden, sobald moongreet sich schliesst.
|
||||||
|
// Retry-Loop stellt sicher, dass niri auch bei fruehen Crashes von moongreet beendet wird.
|
||||||
|
spawn-sh-at-startup "moongreet; while ! niri msg action quit --skip-confirmation 2>/dev/null; do sleep 0.5; done"
|
||||||
|
|
||||||
|
// Greeter-Fenster maximiert darstellen
|
||||||
|
window-rule {
|
||||||
|
open-maximized true
|
||||||
|
}
|
||||||
|
|
||||||
|
hotkey-overlay {
|
||||||
|
skip-at-startup
|
||||||
|
}
|
||||||
|
|
||||||
|
prefer-no-csd
|
||||||
|
|
||||||
|
animations {
|
||||||
|
off
|
||||||
|
}
|
||||||
|
|
||||||
|
binds {
|
||||||
|
// Keine Keybinds — verhindert Zugriff auf Terminals oder andere Aktionen
|
||||||
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
from importlib.resources import files
|
from importlib.resources import files
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
import gi
|
import gi
|
||||||
gi.require_version("Gtk", "4.0")
|
gi.require_version("Gtk", "4.0")
|
||||||
@ -21,9 +22,38 @@ try:
|
|||||||
except (ValueError, ImportError):
|
except (ValueError, ImportError):
|
||||||
HAS_LAYER_SHELL = False
|
HAS_LAYER_SHELL = False
|
||||||
|
|
||||||
|
LOG_DIR = Path("/var/cache/moongreet")
|
||||||
|
LOG_FILE = LOG_DIR / "moongreet.log"
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
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):
|
class MoongreetApp(Gtk.Application):
|
||||||
"""GTK Application for the Moongreet greeter."""
|
"""GTK Application for the Moongreet greeter."""
|
||||||
|
|
||||||
@ -34,14 +64,18 @@ class MoongreetApp(Gtk.Application):
|
|||||||
|
|
||||||
def do_activate(self) -> None:
|
def do_activate(self) -> None:
|
||||||
"""Create and present greeter windows on all monitors."""
|
"""Create and present greeter windows on all monitors."""
|
||||||
self._register_icons()
|
display = Gdk.Display.get_default()
|
||||||
self._load_css()
|
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
|
# Resolve wallpaper once, share across all windows
|
||||||
config = load_config()
|
config = load_config()
|
||||||
bg_path, self._wallpaper_ctx = resolve_wallpaper_path(config)
|
bg_path, self._wallpaper_ctx = resolve_wallpaper_path(config)
|
||||||
|
|
||||||
display = Gdk.Display.get_default()
|
|
||||||
monitors = display.get_monitors()
|
monitors = display.get_monitors()
|
||||||
primary_monitor = None
|
primary_monitor = None
|
||||||
|
|
||||||
@ -81,19 +115,19 @@ class MoongreetApp(Gtk.Application):
|
|||||||
self._wallpaper_ctx = None
|
self._wallpaper_ctx = None
|
||||||
Gtk.Application.do_shutdown(self)
|
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."""
|
"""Register custom icons from the package data/icons directory."""
|
||||||
icons_dir = files("moongreet") / "data" / "icons"
|
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))
|
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."""
|
"""Load the CSS stylesheet for the greeter."""
|
||||||
css_provider = Gtk.CssProvider()
|
css_provider = Gtk.CssProvider()
|
||||||
css_path = files("moongreet") / "style.css"
|
css_path = files("moongreet") / "style.css"
|
||||||
css_provider.load_from_path(str(css_path))
|
css_provider.load_from_path(str(css_path))
|
||||||
Gtk.StyleContext.add_provider_for_display(
|
Gtk.StyleContext.add_provider_for_display(
|
||||||
Gdk.Display.get_default(),
|
display,
|
||||||
css_provider,
|
css_provider,
|
||||||
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION,
|
||||||
)
|
)
|
||||||
@ -118,6 +152,8 @@ class MoongreetApp(Gtk.Application):
|
|||||||
|
|
||||||
def main() -> None:
|
def main() -> None:
|
||||||
"""Run the Moongreet application."""
|
"""Run the Moongreet application."""
|
||||||
|
_setup_logging()
|
||||||
|
logger.info("Moongreet starting")
|
||||||
app = MoongreetApp()
|
app = MoongreetApp()
|
||||||
app.run(sys.argv)
|
app.run(sys.argv)
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user