From e29aa76eacb1544a628c48f955cdf10d6f6b0957 Mon Sep 17 00:00:00 2001 From: Kat Inskip Date: Sun, 29 Jan 2023 08:07:48 -0800 Subject: [PATCH] feat: add much required NixOS stuff --- common/overlay.nix | 1 + flake.lock | 30 ++-- kat/base16.nix | 28 +--- kat/default.nix | 7 + kat/gui/gtk.nix | 21 +++ kat/gui/konashow.nix | 20 +++ kat/gui/layout.xkb | 7 + kat/gui/mako.nix | 27 ++++ kat/gui/media.nix | 7 + kat/gui/mpv.nix | 119 ++++++++++++++ kat/gui/packages.nix | 32 ++++ kat/gui/sway.nix | 325 ++++++++++++++++++++++++++++++++++++++ kat/gui/swaylock.nix | 45 ++++++ kat/gui/waybar.nix | 138 ++++++++++++++++ kat/gui/waybar.sass | 172 ++++++++++++++++++++ kat/gui/wofi.nix | 3 + kat/gui/wofi.sass | 26 +++ kat/gui/xdg.nix | 16 ++ kat/gui/xkb.nix | 7 + kat/shell/git.nix | 1 + lib.nix | 7 + modules/home/base16.nix | 68 ++++++++ nixos/common/base16.nix | 9 ++ nixos/common/boot.nix | 29 ++++ nixos/common/docs.nix | 3 + nixos/common/getty.nix | 10 ++ nixos/common/grub.nix | 6 - nixos/common/locale.nix | 20 +++ nixos/common/network.nix | 3 + nixos/common/shell.nix | 6 + nixos/common/ssh.nix | 26 +++ nixos/common/time.nix | 12 ++ nixos/common/users.nix | 3 + nixos/gnome.nix | 17 -- nixos/gui/fonts.nix | 22 +++ nixos/gui/gpg.nix | 10 ++ nixos/gui/nfs.nix | 3 + nixos/gui/packages.nix | 6 + nixos/gui/qt.nix | 7 + nixos/gui/sound.nix | 52 ++++++ nixos/gui/sway.nix | 9 ++ nixos/gui/xdg-portals.nix | 11 ++ outputs.nix | 6 +- pkgs.nix | 3 +- systems/default.nix | 10 +- systems/koishi.nix | 3 +- tree.nix | 3 + 47 files changed, 1324 insertions(+), 72 deletions(-) create mode 100644 kat/gui/gtk.nix create mode 100644 kat/gui/konashow.nix create mode 100644 kat/gui/layout.xkb create mode 100644 kat/gui/mako.nix create mode 100644 kat/gui/media.nix create mode 100644 kat/gui/mpv.nix create mode 100644 kat/gui/packages.nix create mode 100644 kat/gui/sway.nix create mode 100644 kat/gui/swaylock.nix create mode 100644 kat/gui/waybar.nix create mode 100644 kat/gui/waybar.sass create mode 100644 kat/gui/wofi.nix create mode 100644 kat/gui/wofi.sass create mode 100644 kat/gui/xdg.nix create mode 100644 kat/gui/xkb.nix create mode 100644 lib.nix create mode 100644 modules/home/base16.nix create mode 100644 nixos/common/base16.nix create mode 100644 nixos/common/boot.nix create mode 100644 nixos/common/docs.nix create mode 100644 nixos/common/getty.nix delete mode 100644 nixos/common/grub.nix create mode 100644 nixos/common/locale.nix create mode 100644 nixos/common/network.nix create mode 100644 nixos/common/shell.nix create mode 100644 nixos/common/ssh.nix create mode 100644 nixos/common/time.nix create mode 100644 nixos/common/users.nix delete mode 100644 nixos/gnome.nix create mode 100644 nixos/gui/fonts.nix create mode 100644 nixos/gui/gpg.nix create mode 100644 nixos/gui/nfs.nix create mode 100644 nixos/gui/packages.nix create mode 100644 nixos/gui/qt.nix create mode 100644 nixos/gui/sound.nix create mode 100644 nixos/gui/sway.nix create mode 100644 nixos/gui/xdg-portals.nix diff --git a/common/overlay.nix b/common/overlay.nix index 33ebbfd8..ec22d9af 100644 --- a/common/overlay.nix +++ b/common/overlay.nix @@ -5,5 +5,6 @@ }: { nixpkgs = { overlays = import tree.overlays {inherit inputs;}; + config.allowUnfree = true; }; } diff --git a/flake.lock b/flake.lock index 2e602ea8..ebb48eb1 100644 --- a/flake.lock +++ b/flake.lock @@ -24,11 +24,11 @@ "arcexprs": { "flake": false, "locked": { - "lastModified": 1673969973, - "narHash": "sha256-h0x2JpBFlxZOUE29Iced/Ci/5w4kXs52TgYaVzbBusA=", + "lastModified": 1674878824, + "narHash": "sha256-skuyKtydzGFtd2UQB2BZW2bMaUcS+fvHEEz+H4MNQ4g=", "owner": "arcnmx", "repo": "nixexprs", - "rev": "f0f8f76dc306ebbe7ac45008f36607243148969c", + "rev": "ab1bd348da95d6f33ad28992b5d8c636d2330cc9", "type": "github" }, "original": { @@ -126,11 +126,11 @@ ] }, "locked": { - "lastModified": 1674041176, - "narHash": "sha256-cMf1BQzI39nHQ0H/mOatthbbI3392qLmJ9gU0u520P4=", + "lastModified": 1674771519, + "narHash": "sha256-U0W3S1nX6yEvLh3Vq70EORbmXecAKXfmEfCfaA4A+I8=", "owner": "nix-community", "repo": "home-manager", - "rev": "2c29ae48f9a149151bdd82f429ac61d4412c312a", + "rev": "bb4b25b302dbf0f527f190461b080b5262871756", "type": "github" }, "original": { @@ -173,11 +173,11 @@ ] }, "locked": { - "lastModified": 1673752441, - "narHash": "sha256-/g4ImZWV05CrXRWTSJsda6ztIp7LAPxs2L6RCrbQ66U=", + "lastModified": 1674357402, + "narHash": "sha256-oxOCYORXBh0KW4KEwKpzs2LThDdVmEwREV+SsP4CIpg=", "owner": "Mic92", "repo": "nix-index-database", - "rev": "391180f77505c1c8cdd45fe1a59dc89d3e40300a", + "rev": "e9e7c5c62965e7e656febb5ba578d53f751eb41f", "type": "github" }, "original": { @@ -188,11 +188,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1673796341, - "narHash": "sha256-1kZi9OkukpNmOaPY7S5/+SlCDOuYnP3HkXHvNDyLQcc=", + "lastModified": 1674641431, + "narHash": "sha256-qfo19qVZBP4qn5M5gXc/h1MDgAtPA5VxJm9s8RUAkVk=", "owner": "nixos", "repo": "nixpkgs", - "rev": "6dccdc458512abce8d19f74195bb20fdb067df50", + "rev": "9b97ad7b4330aacda9b2343396eb3df8a853b4fc", "type": "github" }, "original": { @@ -205,11 +205,11 @@ "pypi-deps-db": { "flake": false, "locked": { - "lastModified": 1674040379, - "narHash": "sha256-g0TSvbl31l81qYIMGIM7p1buPaA9rHM3N/WFD6Zk/RY=", + "lastModified": 1674855014, + "narHash": "sha256-SMUq72uWWs+KAlcRB7UXzI1QHNTGiUTpQK2qj1evHXQ=", "owner": "DavHau", "repo": "pypi-deps-db", - "rev": "322a4f20c357704644abe8c2e50412e9b9c16909", + "rev": "a375715227007ca768d372b2b09bcb76f8f19d78", "type": "github" }, "original": { diff --git a/kat/base16.nix b/kat/base16.nix index b09badb6..1a6df9e0 100644 --- a/kat/base16.nix +++ b/kat/base16.nix @@ -6,33 +6,7 @@ inherit (lib.modules) mkMerge; in { base16 = { - vim.enable = false; - vim.template = data: let - drv = pkgs.base16-templates.vim.withTemplateData data; - in - drv.overrideAttrs (old: { - src = pkgs.fetchFromGitHub { - repo = "base16-vim"; - owner = "fnune"; - rev = "52e4ce93a6234d112bc88e1ad25458904ffafe61"; - sha256 = "10y8z0ycmdjk47dpxf6r2pc85k0y19a29aww99vgnxp31wrkc17h"; - }; - patches = - old.patches - or [] - ++ [ - (pkgs.fetchurl { - # base16background=none - url = "https://github.com/arcnmx/base16-vim/commit/fe16eaaa1de83b649e6867c61494276c1f35c3c3.patch"; - sha256 = "1c0n7mf6161mvxn5xlabhyxzha0m1c41csa6i43ng8zybbspipld"; - }) - (pkgs.fetchurl { - # fix unreadable error highlights under cursor - url = "https://github.com/arcnmx/base16-vim/commit/807e442d95c57740dd3610c9f9c07c9aae8e0995.patch"; - sha256 = "1l3qmk15v8d389363adkmfg8cpxppyhlk215yq3rdcasvw7r8bla"; - }) - ]; - }); + vim.enable = true; shell.enable = true; schemes = mkMerge [ { diff --git a/kat/default.nix b/kat/default.nix index ea0c7276..f3c6c11a 100644 --- a/kat/default.nix +++ b/kat/default.nix @@ -23,6 +23,13 @@ in neovim ]; }; + gui = { + imports = with dirImports; [ + gui + wezterm + gpg + ]; + }; work = { imports = with dirImports; [ wezterm diff --git a/kat/gui/gtk.nix b/kat/gui/gtk.nix new file mode 100644 index 00000000..ccb579ff --- /dev/null +++ b/kat/gui/gtk.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + gnome.adwaita-icon-theme + ]; + + gtk = { + enable = true; + font = { + name = "Iosevka Comfy"; + size = 9; + }; + iconTheme = { + name = "Maia"; + package = pkgs.maia-icon-theme; + }; + theme = { + name = "Adapta"; + package = pkgs.adapta-gtk-theme; + }; + }; +} diff --git a/kat/gui/konashow.nix b/kat/gui/konashow.nix new file mode 100644 index 00000000..1a34dce8 --- /dev/null +++ b/kat/gui/konashow.nix @@ -0,0 +1,20 @@ +{ config, pkgs, nixos, lib, ... }: { + # TODO: fix lib use + home.packages = [ + config.services.konawall.konashow + ]; + + services.konawall = { + enable = true; + interval = "30m"; + mode = "shuffle"; + commonTags = [ "width:>=1600" ]; + tagList = map (lib.toList) [ + ([ + "score:>=50" + #"no_humans" + #"rating:s" + ]) + ]; + }; +} diff --git a/kat/gui/layout.xkb b/kat/gui/layout.xkb new file mode 100644 index 00000000..c05a1f1b --- /dev/null +++ b/kat/gui/layout.xkb @@ -0,0 +1,7 @@ +default partial alphanumeric_keys +xkb_symbols "basic" { + include "us(altgr-intl)" + name[Group1] = "English (US, international with pound sign)"; + key { [ e, E, EuroSign, cent ] }; + key { [ 3, numbersign, sterling] }; +}; diff --git a/kat/gui/mako.nix b/kat/gui/mako.nix new file mode 100644 index 00000000..73331c36 --- /dev/null +++ b/kat/gui/mako.nix @@ -0,0 +1,27 @@ +{ config, pkgs, lib, ... }: let + inherit (config.base16) palette; +in { + systemd.user.services = { + mako = { + Unit = { + Description = "mako"; + X-Restart-Triggers = + [ (toString config.xdg.configFile."mako/config".source) ]; + }; + Service = { + ExecStart = "${pkgs.mako}/bin/mako"; + Restart = "always"; + }; + Install = { WantedBy = [ "graphical-session.target" ]; }; + }; + }; + + programs.mako = { + enable = true; + font = "Iosevka Comfy 10"; + defaultTimeout = 3000; + borderColor = palette.base08; + backgroundColor = "${palette.base00}BF"; + textColor = palette.base05; + }; +} diff --git a/kat/gui/media.nix b/kat/gui/media.nix new file mode 100644 index 00000000..e8b63776 --- /dev/null +++ b/kat/gui/media.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + imv # Image viewer + yt-dlp # Downloading media + v4l-utils # Webcam + ]; +} diff --git a/kat/gui/mpv.nix b/kat/gui/mpv.nix new file mode 100644 index 00000000..7d4d65b9 --- /dev/null +++ b/kat/gui/mpv.nix @@ -0,0 +1,119 @@ +{ config, lib, pkgs, ... }: let + inherit (lib.modules) mkMerge mkIf; + inherit (lib.attrsets) mapAttrsToList; +in { + # TODO: fix lib usage + programs.mpv = { + enable = true; + scripts = with pkgs.mpvScripts; [ sponsorblock paused ]; + bindings = + let + vim = { + "l" = "seek 5"; + "h" = "seek -5"; + "k" = "seek 60"; + "j" = "seek -60"; + "Ctrl+l" = "seek 1 exact"; + "Ctrl+h" = "seek -1 exact"; + "Ctrl+L" = "sub-seek 1"; + "Ctrl+H" = "sub-seek -1"; + "Ctrl+k" = "add chapter 1"; + "Ctrl+j" = "add chapter -1"; + "Ctrl+K" = "playlist-next"; + "Ctrl+J" = "playlist-prev"; + "Alt+h" = "frame-back-step"; + "Alt+l" = "frame-step"; + "`" = "cycle mute"; + "MBTN_RIGHT" = "cycle pause"; + "w" = "screenshot"; + "W" = "screenshot video"; + "Ctrl+w" = "screenshot window"; + "Ctrl+W" = "screenshot each-frame"; + "o" = "show-progress"; + "O" = "script-message show_osc_dur 5"; + "F1" = "cycle sub"; + "F2" = "cycle audio"; + "Ctrl+p" = "cycle video"; + "L" = "add volume 2"; + "H" = "add volume -2"; + "Alt+H" = "add audio-delay -0.100"; + "Alt+L" = "add audio-delay 0.100"; + "1" = "set volume 10"; + "2" = "set volume 20"; + "3" = "set volume 30"; + "4" = "set volume 40"; + "5" = "set volume 50"; + "6" = "set volume 60"; + "7" = "set volume 70"; + "8" = "set volume 80"; + "9" = "set volume 90"; + ")" = "set volume 150"; + "0" = "set volume 100"; + "m" = "cycle mute"; + "Ctrl+r" = "loadfile \${path}"; + "Ctrl+R" = "video-reload"; + "d" = "drop-buffers"; + "Ctrl+d" = "quit"; + }; + other = { + "RIGHT" = vim."l"; + "LEFT" = vim."h"; + "UP" = vim."k"; + "DOWN" = vim."j"; + "Ctrl+0" = "set speed 1.0"; + "Ctrl+=" = "multiply speed 1.1"; + "Ctrl+-" = "multiply speed 1/1.1"; + "Shift+LEFT" = vim."H"; + "Shift+RIGHT" = vim."L"; + "Ctrl+RIGHT" = vim."Ctrl+l"; + "Ctrl+LEFT" = vim."Ctrl+h"; + "Ctrl+Shift+LEFT" = vim."Ctrl+H"; + "Ctrl+Shift+RIGHT" = vim."Ctrl+L"; + "Ctrl+UP" = vim."Ctrl+k"; + "Ctrl+DOWN" = vim."Ctrl+j"; + "Ctrl+Shift+UP" = vim."Ctrl+K"; + "Ctrl+Shift+DOWN" = vim."Ctrl+J"; + "Alt+LEFT" = vim."Alt+h"; + "Alt+RIGHT" = vim."Alt+l"; + "SPACE" = vim."MBTN_RIGHT"; + "m" = vim."`"; + "WHEEL_UP" = vim."L"; + "WHEEL_DOWN" = vim."H"; + }; + in + vim // other; + config = mkMerge [ + (mkIf config.wayland.windowManager.sway.enable { + gpu-context = "wayland"; + }) + { + no-input-default-bindings = ""; + profile = "gpu-hq"; + hwdec = "auto"; + vo = "gpu"; + volume-max = 200; + keep-open = true; + opengl-waitvsync = true; + demuxer-max-bytes = "2000MiB"; + demuxer-max-back-bytes = "250MiB"; + osd-scale-by-window = false; + osd-bar-h = 2.5; # 3.125 default + osd-border-size = 2; # font border pixels, default 3 + term-osd-bar = true; + script-opts = builtins.concatStringsSep "," + (mapAttrsToList (k: v: "${k}=${toString v}") { + ytdl_hook-ytdl_path = "${pkgs.yt-dlp}/bin/yt-dlp"; + osc-layout = "slimbox"; + osc-vidscale = "no"; + osc-deadzonesize = 0.75; + osc-minmousemove = 4; + osc-hidetimeout = 2000; + osc-valign = 0.9; + osc-timems = "yes"; + osc-seekbarstyle = "knob"; + osc-seekbarkeyframes = "no"; + osc-seekrangestyle = "slider"; + }); + }]; + }; +} diff --git a/kat/gui/packages.nix b/kat/gui/packages.nix new file mode 100644 index 00000000..e2774feb --- /dev/null +++ b/kat/gui/packages.nix @@ -0,0 +1,32 @@ +{ pkgs, ... }: { + home.packages = with pkgs; [ + # Password manager + bitwarden + # Task managers + btop + htop + # Browser + brave + # Mail + thunderbird + # Music + spotify + # Chat + discord + nheko # Matrix + tdesktop # Telegram + dino # XMPP + signal-desktop + element-desktop + mumble-develop + # Archivery + unzip + zip + p7zip + # Misc + exiftool # EXIF Stripping + lm_sensors # Sensor Data + cryptsetup # Encrypted block devices + yubikey-manager # Yubikey + ]; +} diff --git a/kat/gui/sway.nix b/kat/gui/sway.nix new file mode 100644 index 00000000..5d40d0a3 --- /dev/null +++ b/kat/gui/sway.nix @@ -0,0 +1,325 @@ +{ + config, + pkgs, + lib, + ... +}: let + # TODO: fix use of lib + lockCommand = config.programs.swaylock.script; +in { + programs.zsh.profileExtra = '' + # If running from tty1 start sway + if [ "$(tty)" = "/dev/tty1" ]; then + systemctl --user unset-environment \ + SWAYSOCK \ + I3SOCK \ + WAYLAND_DISPLAY \ + DISPLAY \ + IN_NIX_SHELL \ + __HM_SESS_VARS_SOURCED \ + GPG_TTY \ + NIX_PATH \ + SHLVL + exec env --unset=SHLVL systemd-cat -t sway -- sway + fi + ''; + + home = { + sessionVariables = { + XDG_CURRENT_DESKTOP = "Unity"; + XDG_SESSION_TYPE = "wayland"; + WLR_DRM_DEVICES = "/dev/dri/card0"; + }; + packages = with pkgs; [ + grim + slurp + swaylock-fancy + wl-clipboard + jq + quintom-cursor-theme + gsettings-desktop-schemas + glib + wofi + wmctrl + ]; + }; + + services = { + i3gopher.enable = true; + }; + + wayland.windowManager.sway = let + cfg = config.wayland.windowManager.sway.config; + + bindsym = k: v: "bindsym ${k} ${v}"; + + bindWorkspace = key: workspace: { + "${cfg.modifier}+${key}" = "workspace number ${workspace}"; + "${cfg.modifier}+shift+${key}" = "move container to workspace number ${workspace}"; + }; + + workspaceBindings = map (v: bindWorkspace v "${v}:${v}") [ + "1" + "2" + "3" + "4" + "5" + "6" + "7" + "8" + "9" + ] ++ [( + bindWorkspace "0" "10:10") + ] ++ lib.imap1 (i: v: bindWorkspace v "${toString (10 + i)}:${v}") [ + "F1" + "F2" + "F3" + "F4" + "F5" + "F6" + "F7" + "F8" + "F9" + "F10" + "F11" + "F12" + ]; + + workspaceBindings' = map (lib.mapAttrsToList bindsym) workspaceBindings; + workspaceBindingsStr = lib.concatStringsSep "\n" (lib.flatten workspaceBindings'); + + in { + enable = true; + config = let + pactl = "${config.home.nixosConfig.hardware.pulseaudio.package or pkgs.pulseaudio}/bin/pactl"; + dmenu = "${pkgs.wofi}/bin/wofi -idbt ${pkgs.wezterm}/bin/wezterm -s ~/.config/wofi/wofi.css -p '' -W 25%"; + in { + modes = { + "System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown" = { + "l" = "exec ${lockCommand}, mode default"; + "e" = "exec swaymsg exit, mode default"; + "s" = "exec systemctl suspend, mode default"; + "h" = "exec systemctl hibernate, mode default"; + "r" = "exec systemctl reboot, mode default"; + "Shift+s" = "exec systemctl shutdown, mode default"; + "Return" = "mode default"; + "Escape" = "mode default"; + }; + }; + + bars = []; + + input = { + "*" = { + xkb_layout = "us_gbp_map"; + xkb_options = "compose:rctrl,ctrl:nocaps"; + }; + }; + + fonts = { + names = [ "Iosevka Comfy"]; + style = "Regular"; + size = 10.0; + }; + + terminal = "${pkgs.wezterm}/bin/wezterm"; + menu = "${pkgs.j4-dmenu-desktop}/bin/j4-dmenu-desktop --no-generic --dmenu=\"${dmenu}\" --term='${pkgs.wezterm}/bin/wezterm'"; + + modifier = "Mod4"; + + startup = [ + { command = "gsettings set org.gnome.desktop.interface cursor-theme 'Quintom_Snow'"; } + { + command = "systemctl --user restart mako"; + always = true; + } + { + command = "systemctl --user restart konawall.service"; + always = true; + } + ]; + + modes.resize = { + "a" = "resize shrink width 4 px or 4 ppt"; + "s" = "resize shrink height 4 px or 4 ppt"; + "w" = "resize grow height 4 px or 4 ppt"; + "d" = "resize grow width 4 px or 4 ppt"; + "Left" = "resize shrink width 4 px or 4 ppt"; + "Down" = "resize shrink height 4 px or 4 ppt"; + "Up" = "resize grow height 4 px or 4 ppt"; + "Right" = "resize grow width 4 px or 4 ppt"; + Return = ''mode "default"''; + Escape = ''mode "default"''; + "${cfg.modifier}+z" = ''mode "default"''; + }; + + window = { + border = 1; + titlebar = false; + }; + + floating = { + border = 1; + titlebar = false; + }; + + keybindings = { + "${cfg.modifier}+Return" = "exec ${cfg.terminal}"; + "${cfg.modifier}+x" = "exec ${lockCommand}"; + + # focus windows - regular + "${cfg.modifier}+Left" = "focus left"; + "${cfg.modifier}+Down" = "focus down"; + "${cfg.modifier}+Up" = "focus up"; + "${cfg.modifier}+Right" = "focus right"; + + # move window / container - regular + "${cfg.modifier}+Shift+Left" = "move left"; + "${cfg.modifier}+Shift+Down" = "move down"; + "${cfg.modifier}+Shift+Up" = "move up"; + "${cfg.modifier}+Shift+Right" = "move right"; + + # focus output - regular + "${cfg.modifier}+control+Left" = "focus output left"; + "${cfg.modifier}+control+Down" = "focus output down"; + "${cfg.modifier}+control+Up" = "focus output up"; + "${cfg.modifier}+control+Right" = "focus output right"; + + # move container to output - regular + "${cfg.modifier}+control+Shift+Left" = "move container to output left"; + "${cfg.modifier}+control+Shift+Down" = "move container to output down"; + "${cfg.modifier}+control+Shift+Up" = "move container to output up"; + "${cfg.modifier}+control+Shift+Right" = "move container to output right"; + + # move workspace to output - regular + "${cfg.modifier}+control+Shift+Mod1+Left" = "move workspace to output left"; + "${cfg.modifier}+control+Shift+Mod1+Down" = "move workspace to output down"; + "${cfg.modifier}+control+Shift+Mod1+Up" = "move workspace to output up"; + "${cfg.modifier}+control+Shift+Mod1+Right" = "move workspace to output right"; + + # focus parent/child + "${cfg.modifier}+q" = "focus parent"; + "${cfg.modifier}+e" = "focus child"; + + # floating + "${cfg.modifier}+Shift+space" = "floating toggle"; + "${cfg.modifier}+space" = "focus mode_toggle"; + + # workspace history switching + "${cfg.modifier}+Tab" = "workspace back_and_forth"; + "${cfg.modifier}+Shift+Tab" = "exec ${config.services.i3gopher.focus-last}"; + + # multimedia / laptop + "XF86AudioPlay" = "exec --no-startup-id ${pkgs.playerctl}/bin/playerctl play-pause"; + "XF86AudioLowerVolume" = "exec --no-startup-id ${pactl} set-sink-volume @DEFAULT_SINK@ -5%"; + "XF86AudioRaiseVolume" = "exec --no-startup-id ${pactl} set-sink-volume @DEFAULT_SINK@ +5%"; + "XF86AudioMute" = "exec --no-startup-id ${pactl} set-sink-mute @DEFAULT_SINK@ toggle"; + "XF86AudioMute+Shift" = "exec --no-startup-id ${pactl} set-source-mute @DEFAULT_SOURCE@ toggle"; + "XF86AudioMicMute" = "exec --no-startup-id ${pactl} set-source-mute @DEFAULT_SOURCE@ toggle"; + "XF86MonBrightnessDown" = "exec ${pkgs.light}/bin/light -U 5"; + "XF86MonBrightnessUp" = "exec ${pkgs.light}/bin/light -A 5"; + + # dmenu + "${cfg.modifier}+r" = "exec ${cfg.menu}"; + + # layout handling + "${cfg.modifier}+b" = "splith"; + "${cfg.modifier}+v" = "splitv"; + "${cfg.modifier}+o" = "layout stacking"; + "${cfg.modifier}+i" = "layout tabbed"; + "${cfg.modifier}+h" = "layout toggle split"; + "${cfg.modifier}+f" = "fullscreen"; + + # sway specific + "${cfg.modifier}+Shift+q" = "kill"; + "${cfg.modifier}+Shift+c" = "reload"; + + # mode triggers + "${cfg.modifier}+Shift+r" = "mode resize"; + "${cfg.modifier}+Delete" = ''mode "System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown"''; + }; + + colors = let + inherit (config.base16) palette; + in { + focused = { + border = palette.base01; + background = palette.base0D; + text = palette.base07; + indicator = palette.base0D; + childBorder = palette.base0D; + }; + focusedInactive = { + border = palette.base02; + background = palette.base04; + text = palette.base00; + indicator = palette.base04; + childBorder = palette.base04; + }; + unfocused = { + border = palette.base01; + background = palette.base02; + text = palette.base06; + indicator = palette.base02; + childBorder = palette.base02; + }; + urgent = { + border = palette.base03; + background = palette.base08; + text = palette.base00; + indicator = palette.base08; + childBorder = palette.base08; + }; + }; + }; + + wrapperFeatures.gtk = true; + + extraConfig = '' + hide_edge_borders smart_no_gaps + smart_borders no_gaps + title_align center + seat seat0 xcursor_theme Quintom_Snow 20 + workspace_auto_back_and_forth yes + set $mode_gaps Gaps: (o) outer, (i) inner + set $mode_gaps_outer Outer Gaps: +|-|0 (local), Shift + +|-|0 (global) + set $mode_gaps_inner Inner Gaps: +|-|0 (local), Shift + +|-|0 (global) + bindsym ${cfg.modifier}+Shift+g mode "$mode_gaps" + + mode "$mode_gaps" { + bindsym o mode "$mode_gaps_outer" + bindsym i mode "$mode_gaps_inner" + bindsym Return mode "default" + bindsym Escape mode "default" + } + + mode "$mode_gaps_inner" { + bindsym equal gaps inner current plus 5 + bindsym minus gaps inner current minus 5 + bindsym 0 gaps inner current set 0 + + bindsym plus gaps inner all plus 5 + bindsym Shift+minus gaps inner all minus 5 + bindsym Shift+0 gaps inner all set 0 + + bindsym Return mode "default" + bindsym Escape mode "default" + } + + mode "$mode_gaps_outer" { + bindsym equal gaps outer current plus 5 + bindsym minus gaps outer current minus 5 + bindsym 0 gaps outer current set 0 + + bindsym plus gaps outer all plus 5 + bindsym Shift+minus gaps outer all minus 5 + bindsym Shift+0 gaps outer all set 0 + + bindsym Return mode "default" + bindsym Escape mode "default" + } + + ${workspaceBindingsStr} + ''; + }; +} diff --git a/kat/gui/swaylock.nix b/kat/gui/swaylock.nix new file mode 100644 index 00000000..7974c383 --- /dev/null +++ b/kat/gui/swaylock.nix @@ -0,0 +1,45 @@ +{ config, pkgs, ... }: { + programs.swaylock = { + enable = true; + package = pkgs.swaylock-effects-develop; + args = { + screenshots = true; + daemonize = true; + show-failed-attempts = true; + indicator = true; + indicator-radius = 110; + indicator-thickness = 8; + font = "Iosevka Comfy"; + font-size = "12px"; + clock = true; + datestr = "%F"; + timestr = "%T"; + effect-blur = "5x2"; + fade-in = 0.2; + }; + colors = with config.base16.palette; { + key-hl = base0C; + separator = base01; + line = base01; + line-clear = base01; + line-caps-lock = base01; + line-ver = base01; + line-wrong = base01; + ring = base00; + ring-clear = base0B; + ring-caps-lock = base09; + ring-ver = base0D; + ring-wrong = base08; + inside = base00; + inside-clear = base00; + inside-caps-lock = base00; + inside-ver = base00; + inside-wrong = base00; + text = base05; + text-clear = base05; + text-caps-lock = base05; + text-ver = base05; + text-wrong = base05; + }; + }; + } diff --git a/kat/gui/waybar.nix b/kat/gui/waybar.nix new file mode 100644 index 00000000..a3398dde --- /dev/null +++ b/kat/gui/waybar.nix @@ -0,0 +1,138 @@ +{ config, kittywitch, lib, pkgs, nixfiles, ... }: + +{ + xdg.configFile."waybar/style.css" = { inherit (kittywitch.sassTemplate { name = "waybar-style"; src = ./waybar.sass; }) source; }; + + programs.waybar = { + enable = true; + systemd.enable = true; + settings = [{ + height = 10; + modules-left = [ + "sway/workspaces" + "sway/mode" + "sway/window" + ]; + modules-center = [ + ]; + modules-right = [ + "pulseaudio#icon" + "pulseaudio" + "cpu" + "custom/memory-icon" + "memory" + "temperature#icon" + "temperature" + "battery#icon" + "battery" + "backlight#icon" + "backlight" + "network#icon" + "network" + "idle_inhibitor" + "custom/clock" + "tray" + ]; + + "sway/workspaces" = { + format = "{icon}"; + format-icons = { + "1" = "1:"; + "2" = "2:"; + "3" = "3:"; + }; + }; + "sway/window" = { + icon = true; + icon-size = 12; + format = "{}"; + }; + tray = { + icon-size = 12; + spacing = 2; + }; + "backlight#icon" = { + format = "{icon}"; + format-icons = ["" ""]; + }; + backlight = { + format = "{percent}%"; + }; + "custom/cpu-icon".format = ""; + cpu.format = "{usage}%"; + "custom/memory-icon".format = ""; + memory.format = "{percentage}%"; + "temperature#icon" = { + format = "{icon}"; + format-icons = ["" "" ""]; + critical-threshold = 80; + }; + temperature = { + format = "{temperatureC}°C"; + critical-threshold = 80; + }; + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + }; + "battery#icon" = { + states = { + good = 90; + warning = 30; + critical = 15; + }; + format = "{icon}"; + format-charging = ""; + format-plugged = ""; + format-icons = [ "" "" "" "" "" ]; + }; + battery = { + states = { + good = 90; + warning = 30; + critical = 15; + }; + format = "{capacity}%"; + format-charging = "{capacity}%"; + format-plugged = "{capacity}%"; + format-alt = "{time}"; + }; + "pulseaudio#icon" = { + format = "{icon}"; + format-muted = "婢"; + on-click = "wezterm start pulsemixer"; + format-icons = { + default = [ + "" + "" + "" + ]; + }; + }; + pulseaudio = { + format = "{volume}%"; + on-click = "${pkgs.wezterm}/bin/wezterm start ${pkgs.pulsemixer}/bin/pulsemixer"; + }; + "network#icon" = { + format-wifi = "直"; + format-ethernet = ""; + format-linked = " "; + format-disconnected = ""; + }; + network = { + format-wifi = "{essid} ({signalStrength}%)"; + format-ethernet = "{ipaddr}/{cidr}"; + format-linked = "No IP"; + format-disconnected = "Disconnected"; + format-alt = "{ifname}: {ipaddr}/{cidr}"; + }; + "custom/clock" = { + exec = ''${pkgs.coreutils}/bin/date +"%a, %F %T %Z"''; + interval = 1; + }; + }]; + }; +} diff --git a/kat/gui/waybar.sass b/kat/gui/waybar.sass new file mode 100644 index 00000000..af2695f9 --- /dev/null +++ b/kat/gui/waybar.sass @@ -0,0 +1,172 @@ +%extend_1 + padding: 0 8px + transition: none + color: $base00 + +* + border: none + border-radius: 0 + background: none + font-family: "Iosevka Comfy", "Font Awesome 6 Free", "Font Awesome 6 Brands" + font-size: $font_size + min-height: 8px + text-shadow: none + box-shadow: none + +window#waybar + background: $base00t + +tooltip + background: $base00t + label + color: $base07 + +#mode + background: $base01 + color: $base06 + padding: 0 4px + +#clock, #custom-clock + @extend %extend_1 + background: $base01 + color: $base07 + +#cpu, #memory, #temperature, #pulseaudio, #backlight, #battery, #custom-mail, #custom-headset, #clock.arc, #clock.hex, #clock.miku, #network + background: $base01 + color: $base07 + padding: 0 6px + margin-right: 4px + +#custom-gpg-status, #custom-konawall, #idle_inhibitor + margin: 0 4px + +#temperature.icon, #pulseaudio.icon, #battery.icon, #backlight.icon, #custom-cpu-icon, #custom-memory-icon, #custom-mail-icon, #custom-headset-icon, #custom-arc-h, #custom-hex-h, #custom-miku-h, #clock.original, #tray, #network.icon + margin-left: 4px + margin-right: 0px + +#custom-headset-icon + @extend %extend_1 + background: $base06 + +#custom-memory-icon + @extend %extend_1 + background: $base09 + +#custom-cpu-icon + @extend %extend_1 + background: $base08 + +#temperature.icon + @extend %extend_1 + background: $base0B + +#pulseaudio.icon + @extend %extend_1 + background: $base06 + &.muted + background: $base03 + +#network.icon + @extend %extend_1 + background: $base0C + +#mpd + @extend %extend_1 + +#backlight.icon + @extend %extend_1 + background: $base0D + +#battery.icon + @extend %extend_1 + background: $base0C + +#custom-mail-icon + @extend %extend_1 + background: $base0F + +#custom-konawall + @extend %extend_1 + &.enabled + background: $base0E + + &.disabled + background: $base0D + +#custom-gpg-status + @extend %extend_1 + &.enabled + background: $base0B + + &.disabled + background: $base08 + +#idle_inhibitor + @extend %extend_1 + &.activated + background: $base0E + + &.deactivated + background: $base0D + +#tray + @extend %extend_1 + background: $base01 + padding: 0 10px 0 8px + menu + background: $base00t + color: $base07 + + +.modules-left + margin: 0 4px + image + padding-left: 6px + padding-right: 6px + margin-left: 4px + margin-right: 0px + background: $base01 + #window + margin-left: 0px + margin-right: 0px + widget + label + margin: 0 + + &:first-child + margin-left: 0 + + &:last-child + margin-right: 0 + +.modules-center + margin: 0 4px + +.modules-right + margin: 0 4px + +#workspaces + background: $base01 + padding: 0 + margin-right: 8px + button + color: $base06 + &.focused + color: $base07 + background: $base0D + + &:hover + transition: none + box-shadow: inherit + text-shadow: inherit + background: $base06 + color: $base0C + +#window + background: $base01 + padding: 0 4px + color: $base06 + border-bottom: 2px solid transparent + +window#waybar.empty #window + opacity: 0 diff --git a/kat/gui/wofi.nix b/kat/gui/wofi.nix new file mode 100644 index 00000000..13fa1504 --- /dev/null +++ b/kat/gui/wofi.nix @@ -0,0 +1,3 @@ +{ kittywitch, ... }: { + xdg.configFile."wofi/wofi.css" = { inherit (kittywitch.sassTemplate { name = "wofi-style"; src = ./wofi.sass; }) source; }; +} diff --git a/kat/gui/wofi.sass b/kat/gui/wofi.sass new file mode 100644 index 00000000..5c0be3a0 --- /dev/null +++ b/kat/gui/wofi.sass @@ -0,0 +1,26 @@ +#scroll + background: $base01 + border: 1px solid $base03 + +#input + background: $base01 + border: 1px solid $base0C + margin: 1em + background: $base02 + color: $base04 + +window + font-family: $font + background: $base00t + border-radius: 1em + font-size: $font_size + color: $base07 + +#outer-box + margin: 1em + +#entry + border-bottom: 1px dashed $base04 + padding: .75em + &:selected + background-color: $base0D diff --git a/kat/gui/xdg.nix b/kat/gui/xdg.nix new file mode 100644 index 00000000..2baa5a43 --- /dev/null +++ b/kat/gui/xdg.nix @@ -0,0 +1,16 @@ +_: { + xdg = { + enable = true; + userDirs = { + enable = true; + pictures = "$HOME/pictures"; + videos = "$HOME/videos"; + documents = "$HOME/docs"; + download = "$HOME/downloads"; + desktop = "$HOME/desktop"; + templates = "$HOME/templates"; + publicShare = "$HOME/shared"; + music = "$HOME/music"; + }; + }; +} diff --git a/kat/gui/xkb.nix b/kat/gui/xkb.nix new file mode 100644 index 00000000..61365c55 --- /dev/null +++ b/kat/gui/xkb.nix @@ -0,0 +1,7 @@ +_: { + home.file = { + ".xkb/symbols/us_gbp_map".source = ./layout.xkb; + }; + + home.keyboard = null; +} diff --git a/kat/shell/git.nix b/kat/shell/git.nix index c70030f3..ee097f0d 100644 --- a/kat/shell/git.nix +++ b/kat/shell/git.nix @@ -16,6 +16,7 @@ extraConfig = { init = {defaultBranch = "main";}; protocol.gcrypt.allow = "always"; + merge.conflictstyle = "diff3"; annex = { autocommit = false; backend = "BLAKE2B512"; diff --git a/lib.nix b/lib.nix new file mode 100644 index 00000000..ca979ac1 --- /dev/null +++ b/lib.nix @@ -0,0 +1,7 @@ +{ + inputs, + pkgs, + ... +}: +inputs.utils.lib.eachDefaultSystem (system: { +}) diff --git a/modules/home/base16.nix b/modules/home/base16.nix new file mode 100644 index 00000000..befe2633 --- /dev/null +++ b/modules/home/base16.nix @@ -0,0 +1,68 @@ +{ config, pkgs, lib, ... }: let + inherit (lib.types) attrsOf str enum; + inherit (lib.modules) mkIf; + cfg = config.base16; +in with lib; { + options.base16 = { + palette = mkOption { + type = attrsOf str; + }; + palette' = mkOption { + type = attrsOf str; + }; + sass = { + variables = mkOption { + type = attrsOf str; + default = (cfg.palette // cfg.palette' // { + term_font = "Iosevka Comfy"; + font = "Iosevka Comfy"; + font_size = "12px"; + }); + }; + css_style = mkOption { + type = enum [ "nested" "compressed" "compact" "expanded" ]; + default = "expanded"; + }; + }; + }; + config = mkIf (cfg.schemes != {}) { + base16 = { + # TODO: convert to std + palette = lib.mapAttrs' (k: v: + lib.nameValuePair + k + "#${v.hex}") + (lib.filterAttrs (n: _: lib.hasInfix "base" n) + cfg.defaultScheme); + palette' = lib.mapAttrs' (k: v: + lib.nameValuePair + "${k}t" + "rgba(${toString v.red.byte}, ${toString v.green.byte}, ${toString v.blue.byte}, ${toString 0.7})") + (lib.filterAttrs (n: _: lib.hasInfix "base" n) + cfg.defaultScheme); + }; + + lib.kittywitch.sassTemplate = { name, src }: + let + variables = pkgs.writeText "base-variables.sass" '' + ${(concatStringsSep "\n" (mapAttrsToList(var: con: "\$${var}: ${con}") cfg.sass.variables))} + ''; + source = pkgs.callPackage + ({ sass, stdenv }: stdenv.mkDerivation { + inherit name src variables; + nativeBuildInputs = lib.singleton sass; + phases = [ "buildPhase" ]; + buildPhase = '' + cat $variables $src > src-mut.sass + sass src-mut.sass $out --sourcemap=none --trace --style=${cfg.sass.css_style} + ''; + }) + { }; + in + { + inherit source; + text = builtins.readFile source; + }; + _module.args = { inherit (config.lib) kittywitch; }; + }; +} diff --git a/nixos/common/base16.nix b/nixos/common/base16.nix new file mode 100644 index 00000000..b1bfaec3 --- /dev/null +++ b/nixos/common/base16.nix @@ -0,0 +1,9 @@ +{ config, ... }: { + base16 = { + inherit (config.home-manager.users.kat.base16) defaultSchemeName defaultScheme schemes; + console = { + enable = true; + getty.enable = true; + }; + }; +} diff --git a/nixos/common/boot.nix b/nixos/common/boot.nix new file mode 100644 index 00000000..b0bb66ea --- /dev/null +++ b/nixos/common/boot.nix @@ -0,0 +1,29 @@ +{ config, lib, std, ... }: let + inherit (lib.modules) mkDefault mkIf mkMerge; + inherit (std) list; +in { + boot = mkMerge [ + ({ + kernel.sysctl = { + "fs.inotify.max_user_watches" = 524288; + "net.core.rmem_max" = 16777216; + "net.core.wmem_max" = 16777216; + "net.ipv4.tcp_rmem" = "4096 87380 16777216"; + "net.ipv4.tcp_wmem" = "4096 65536 16777216"; + "net.ipv4.ip_forward" = "1"; + "net.ipv6.conf.all.forwarding" = "1"; + }; + loader = { + grub.configurationLimit = 8; + systemd-boot.configurationLimit = 8; + }; + tmpOnTmpfs = true; + tmpOnTmpfsSize = "80%"; + kernelPackages = mkIf (list.elem "zfs" config.boot.supportedFilesystems) (mkDefault config.boot.zfs.package.latestCompatibleLinuxPackages); + }) + (mkIf (list.elem "zfs" config.boot.supportedFilesystems) { + kernelPackages = mkDefault config.boot.zfs.package.latestCompatibleLinuxPackages; + zfs.enableUnstable = true; + }) + ]; +} diff --git a/nixos/common/docs.nix b/nixos/common/docs.nix new file mode 100644 index 00000000..bfd41388 --- /dev/null +++ b/nixos/common/docs.nix @@ -0,0 +1,3 @@ +_: { + documentation.nixos.enable = false; +} diff --git a/nixos/common/getty.nix b/nixos/common/getty.nix new file mode 100644 index 00000000..90e2913f --- /dev/null +++ b/nixos/common/getty.nix @@ -0,0 +1,10 @@ +{ config, lib, pkgs, std, ... }: let + inherit (std) string; + inherit (lib.modules) mkForce; +in +{ + console = { + font = "Tamzen7x14"; + earlySetup = true; + }; +} diff --git a/nixos/common/grub.nix b/nixos/common/grub.nix deleted file mode 100644 index 6ac884e4..00000000 --- a/nixos/common/grub.nix +++ /dev/null @@ -1,6 +0,0 @@ -_: { - boot.loader = { - grub.configurationLimit = 8; - systemd-boot.configurationLimit = 8; - }; -} diff --git a/nixos/common/locale.nix b/nixos/common/locale.nix new file mode 100644 index 00000000..5b168a7b --- /dev/null +++ b/nixos/common/locale.nix @@ -0,0 +1,20 @@ +{ pkgs, ... }: { + fonts.fonts = [ + pkgs.tamzen + ]; + i18n = { + defaultLocale = "en_CA.UTF-8"; + supportedLocales = [ + "en_CA.UTF-8/UTF-8" + "en_GB.UTF-8/UTF-8" + "en_US.UTF-8/UTF-8" + "en_DK.UTF-8/UTF-8" + ]; + }; + console = { + packages = [ pkgs.tamzen ]; + font = "Tamzen7x14"; + earlySetup = true; + keyMap = "uk"; + }; +} diff --git a/nixos/common/network.nix b/nixos/common/network.nix new file mode 100644 index 00000000..94d3b25a --- /dev/null +++ b/nixos/common/network.nix @@ -0,0 +1,3 @@ +_: { + networking.nftables.enable = true; +} diff --git a/nixos/common/shell.nix b/nixos/common/shell.nix new file mode 100644 index 00000000..c0eddb0f --- /dev/null +++ b/nixos/common/shell.nix @@ -0,0 +1,6 @@ +_: { + programs.zsh = { + enable = true; + enableCompletion = true; + }; +} diff --git a/nixos/common/ssh.nix b/nixos/common/ssh.nix new file mode 100644 index 00000000..a6059e4f --- /dev/null +++ b/nixos/common/ssh.nix @@ -0,0 +1,26 @@ +{ config, lib, std, ... }: let + inherit (lib.modules) mkDefault; + inherit (std) list; +in { + networking.firewall = { + allowedTCPPorts = [ (list.unsafeHead config.services.openssh.ports) ]; + allowedUDPPortRanges = [ { from = 60000; to = 61000; } ]; + }; + + services.openssh = { + enable = true; + kexAlgorithms = [ "curve25519-sha256@libssh.org" ]; + settings = { + PasswordAuthentication = false; + KbdInteractiveAuthentication = false; + PermitRootLogin = mkDefault "prohibit-password"; + }; + extraConfig = '' + PubkeyAcceptedAlgorithms +ssh-rsa + StreamLocalBindUnlink yes + LogLevel VERBOSE + ''; + }; + + programs.mosh.enable = true; +} diff --git a/nixos/common/time.nix b/nixos/common/time.nix new file mode 100644 index 00000000..024d0f83 --- /dev/null +++ b/nixos/common/time.nix @@ -0,0 +1,12 @@ +_: { + services.tzupdate.enable = true; + + systemd.timers."tzupdate" = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnBootSec = "5m"; + OnUnitActiveSec = "5m"; + Unit = "tzupdate.service"; + }; + }; +} diff --git a/nixos/common/users.nix b/nixos/common/users.nix new file mode 100644 index 00000000..3d11a0e0 --- /dev/null +++ b/nixos/common/users.nix @@ -0,0 +1,3 @@ +_: { + users.mutableUsers = false; +} diff --git a/nixos/gnome.nix b/nixos/gnome.nix deleted file mode 100644 index 1ad8ebad..00000000 --- a/nixos/gnome.nix +++ /dev/null @@ -1,17 +0,0 @@ -{pkgs, ...}: { - services.xserver = { - enable = true; - desktopManager.gnome.enable = true; - displayManager.gdm.enable = true; - }; - - environment.systemPackages = with pkgs.gnomeExtensions; [ - dash-to-dock - gsconnect - appindicator - ]; - - services.udev.packages = with pkgs.gnome; [ - gnome-settings-daemon - ]; -} diff --git a/nixos/gui/fonts.nix b/nixos/gui/fonts.nix new file mode 100644 index 00000000..3aaf7f08 --- /dev/null +++ b/nixos/gui/fonts.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: { + fonts = { + fonts = (with pkgs; [ + twitter-color-emoji + ]) ++ (with pkgs.iosevka-comfy; [ + comfy + comfy-motion + comfy-wide + ]); + enableDefaultFonts = true; + fontDir.enable = true; + fontconfig = { + enable = true; + allowBitmaps = true; + defaultFonts = { + emoji = [ + "Twitter Color Emoji" + ]; + }; + }; + }; +} diff --git a/nixos/gui/gpg.nix b/nixos/gui/gpg.nix new file mode 100644 index 00000000..7a62e5b4 --- /dev/null +++ b/nixos/gui/gpg.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: { + services.pcscd.enable = true; + services.udev.packages = [ pkgs.yubikey-personalization ]; + + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + pinentryFlavor = "gtk2"; + }; +} diff --git a/nixos/gui/nfs.nix b/nixos/gui/nfs.nix new file mode 100644 index 00000000..7c359a2c --- /dev/null +++ b/nixos/gui/nfs.nix @@ -0,0 +1,3 @@ +_: { + boot.supportedFilesystems = [ "nfs" ]; +} diff --git a/nixos/gui/packages.nix b/nixos/gui/packages.nix new file mode 100644 index 00000000..650b2fff --- /dev/null +++ b/nixos/gui/packages.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: { + environment.systemPackages = with pkgs; [ + android-udev-rules + jmtpfs + ]; +} diff --git a/nixos/gui/qt.nix b/nixos/gui/qt.nix new file mode 100644 index 00000000..8ace19bf --- /dev/null +++ b/nixos/gui/qt.nix @@ -0,0 +1,7 @@ +_: { + qt = { + enable = true; + style = "adwaita-dark"; + platformTheme = "gnome"; + }; +} diff --git a/nixos/gui/sound.nix b/nixos/gui/sound.nix new file mode 100644 index 00000000..098fa361 --- /dev/null +++ b/nixos/gui/sound.nix @@ -0,0 +1,52 @@ +{ pkgs, ... }: { + sound = { + enable = true; + extraConfig = '' + defaults.pcm.rate_converter "speexrate_best" + ''; + }; + + environment.systemPackages = with pkgs; [ pulsemixer bluez5-experimental ]; + + security.rtkit.enable = true; + + environment.etc = { + "wireplumber/bluetooth.lua.d/51-bluez-config.lua".text = '' + bluez_monitor.properties = { + ["bluez5.enable-sbc-xq"] = true, + ["bluez5.enable-msbc"] = true, + ["bluez5.enable-hw-volume"] = true, + ["bluez5.headset-roles"] = "[ hsp_hs hsp_ag hfp_hf hfp_ag ]" + } + ''; + }; + + services.pipewire = { + enable = true; + config = { + pipewire = { + "context.properties" = { + "log.level" = 2; + "default.clock.min-quantum" = + 32; # default; going lower may cause crackles and distorted audio + }; + pipewire-pulse = { + "context.modules" = [{ + name = "libpipewire-module-protocol-pulse"; + args = { + "pulse.min.quantum" = 32; # controls minimum playback quant + "pulse.min.req" = 32; # controls minimum recording quant + "pulse.min.frag" = 32; # controls minimum fragment size + "server.address" = + [ "unix:native" ]; # the default address of the server + }; + }]; + }; + }; + }; + pulse.enable = true; + alsa.support32Bit = true; + jack.enable = true; + alsa.enable = true; + }; +} diff --git a/nixos/gui/sway.nix b/nixos/gui/sway.nix new file mode 100644 index 00000000..ff7c45b7 --- /dev/null +++ b/nixos/gui/sway.nix @@ -0,0 +1,9 @@ +{ config, pkgs, std, lib, ... }: let + inherit (std) set list; + inherit (lib.modules) mkForce; +in { + programs.sway = { + enable = list.any (user: user.wayland.windowManager.sway.enable) (set.values config.home-manager.users); + extraPackages = with pkgs; mkForce [ xwayland swaylock swayidle swaylock-fancy wmctrl ]; + }; +} diff --git a/nixos/gui/xdg-portals.nix b/nixos/gui/xdg-portals.nix new file mode 100644 index 00000000..f429a157 --- /dev/null +++ b/nixos/gui/xdg-portals.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: { + xdg = { + portal = { + enable = true; + extraPortals = with pkgs; [ + xdg-desktop-portal-wlr + xdg-desktop-portal-gtk + ]; + }; + }; +} diff --git a/outputs.nix b/outputs.nix index 0b4095a0..b4098b76 100644 --- a/outputs.nix +++ b/outputs.nix @@ -1,12 +1,12 @@ {inputs}: let - inherit (inputs.nixpkgs) lib; std = import ./std.nix {inherit inputs;}; tree = import ./tree.nix {inherit inputs;}; + lib = inputs.nixpkgs.lib; systems = import ./systems {inherit inputs tree lib std;}; shells = import ./shells {inherit inputs tree lib std pkgs;}; - inherit (import ./pkgs.nix {inherit inputs tree lib;}) pkgs; + inherit (import ./pkgs.nix {inherit inputs tree;}) pkgs; formatter = import ./formatter.nix {inherit inputs pkgs;}; inherit (std) set; checks = set.map (_: deployLib: deployLib.deployChecks inputs.self.deploy) inputs.deploy-rs.lib; in - {inherit inputs tree lib std pkgs checks formatter;} // systems // shells + {inherit inputs tree std pkgs checks formatter lib;} // systems // shells diff --git a/pkgs.nix b/pkgs.nix index 045cca5b..fe661ae9 100644 --- a/pkgs.nix +++ b/pkgs.nix @@ -1,9 +1,8 @@ { - lib, tree, inputs, ... }: let overlays = import tree.overlays {inherit inputs;}; in - inputs.utils.lib.eachDefaultSystem (system: {pkgs = import inputs.nixpkgs {inherit system overlays;};}) + inputs.utils.lib.eachDefaultSystem (system: {pkgs = import inputs.nixpkgs { inherit system overlays; config.allowUnfree = true; };}) diff --git a/systems/default.nix b/systems/default.nix index cfa3e6d3..46e64d43 100644 --- a/systems/default.nix +++ b/systems/default.nix @@ -77,7 +77,15 @@ ]; builder = { - nixos = inputs.nixpkgs.lib.nixosSystem; + nixos = let + lib = inputs.nixpkgs.lib.extend (self: super: import (inputs.arcexprs + "/lib") { + inherit super; + lib = self; + isOverlayLib = true; + }); + in args: lib.nixosSystem ({ + inherit lib; + } // args); darwin = inputs.darwin.lib.darwinSystem; macos = inputs.darwin.lib.darwinSystem; } diff --git a/systems/koishi.nix b/systems/koishi.nix index d67664b9..507dabba 100644 --- a/systems/koishi.nix +++ b/systems/koishi.nix @@ -1,7 +1,8 @@ _: let hostConfig = {tree, ...}: { imports = with tree; [ - nixos.gnome + nixos.gui + kat.gui ]; fileSystems = { diff --git a/tree.nix b/tree.nix index a4764406..0d8eee7f 100644 --- a/tree.nix +++ b/tree.nix @@ -68,6 +68,9 @@ ] ++ (with (import (inputs.arcexprs + "/modules")).home-manager; [ base16 + swaylock + i3gopher + konawall ]); }; };