diff --git a/ansible/roles/greetd/templates/config.toml.j2 b/ansible/roles/greetd/templates/config.toml.j2 index 8c8a45a..2090145 100644 --- a/ansible/roles/greetd/templates/config.toml.j2 +++ b/ansible/roles/greetd/templates/config.toml.j2 @@ -4,5 +4,5 @@ vt = 1 # Default session: tuigreet greeter [default_session] -command = "tuigreet --time --remember --asterisks --cmd {{ hyprland_cmd | default('Hyprland') }}" +command = "tuigreet --time --remember --asterisks --cmd {{ hyprland_cmd | default('start-hyprland') }}" user = "greeter" diff --git a/ansible/roles/hyprland/templates/hyprland.conf.j2 b/ansible/roles/hyprland/templates/hyprland.conf.j2 index a2b8d96..d393f35 100644 --- a/ansible/roles/hyprland/templates/hyprland.conf.j2 +++ b/ansible/roles/hyprland/templates/hyprland.conf.j2 @@ -8,13 +8,9 @@ monitor=DP-1,2560x1440@144,0x0,1 monitor=DVI-D-1,1920x1080@60,2560x0,1,transform,1 monitor=HDMI-A-1,2560x1440@144,3640x0,1 -# Execute on start -exec-once = hyprpaper -exec-once = waybar -exec-once = dunst -exec-once = hypridle -exec-once = wl-paste --type text --watch cliphist store -exec-once = wl-paste --type image --watch cliphist store +# Session services: hyprpaper, waybar, dunst, hypridle, hyprlauncher, cliphist +# Managed by systemd user units under ~/.config/systemd/user/ +# All WantedBy=graphical-session.target for uwsm integration # Environment variables for NVIDIA env = LIBVA_DRIVER_NAME,nvidia @@ -73,10 +69,37 @@ bind = $mainMod, C, killactive, bind = $mainMod, M, exit, bind = $mainMod, E, exec, dolphin bind = $mainMod, V, togglefloating, -bind = $mainMod, D, exec, wofi --show drun +bind = $mainMod, D, exec, hyprlauncher bind = $mainMod, P, pseudo bind = $mainMod, J, layoutmsg, togglesplit -bind = $mainMod, L, exec, hyprlock + +# Worktime safers +bind = $mainMod, F, fullscreen, 0 # Toggle fullscreen +bind = $mainMod, SPACE, togglefloating # Toggle float (popup window) +bind = $mainMod, TAB, cyclenext # Cycle through windows +bind = $mainMod SHIFT, TAB, cyclenext, prev # Cycle backwards +bind = $mainMod, GRAVE, togglespecialworkspace # Scratchpad (toggle) +bind = $mainMod SHIFT, GRAVE, movetoworkspace, special # Send to scratchpad +bind = $mainMod CTRL, K, exec, grep -E '^bind\s*=.*#' ~/.config/hypr/hyprland.conf | sed 's/^bind\s*=\s*\$mainMod/SUPER/;s/\s*#/#/' | fuzzel -d + +# Home row navigation aliases (keep arrows too) +bind = $mainMod, H, movefocus, l +bind = $mainMod, L, movefocus, r + +# HJKL + SHIFT = move window in direction (home row) +bind = $mainMod SHIFT, H, movewindow, l +bind = $mainMod SHIFT, L, movewindow, r +bind = $mainMod SHIFT, K, movewindow, u +bind = $mainMod SHIFT, J, movewindow, d + +# Window resize via home row (SUPER+ALT) +bind = $mainMod ALT, H, resizeactive, -40 0 +bind = $mainMod ALT, L, resizeactive, 40 0 +bind = $mainMod ALT, K, resizeactive, 0 -40 +bind = $mainMod ALT, J, resizeactive, 0 40 + +# Lock screen +bind = $mainMod CTRL, L, exec, hyprlock # Focus bind = $mainMod, left, movefocus, l @@ -90,6 +113,15 @@ bind = $mainMod, right, movefocus, r bind = $mainMod, up, movefocus, u bind = $mainMod, down, movefocus, d +# Move window to adjacent tile/monitor +bind = $mainMod SHIFT, left, movewindow, l +bind = $mainMod SHIFT, right, movewindow, r +bind = $mainMod SHIFT, up, movewindow, u +bind = $mainMod SHIFT, down, movewindow, d + +# Apps +bind = $mainMod, B, exec, chromium + # Workspaces bind = $mainMod, 1, workspace, 1 bind = $mainMod, 2, workspace, 2 diff --git a/ansible/roles/hyprland/templates/systemd/cliphist.j2 b/ansible/roles/hyprland/templates/systemd/cliphist.j2 new file mode 100644 index 0000000..9248371 --- /dev/null +++ b/ansible/roles/hyprland/templates/systemd/cliphist.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Cliphist clipboard store +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/bin/sh -c '/usr/bin/wl-paste --type text --watch /usr/bin/cliphist store & /usr/bin/wl-paste --type image --watch /usr/bin/cliphist store & wait' +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=graphical-session.target diff --git a/ansible/roles/hyprland/templates/systemd/dunst.j2 b/ansible/roles/hyprland/templates/systemd/dunst.j2 new file mode 100644 index 0000000..df11ef6 --- /dev/null +++ b/ansible/roles/hyprland/templates/systemd/dunst.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Dunst notification daemon +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/usr/bin/dunst +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=graphical-session.target diff --git a/ansible/roles/hyprland/templates/systemd/hypridle.j2 b/ansible/roles/hyprland/templates/systemd/hypridle.j2 new file mode 100644 index 0000000..e12ff63 --- /dev/null +++ b/ansible/roles/hyprland/templates/systemd/hypridle.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Hyprland idle daemon +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/usr/bin/hypridle +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=graphical-session.target diff --git a/ansible/roles/hyprland/templates/systemd/hyprlauncher.j2 b/ansible/roles/hyprland/templates/systemd/hyprlauncher.j2 new file mode 100644 index 0000000..0e73e3b --- /dev/null +++ b/ansible/roles/hyprland/templates/systemd/hyprlauncher.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=Hyprlauncher daemon +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStartPre=/usr/bin/sleep 2 +ExecStart=/usr/bin/hyprlauncher -d +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=graphical-session.target diff --git a/ansible/roles/hyprland/templates/systemd/hyprpaper.j2 b/ansible/roles/hyprland/templates/systemd/hyprpaper.j2 new file mode 100644 index 0000000..d620cae --- /dev/null +++ b/ansible/roles/hyprland/templates/systemd/hyprpaper.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Hyprland Wallpaper daemon +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/usr/bin/hyprpaper +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=graphical-session.target diff --git a/ansible/roles/hyprland/templates/systemd/waybar.j2 b/ansible/roles/hyprland/templates/systemd/waybar.j2 new file mode 100644 index 0000000..0d0e793 --- /dev/null +++ b/ansible/roles/hyprland/templates/systemd/waybar.j2 @@ -0,0 +1,13 @@ +[Unit] +Description=Waybar status bar +PartOf=graphical-session.target +After=graphical-session.target + +[Service] +Type=simple +ExecStart=/usr/bin/waybar +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=graphical-session.target diff --git a/config/hyprland-cheatsheet.txt b/config/hyprland-cheatsheet.txt new file mode 100644 index 0000000..566bc3f --- /dev/null +++ b/config/hyprland-cheatsheet.txt @@ -0,0 +1,47 @@ +Hyprland Keybindings Cheat Sheet +================================ +$mainMod = SUPER (Windows key) | Monitors: DP-1 | DVI-D-1 (rotated) | HDMI-A-1 + +APPS + SUPER+Q Terminal (kitty) + SUPER+B Browser (chromium) + SUPER+E File manager (dolphin) + SUPER+D App launcher (hyprlauncher) + +WORKTIME SAVERS + SUPER+F Toggle fullscreen + SUPER+SPACE Toggle floating (popup window) + SUPER+TAB Cycle next window + SUPER+SHIFT+TAB Cycle previous window + SUPER+` Toggle scratchpad (special workspace) + SUPER+SHIFT+` Send window to scratchpad + SUPER+P Pseudo mode (tile/float hybrid) + SUPER+J Toggle split direction + +HOME ROW NAVIGATION (HJKL) + SUPER+H/J/K/L Focus left/down/up/right (same as arrows) + SUPER+SHIFT+H Move window left + SUPER+SHIFT+L Move window right + SUPER+SHIFT+K Move window up + SUPER+SHIFT+J Move window down + SUPER+ALT+H Shrink window width (-40) + SUPER+ALT+L Expand window width (+40) + SUPER+ALT+K Shrink window height (-40) + SUPER+ALT+J Expand window height (+40) + +ARROW KEY NAVIGATION + SUPER+Left/Right/Up/Down Focus direction + SUPER+SHIFT+Left/Right/Up/Down Move window to adjacent tile/monitor + +WINDOW MANAGEMENT + SUPER+C Close active window + SUPER+M Exit Hyprland (logout) + SUPER+CTRL+L Lock screen (hyprlock) + +WORKSPACES + SUPER+1-9 Go to workspace N + SUPER+SHIFT+1-9 Move window to workspace N + +SESSION SERVICES (systemd user units, uwsm-managed) + hyprpaper, waybar, dunst, hypridle, hyprlauncher, cliphist + All managed via ~/.config/systemd/user/*.service diff --git a/docs/hyprland-uwsm.md b/docs/hyprland-uwsm.md new file mode 100644 index 0000000..3e75b9d --- /dev/null +++ b/docs/hyprland-uwsm.md @@ -0,0 +1,70 @@ +# Hyprland Configuration - uwsm Integration + +## Architecture + +Session management uses **UWSM** (Universal Wayland Session Manager) wrapping Hyprland in systemd user services. + +``` +greetd → tuigreet → uwsm start → systemd user session → Hyprland + ↓ + systemd units: hyprpaper, waybar, dunst, hypridle, hyprlauncher, cliphist + XDG autostart: Nextcloud, JetBrains Toolbox, Flameshot, etc. +``` + +## Session Services + +All session services are managed via systemd user units (`~/.config/systemd/user/*.service`): + +| Service | Purpose | Status | +|---------|---------|--------| +| `hyprpaper.service` | Wallpaper daemon | active | +| `waybar.service` | Status bar | active | +| `dunst.service` | Notification daemon | active | +| `hypridle.service` | Idle/screenlock control | active | +| `hyprlauncher.service` | App launcher daemon | active | +| `cliphist.service` | Clipboard history store | active | + +### Management Commands + +```bash +# Check all session services +systemctl --user list-units | grep -E 'hypr|waybar|dunst|cliphist' + +# Restart a specific service +systemctl --user restart waybar.service + +# View logs +journalctl --user -u waybar.service -f +``` + +## Launchers + +| Component | Tool | Keybind | +|-----------|------|---------| +| App Launcher | hyprlauncher | SUPER+D | +| Keybind Menu | hyprlauncher -o (piped) | SUPER+CTRL+K | + +hypr launcher config: `~/.config/hypr/hyprlauncher.conf` +- `desktop_launch_prefix = uwsm app --` (proper systemd scoping) +- Cache enabled for frequency-based sorting +- Finders: desktop (default), math (=), unicode (.), font (') + +## Login Manager + +**greetd** with **tuigreet** on VT 1. +Config: `/etc/greetd/config.toml` +Default command: `tuigreet --time --remember --asterisks --cmd 'uwsm start -e -D Hyprland hyprland.desktop'` + +## Key Categories + +| Category | Modifier | Keys | Action | +|----------|----------|------|--------| +| Focus | SUPER | H/J/K/L, Arrows | Move focus | +| Move Window | SUPER+SHIFT | H/J/K/L, Arrows | Move window | +| Resize Window | SUPER+ALT | H/J/K/L | Resize active window | +| Windows | SUPER | F, SPACE, TAB, `, P, J | Window actions | +| Apps | SUPER | Q, B, E, D | Launch apps | +| Workspaces | SUPER | 1-9 | Switch/move workspaces | +| Lock | SUPER+CTRL | L | Lock screen | + +See `~/.config/hypr/cheatsheet.txt` for the full reference.