diff --git a/home/christoph/default.nix b/home/christoph/default.nix index df675573..b0ba58db 100644 --- a/home/christoph/default.nix +++ b/home/christoph/default.nix @@ -61,9 +61,9 @@ in scheme = "catppuccin-mocha"; font = builtins.head nixosConfig.fonts.fontconfig.defaultFonts.monospace; - cursor = "miku-cursor-linux"; - cursorSize = 64; - cursorPackage = inputs.waifu-cursors.packages.${pkgs.system}.all; + cursor = "Bibata-Modern-Classic"; + cursorSize = 24; + cursorPackage = pkgs.bibata-cursors; iconTheme = "Papirus"; iconPackage = pkgs.papirus-icon-theme; wallpaper = "Windows"; @@ -101,58 +101,80 @@ in dynamicCursor.enable = false; trails.enable = true; hyprspace.enable = false; # Always broken - hyprpanel.enable = false; - caelestia.enable = true; + hyprpanel.enable = true; + caelestia.enable = false; keybindings = { main-mod = "SUPER"; - bindings = { - "$mainMod, t" = ["exec, kitty"]; - "$mainMod, e" = ["exec, kitty --title=Yazi yazi"]; - "$mainMod, n" = ["exec, neovide"]; - # "$mainMod, r" = ["exec, kitty --title=Rmpc rmpc"]; - "$mainMod CTRL, n" = ["exec, kitty --title=Navi navi"]; - "$mainMod SHIFT, n" = ["exec, neovide ${config.paths.dotfiles}/navi/christoph.cheat"]; - "$mainMod SHIFT, f" = ["exec, neovide ${config.paths.dotfiles}/flake.nix"]; + bindings = lib.mergeAttrsList [ + # Use Rofi if we don't have caelestia + (lib.optionalAttrs (!config.modules.hyprland.caelestia.enable) { + "$mainMod, a" = ["exec, rofi -drun-show-actions -show drun"]; + "$mainMod, c" = ["exec, clipman pick --tool=rofi"]; + "$mainMod SHIFT, l" = ["exec, loginctl lock-session"]; + }) - "$mainMod, p" = ["exec, hyprpicker --autocopy --format=hex"]; - "$mainMod, s" = ["exec, grim -g \"$(slurp)\""]; - "$mainMod CTRL, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"]; - "$mainMod SHIFT, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"]; + # Caelestia + (lib.optionalAttrs (config.modules.hyprland.caelestia.enable) { + "$mainMod, a" = ["exec, caelestia shell drawers toggle launcher"]; + # "$mainMod, c" = ["exec, caelestia clipboard"]; + "$mainMod SHIFT, l" = ["exec, caelestia shell lock lock"]; - ", XF86AudioRaiseVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"]; - ", XF86AudioLowerVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-"]; - ", XF86AudioPlay" = ["exec, playerctl play-pause"]; - ", XF86AudioPrev" = ["exec, playerctl previous"]; - ", XF86AudioNext" = ["exec, playerctl next"]; + "$mainMod, escape" = ["exec, caelestia shell drawers toggle session"]; + }) - ", XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset gamma -10"]; - ", XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset gamma +10"]; - "$mainMod, XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset temperature 5750"]; - "$mainMod, XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset identity"]; + { + # Applications + "$mainMod, t" = ["exec, kitty"]; + "$mainMod, e" = ["exec, kitty --title=Yazi yazi"]; + "$mainMod, n" = ["exec, neovide"]; + # "$mainMod, r" = ["exec, kitty --title=Rmpc rmpc"]; + "$mainMod CTRL, n" = ["exec, kitty --title=Navi navi"]; + "$mainMod SHIFT, n" = ["exec, neovide ${config.paths.dotfiles}/navi/christoph.cheat"]; + "$mainMod SHIFT, f" = ["exec, neovide ${config.paths.dotfiles}/flake.nix"]; + # "ALT, tab" = ["exec, rofi -show window"]; - "CTRL ALT, f" = let - hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl"; - grep = "${pkgs.gnugrep}/bin/grep"; - awk = "${pkgs.gawk}/bin/gawk"; - notify = "${pkgs.libnotify}/bin/notify-send"; + # Screenshots + "$mainMod, p" = ["exec, hyprpicker --autocopy --format=hex"]; + "$mainMod, s" = ["exec, grim -g \"$(slurp)\""]; + "$mainMod SHIFT, s" = ["exec, grim -g \"$(slurp)\" - | wl-copy"]; - toggleMouseFocus = pkgs.writeScriptBin "hypr-toggle-mouse-focus" '' - CURRENT=$(${hyprctl} getoption input:follow_mouse | ${grep} int | ${awk} -F' ' '{print $2}') + # Audio + ", XF86AudioRaiseVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+"]; + ", XF86AudioLowerVolume" = ["exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%-"]; + ", XF86AudioPlay" = ["exec, playerctl play-pause"]; + ", XF86AudioPrev" = ["exec, playerctl previous"]; + ", XF86AudioNext" = ["exec, playerctl next"]; - if [[ "$CURRENT" == "1" ]]; then - ${hyprctl} keyword input:follow_mouse 0 - ${notify} "Disabled Mouse Focus!" - else - ${hyprctl} keyword input:follow_mouse 1 - ${notify} "Enabled Mouse Focus!" - fi - ''; - in ["exec, ${toggleMouseFocus}/bin/hypr-toggle-mouse-focus"]; + # Brightness + ", XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset gamma -10"]; + ", XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset gamma +10"]; + "$mainMod, XF86MonBrightnessDown" = ["exec, hyprctl hyprsunset temperature 5750"]; + "$mainMod, XF86MonBrightnessUp" = ["exec, hyprctl hyprsunset identity"]; - # "CTRL ALT, t" = ["exec, bash -c 'systemctl --user restart hyprpanel.service'"]; - }; + "CTRL ALT, f" = let + hyprctl = "${config.wayland.windowManager.hyprland.package}/bin/hyprctl"; + grep = "${pkgs.gnugrep}/bin/grep"; + awk = "${pkgs.gawk}/bin/gawk"; + notify = "${pkgs.libnotify}/bin/notify-send"; + + toggleMouseFocus = pkgs.writeScriptBin "hypr-toggle-mouse-focus" '' + CURRENT=$(${hyprctl} getoption input:follow_mouse | ${grep} int | ${awk} -F' ' '{print $2}') + + if [[ "$CURRENT" == "1" ]]; then + ${hyprctl} keyword input:follow_mouse 0 + ${notify} "Disabled Mouse Focus!" + else + ${hyprctl} keyword input:follow_mouse 1 + ${notify} "Enabled Mouse Focus!" + fi + ''; + in ["exec, ${toggleMouseFocus}/bin/hypr-toggle-mouse-focus"]; + + # "CTRL ALT, t" = ["exec, bash -c 'systemctl --user restart hyprpanel.service'"]; + } + ]; ws-bindings = { # "" = ""; diff --git a/home/modules/hyprland/autostart.nix b/home/modules/hyprland/autostart.nix index c6ef1faf..e10a4591 100644 --- a/home/modules/hyprland/autostart.nix +++ b/home/modules/hyprland/autostart.nix @@ -7,6 +7,7 @@ builtins.concatLists [ (lib.optionals hyprland.dunst.enable ["dunst"]) # Notifications (lib.optionals hyprland.hyprpanel.enable ["hyprpanel"]) # Panel + (lib.optionals hyprland.caelestia.enable ["caelestia shell"]) # Panel/Shell # TODO: Crashes on startup [ # Start clipboard management "wl-paste -t text --watch clipman store --no-persist" diff --git a/home/modules/hyprland/caelestia.nix b/home/modules/hyprland/caelestia.nix index 9996564a..747dda3e 100644 --- a/home/modules/hyprland/caelestia.nix +++ b/home/modules/hyprland/caelestia.nix @@ -4,6 +4,7 @@ color, }: { enable = hyprland.caelestia.enable; + systemd = { enable = false; # Start from hyprland autostart target = "graphical-session.target"; @@ -11,16 +12,505 @@ }; settings = { - bar.status = { - showBattery = false; + appearance = { + anim = {durations = {scale = 1;};}; + font = { + family = { + clock = "Rubik"; + material = "Material Symbols Rounded"; + mono = color.font; + sans = color.font; + }; + size = {scale = 1;}; + }; + + padding = {scale = 1;}; + rounding = {scale = 1;}; + spacing = {scale = 1;}; + + transparency = { + base = 0.85; + enabled = false; + layers = 0.4; + }; + }; + + background = { + desktopClock = {enabled = false;}; + enabled = true; + + # Lags when visible on both monitors (different refresh rates?) + visualiser = { + autoHide = true; + blur = true; + enabled = false; + rounding = 1; + spacing = 1; + }; + }; + + bar = { + clock = {showIcon = true;}; + dragThreshold = 20; + + entries = [ + { + enabled = true; + id = "logo"; + } + { + enabled = true; + id = "workspaces"; + } + { + enabled = true; + id = "spacer"; + } + { + enabled = true; + id = "activeWindow"; + } + { + enabled = true; + id = "spacer"; + } + { + enabled = true; + id = "clock"; + } + { + enabled = true; + id = "tray"; + } + { + enabled = true; + id = "statusIcons"; + } + { + enabled = true; + id = "power"; + } + ]; + + persistent = true; + + popouts = { + activeWindow = true; + statusIcons = true; + tray = true; + }; + + scrollActions = { + brightness = false; + volume = true; + workspaces = true; + }; + + showOnHover = true; + + status = { + showAudio = true; + showBattery = false; + showBluetooth = true; + showKbLayout = false; + showLockStatus = true; + showMicrophone = false; + showNetwork = true; + }; + + tray = { + background = true; + compact = false; + iconSubs = []; + recolour = false; + }; + + workspaces = { + activeIndicator = true; + activeLabel = "󰮯"; + activeTrail = true; + label = "  "; + occupiedBg = false; + occupiedLabel = "󰮯"; + perMonitorWorkspaces = false; + showWindows = false; + shown = 10; + + # Pick them here: https://fonts.google.com/icons + specialWorkspaceIcons = [ + { + icon = "music_note"; + name = "rmpc"; + } + { + icon = "memory"; + name = "btop"; + } + { + icon = "mark_chat_unread"; + name = "ferdium"; + } + { + icon = "network_intelligence"; + name = "msty"; + } + ]; + }; + }; + + border = { + rounding = 25; + thickness = 10; + }; + + dashboard = { + dragThreshold = 50; + enabled = true; + mediaUpdateInterval = 500; + showOnHover = true; + }; + + general = { + apps = { + audio = ["kitty" "--title=NcpaMixer" "-e" "ncpamixer"]; + explorer = ["kitty" "--title=Yazi" "-e" "yazi"]; + playback = ["vlc"]; + terminal = ["kitty"]; + }; + + battery = { + criticalLevel = 3; + warnLevels = [ + { + icon = "battery_android_frame_2"; + level = 20; + message = "You might want to plug in a charger"; + title = "Low battery"; + } + { + icon = "battery_android_frame_1"; + level = 10; + message = "You should probably plug in a charger now"; + title = "Did you see the previous message?"; + } + { + critical = true; + icon = "battery_android_alert"; + level = 5; + message = "PLUG THE CHARGER RIGHT NOW!!"; + title = "Critical battery level"; + } + ]; + }; + + idle = { + inhibitWhenAudio = true; + lockBeforeSleep = true; + timeouts = [ + { + idleAction = "lock"; + timeout = 600; + } + { + # idleAction = "dpms off"; + # returnAction = "dpms on"; + idleAction = "echo 'idle'"; + returnAction = "echo 'return'"; + timeout = 10000; + } + { + # idleAction = ["systemctl" "suspend-then-hibernate"]; + idleAction = ["echo" "'idle'"]; + timeout = 20000; + } + ]; + }; + }; + + launcher = { + actionPrefix = ">"; + actions = [ + { + command = ["autocomplete" "calc"]; + dangerous = false; + description = "Do simple math equations (powered by Qalc)"; + enabled = true; + icon = "calculate"; + name = "Calculator"; + } + { + command = ["autocomplete" "scheme"]; + dangerous = false; + description = "Change the current colour scheme"; + enabled = true; + icon = "palette"; + name = "Scheme"; + } + { + command = ["autocomplete" "wallpaper"]; + dangerous = false; + description = "Change the current wallpaper"; + enabled = true; + icon = "image"; + name = "Wallpaper"; + } + { + command = ["autocomplete" "variant"]; + dangerous = false; + description = "Change the current scheme variant"; + enabled = true; + icon = "colors"; + name = "Variant"; + } + { + command = ["autocomplete" "transparency"]; + dangerous = false; + description = "Change shell transparency"; + enabled = false; + icon = "opacity"; + name = "Transparency"; + } + { + command = ["caelestia" "wallpaper" "-r"]; + dangerous = false; + description = "Switch to a random wallpaper"; + enabled = false; + icon = "casino"; + name = "Random"; + } + { + command = ["setMode" "light"]; + dangerous = false; + description = "Change the scheme to light mode"; + enabled = true; + icon = "light_mode"; + name = "Light"; + } + { + command = ["setMode" "dark"]; + dangerous = false; + description = "Change the scheme to dark mode"; + enabled = true; + icon = "dark_mode"; + name = "Dark"; + } + { + command = ["systemctl" "poweroff"]; + dangerous = true; + description = "Shutdown the system"; + enabled = true; + icon = "power_settings_new"; + name = "Shutdown"; + } + { + command = ["systemctl" "reboot"]; + dangerous = true; + description = "Reboot the system"; + enabled = true; + icon = "cached"; + name = "Reboot"; + } + { + command = ["loginctl" "terminate-user" ""]; + dangerous = true; + description = "Log out of the current session"; + enabled = true; + icon = "exit_to_app"; + name = "Logout"; + } + { + command = ["loginctl" "lock-session"]; + dangerous = false; + description = "Lock the current session"; + enabled = true; + icon = "lock"; + name = "Lock"; + } + { + command = ["systemctl" "suspend-then-hibernate"]; + dangerous = false; + description = "Suspend then hibernate"; + enabled = false; + icon = "bedtime"; + name = "Sleep"; + } + ]; + + dragThreshold = 50; + enableDangerousActions = true; + hiddenApps = []; + maxShown = 7; + maxWallpapers = 9; + showOnHover = false; + specialPrefix = "@"; + useFuzzy = { + actions = false; + apps = false; + schemes = false; + variants = false; + wallpapers = false; + }; + vimKeybinds = false; + }; + + lock = {recolourLogo = false;}; + + notifs = { + actionOnClick = false; + clearThreshold = 0.3; + defaultExpireTimeout = 5000; + expandThreshold = 20; + expire = true; + }; + + osd = { + enableBrightness = false; + enableMicrophone = true; + enabled = true; + hideDelay = 2000; + }; + + paths = { + mediaGif = "root:/assets/bongocat.gif"; + sessionGif = "root:/assets/kurukuru.gif"; + wallpaperDir = "~/NixFlake/wallpapers"; + }; + + services = { + audioIncrement = 0.1; + defaultPlayer = "MPD"; + gpuType = ""; + maxVolume = 1; + playerAliases = [ + { + from = "com.github.th_ch.youtube_music"; + to = "YT Music"; + } + ]; + smartScheme = true; + useFahrenheit = false; + useTwelveHourClock = false; + visualiserBars = 45; + weatherLocation = "Dortmund, Germany"; + }; + + session = { + commands = { + hibernate = ["systemctl" "hibernate"]; + logout = ["loginctl" "terminate-user" ""]; + reboot = ["systemctl" "reboot"]; + shutdown = ["systemctl" "poweroff"]; + }; + dragThreshold = 30; + enabled = true; + vimKeybinds = false; + }; + + sidebar = { + dragThreshold = 80; + enabled = true; + }; + + utilities = { + enabled = true; + maxToasts = 4; + toasts = { + audioInputChanged = true; + audioOutputChanged = true; + capsLockChanged = true; + chargingChanged = true; + configLoaded = true; + dndChanged = true; + gameModeChanged = true; + kbLayoutChanged = false; + nowPlaying = false; + numLockChanged = true; + vpnChanged = true; + }; + + vpn = { + enabled = false; + provider = [ + { + displayName = "Wireguard (Your VPN)"; + interface = "your-connection-name"; + name = "wireguard"; + } + ]; + }; }; - paths.wallpaperDir = "~/NixFlake/wallpapers"; }; cli = { enable = hyprland.caelestia.enable; + settings = { - theme.enableGtk = false; + record = {extraArgs = [];}; + + theme = { + enableBtop = false; + enableDiscord = false; + enableFuzzel = false; + enableGtk = false; + enableHypr = false; + enableQt = false; + enableSpicetify = false; + enableTerm = false; + }; + + toggles = { + communication = { + discord = { + command = ["discord"]; + enable = false; + match = [{class = "discord";}]; + move = true; + }; + whatsapp = { + enable = false; + match = [{class = "whatsapp";}]; + move = true; + }; + }; + + music = { + feishin = { + enable = false; + match = [{class = "feishin";}]; + move = true; + }; + spotify = { + command = ["spicetify" "watch" "-s"]; + enable = false; + match = [{class = "Spotify";} {initialTitle = "Spotify";} {initialTitle = "Spotify Free";}]; + move = true; + }; + }; + + sysmon = { + btop = { + command = ["kitty" "--title" "Btop" "-e" "btop"]; + enable = false; + match = [ + { + class = "btop"; + title = "Btop"; + workspace = {name = "special:sysmon";}; + } + ]; + }; + }; + + todo = { + todoist = { + command = ["todoist"]; + enable = false; + match = [{class = "Todoist";}]; + move = true; + }; + }; + }; + wallpaper = {postHook = "echo $WALLPAPER_PATH";}; }; }; } diff --git a/home/modules/hyprland/default.nix b/home/modules/hyprland/default.nix index 192aa779..8d8fa660 100644 --- a/home/modules/hyprland/default.nix +++ b/home/modules/hyprland/default.nix @@ -133,12 +133,12 @@ in { # Make sure the units only start when using Hyprland systemd.user.services.dunst.Unit.After = lib.mkIf hyprland.dunst.enable (lib.mkForce ["hyprland-session.target"]); systemd.user.services.dunst.Unit.PartOf = lib.mkIf hyprland.dunst.enable (lib.mkForce ["hyprland-session.target"]); - systemd.user.services.hypridle.Install.WantedBy = lib.mkForce ["hyprland-session.target"]; - systemd.user.services.hypridle.Unit.After = lib.mkForce ["hyprland-session.target"]; - systemd.user.services.hypridle.Unit.PartOf = lib.mkForce ["hyprland-session.target"]; - systemd.user.services.hyprpaper.Install.WantedBy = lib.mkForce ["hyprland-session.target"]; - systemd.user.services.hyprpaper.Unit.After = lib.mkForce ["hyprland-session.target"]; - systemd.user.services.hyprpaper.Unit.PartOf = lib.mkForce ["hyprland-session.target"]; + systemd.user.services.hypridle.Install.WantedBy = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]); + systemd.user.services.hypridle.Unit.After = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]); + systemd.user.services.hypridle.Unit.PartOf = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]); + systemd.user.services.hyprpaper.Install.WantedBy = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]); + systemd.user.services.hyprpaper.Unit.After = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]); + systemd.user.services.hyprpaper.Unit.PartOf = lib.mkIf (!hyprland.caelestia.enable) (lib.mkForce ["hyprland-session.target"]); wayland.windowManager.hyprland = { enable = true; diff --git a/home/modules/hyprland/hypridle.nix b/home/modules/hyprland/hypridle.nix index ee7a8dd9..b6315a0e 100644 --- a/home/modules/hyprland/hypridle.nix +++ b/home/modules/hyprland/hypridle.nix @@ -3,7 +3,7 @@ hyprland, color, }: { - enable = true; + enable = !hyprland.caelestia.enable; settings = { general = { diff --git a/home/modules/hyprland/hyprpaper.nix b/home/modules/hyprland/hyprpaper.nix index 1e71b4f6..fd2454d6 100644 --- a/home/modules/hyprland/hyprpaper.nix +++ b/home/modules/hyprland/hyprpaper.nix @@ -3,7 +3,7 @@ hyprland, color, }: { - enable = true; + enable = !hyprland.caelestia.enable; settings = { ipc = "on"; diff --git a/home/modules/hyprland/mappings.nix b/home/modules/hyprland/mappings.nix index 5b13ee00..1addec88 100644 --- a/home/modules/hyprland/mappings.nix +++ b/home/modules/hyprland/mappings.nix @@ -6,14 +6,10 @@ lib.mergeAttrsList [ { # Hyprland control - "$mainMod, a" = ["exec, rofi -drun-show-actions -show drun"]; "$mainMod, q" = ["killactive"]; "$mainMod, v" = ["togglefloating"]; "$mainMod, f" = ["fullscreen"]; - "$mainMod, c" = ["exec, clipman pick --tool=rofi"]; - "$mainMod SHIFT, l" = ["exec, loginctl lock-session"]; "$mainMod, tab" = ["workspace, previous"]; - "ALT, tab" = ["exec, rofi -show window"]; # "$mainMod, g" = ["togglegroup"]; # "ALT, tab" = ["changegroupactive"]; diff --git a/home/modules/rofi/default.nix b/home/modules/rofi/default.nix index 268a700b..3eb027aa 100644 --- a/home/modules/rofi/default.nix +++ b/home/modules/rofi/default.nix @@ -184,18 +184,19 @@ in { (color.wallpapers |> builtins.map (setWallpaperOnMonitors monitors) |> lib.mergeAttrsList); - in { - bindings = lib.mergeAttrsList [ - { - "$mainMod, escape" = ["exec, \"${power-menu}/bin/rofi-menu-power\""]; - "$mainMod, m" = ["exec, \"${keybinds-menu}/bin/rofi-menu-keybinds\""]; - "$mainMod, w" = ["exec, \"${wallpaper-menu}/bin/rofi-menu-wall\""]; - # "$mainMod, o" = ["exec, \"${lectures-menu}\""]; - } - (lib.optionalAttrs (!nixosConfig.modules.network.useNetworkManager) { - "$mainMod, U" = ["exec, \"${vpn-menu}/rofi-menu-vpn\""]; - }) - ]; - }; + in + lib.mkIf (!config.modules.hyprland.caelestia.enable) { + bindings = lib.mergeAttrsList [ + { + "$mainMod, escape" = ["exec, \"${power-menu}/bin/rofi-menu-power\""]; + "$mainMod, m" = ["exec, \"${keybinds-menu}/bin/rofi-menu-keybinds\""]; + "$mainMod, w" = ["exec, \"${wallpaper-menu}/bin/rofi-menu-wall\""]; + # "$mainMod, o" = ["exec, \"${lectures-menu}\""]; + } + (lib.optionalAttrs (!nixosConfig.modules.network.useNetworkManager) { + "$mainMod, U" = ["exec, \"${vpn-menu}/rofi-menu-vpn\""]; + }) + ]; + }; }; } diff --git a/system/default.nix b/system/default.nix index 783e3649..77260597 100644 --- a/system/default.nix +++ b/system/default.nix @@ -389,6 +389,21 @@ with mylib.networking; { wacom.enable = true; }; + # greetd = { + # enable = !headless; + # restart = false; + # useTextGreeter = true; + # + # settings = { + # terminal.vt = 1; + # + # default_session = { + # command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd $SHELL"; + # user = "greeter"; + # }; + # }; + # }; + # Enable touchpad support (enabled default in most desktopManager). libinput.enable = !headless;