{ config, lib, ... }: # The Hyprland compositor. { options.modules.desktop.session.hyprland.enable = lib.mkEnableOption "the Hyprland compositor"; config = lib.mkIf config.modules.desktop.session.hyprland.enable { registry.keybind.${config.networking.hostName} = lib.listToAttrs ( map (workspace: { name = "hyprland-workspace-${toString workspace}"; value = { keys = "SUPER + ${toString workspace}"; action = { kind = "focus-workspace"; inherit workspace; }; }; }) (lib.range 1 9) ); # This program integration owns the session, portals, and polkit, launched # through the universal Wayland session manager. programs.hyprland = { enable = true; withUWSM = true; }; home-manager.users.${config.user.name}.wayland.windowManager.hyprland = { enable = true; # One package drives the whole session, so there is never a version split. # The program integration above installs it and the portal, leaving home- # manager to write only the config. package = null; portalPackage = null; # uwsm owns the systemd graphical-session targets. systemd.enable = false; # Write the native Lua Hyprland config. Home Manager renders the Nix # settings below as hl.* calls. configType = "lua"; settings = { config.general.layout = "dwindle"; bind = lib.mapAttrsToList (_name: keybind: { _args = [ keybind.keys (lib.generators.mkLuaInline ( { exec = "hl.dsp.exec_cmd(${lib.generators.toLua { } keybind.action.command})"; "focus-workspace" = "hl.dsp.focus(${ lib.generators.toLua { } { inherit (keybind.action) workspace; } })"; } .${keybind.action.kind} )) ]; }) (lib.attrByPath [ config.networking.hostName ] { } config.registry.keybind); }; }; }; }