chore: nix fmt

This commit is contained in:
514fpv 2025-01-13 11:52:09 +08:00
parent a80bd4ed3b
commit 7266fff06e
Signed by: koishi
SSH key fingerprint: SHA256:axz0uIzzY+5W19i7QOUuiw5LSqhKfCBKPf3L4xFRxLw
128 changed files with 3402 additions and 2013 deletions

View file

@ -1,16 +1,31 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.users;
in {
in
{
options.users.home.persistApp = {
files = mkOption {
type = with types; listOf (oneOf [ str (attrsOf str) ]);
type =
with types;
listOf (oneOf [
str
(attrsOf str)
]);
default = [ ];
};
directories = mkOption {
type = with types; listOf (oneOf [ str (attrsOf str) ]);
type =
with types;
listOf (oneOf [
str
(attrsOf str)
]);
default = [ ];
};
};

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ...}: with lib; {
{
pkgs,
lib,
config,
...
}:
with lib;
{
# git signing configuration
programs.git = {
signing = {
@ -15,10 +19,11 @@
gpg = {
format = "ssh";
# compiled from trusted keys in auth module
ssh.allowedSignersFile = toString (pkgs.writeText
"allowed_signers" (foldr (key: folded:
folded + "koishi@514fpv.one ${key}\n") ""
config.passthrough.publicKeys));
ssh.allowedSignersFile = toString (
pkgs.writeText "allowed_signers" (
foldr (key: folded: folded + "koishi@514fpv.one ${key}\n") "" config.passthrough.publicKeys
)
);
};
};
};
@ -32,6 +37,9 @@
};
wayland.windowManager.sway.config.window.commands = mkIf config.passthrough.gui [
{ criteria.title = "Bitwarden"; command = "floating enable"; }
{
criteria.title = "Bitwarden";
command = "floating enable";
}
];
}

View file

@ -1,7 +1,12 @@
{ config
, ... }: {
{
config,
...
}:
{
# this module passes openssh public keys to home-manager
users.homeModules = [ {
passthrough.publicKeys = config.global.auth.openssh.publicKeys;
} ];
users.homeModules = [
{
passthrough.publicKeys = config.global.auth.openssh.publicKeys;
}
];
}

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.btop;
in mkIf cfg.enable {
in
mkIf cfg.enable {
programs.btop = {
enable = true;
settings = {

View file

@ -1,11 +1,18 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.btop;
in {
in
{
options.home.btop = {
enable = mkEnableOption "btop" // { default = !config.home.util.minimal; };
enable = mkEnableOption "btop" // {
default = !config.home.util.minimal;
};
};
config = {

View file

@ -1,10 +1,17 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.catppuccin;
palette = (lib.importJSON "${config.catppuccin.sources.palette}/palette.json").${config.catppuccin.flavor}.colors;
in mkIf cfg.enable {
palette =
(lib.importJSON "${config.catppuccin.sources.palette}/palette.json")
.${config.catppuccin.flavor}.colors;
in
mkIf cfg.enable {
gtk.theme = { inherit (cfg.gtk) package name; };
qt.style.name = "kvantum";
qt.platformTheme.name = "kvantum";
@ -13,38 +20,90 @@ in mkIf cfg.enable {
# sway colour palette override
wayland.windowManager.sway.config = {
colors = {
focused = { border = "$lavender"; background = "$base"; text = "$text"; indicator = "$rosewater"; childBorder = "$lavender"; };
focusedInactive = { border = "$overlay0"; background = "$base"; text = "$text"; indicator = "$rosewater"; childBorder = "$overlay0"; };
unfocused = { border = "$overlay0"; background = "$base"; text = "$text"; indicator = "$rosewater"; childBorder = "$overlay0"; };
urgent = { border = "$peach"; background = "$base"; text = "$peach"; indicator = "$overlay0"; childBorder = "$peach"; };
placeholder = { border = "$overlay0"; background = "$base"; text = "$text"; indicator = "$overlay0"; childBorder = "$overlay0"; };
background = "$base";
focused = {
border = "$lavender";
background = "$base";
text = "$text";
indicator = "$rosewater";
childBorder = "$lavender";
};
focusedInactive = {
border = "$overlay0";
background = "$base";
text = "$text";
indicator = "$rosewater";
childBorder = "$overlay0";
};
unfocused = {
border = "$overlay0";
background = "$base";
text = "$text";
indicator = "$rosewater";
childBorder = "$overlay0";
};
urgent = {
border = "$peach";
background = "$base";
text = "$peach";
indicator = "$overlay0";
childBorder = "$peach";
};
placeholder = {
border = "$overlay0";
background = "$base";
text = "$text";
indicator = "$overlay0";
childBorder = "$overlay0";
};
background = "$base";
};
bars = mkForce [ {
colors = {
background = "$base";
statusline = "$text";
focusedStatusline = "$text";
focusedSeparator = "$base";
focusedWorkspace = { border = "$base"; background = "$base"; text = "$green"; };
activeWorkspace = { border = "$base"; background = "$base"; text = "$blue"; };
inactiveWorkspace = { border = "$base"; background = "$base"; text = "$surface1"; };
urgentWorkspace = { border = "$base"; background = "$base"; text = "$surface1"; };
bindingMode = { border = "$base"; background = "$base"; text = "$surface1"; };
};
bars = mkForce [
{
colors = {
background = "$base";
statusline = "$text";
focusedStatusline = "$text";
focusedSeparator = "$base";
focusedWorkspace = {
border = "$base";
background = "$base";
text = "$green";
};
activeWorkspace = {
border = "$base";
background = "$base";
text = "$blue";
};
inactiveWorkspace = {
border = "$base";
background = "$base";
text = "$surface1";
};
urgentWorkspace = {
border = "$base";
background = "$base";
text = "$surface1";
};
bindingMode = {
border = "$base";
background = "$base";
text = "$surface1";
};
};
mode = "dock";
position = "bottom";
workspaceButtons = true;
workspaceNumbers = true;
statusCommand = "${pkgs.i3status}/bin/i3status";
fonts = {
names = [ "monospace" ];
size = 8.0;
};
trayOutput = "primary";
} ];
mode = "dock";
position = "bottom";
workspaceButtons = true;
workspaceNumbers = true;
statusCommand = "${pkgs.i3status}/bin/i3status";
fonts = {
names = [ "monospace" ];
size = 8.0;
};
trayOutput = "primary";
}
];
output."*".bg = mkForce "${./flake.png} fill";
gaps.inner = 12;

View file

@ -1,32 +1,41 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
gui = with config.global.gpu; enable && session;
cfg = config.home.catppuccin;
in {
in
{
options.home.catppuccin = {
enable = mkEnableOption "catppuccin colour scheme" // { default = gui; };
enable = mkEnableOption "catppuccin colour scheme" // {
default = gui;
};
gtk = {
package = mkOption {
type = with types; package;
default = (pkgs.catppuccin-gtk.overrideAttrs {
src = pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "gtk";
rev = "v1.0.3";
fetchSubmodules = true;
hash = "sha256-q5/VcFsm3vNEw55zq/vcM11eo456SYE5TQA3g2VQjGc=";
};
default =
(pkgs.catppuccin-gtk.overrideAttrs {
src = pkgs.fetchFromGitHub {
owner = "catppuccin";
repo = "gtk";
rev = "v1.0.3";
fetchSubmodules = true;
hash = "sha256-q5/VcFsm3vNEw55zq/vcM11eo456SYE5TQA3g2VQjGc=";
};
postUnpack = "";
}).override {
accents = [ "pink" ];
size = "compact";
#tweaks = [ "rimless" "black" ];
variant = "mocha";
};
postUnpack = "";
}).override
{
accents = [ "pink" ];
size = "compact";
#tweaks = [ "rimless" "black" ];
variant = "mocha";
};
description = "catppuccin gtk theme package";
};
name = mkOption {
@ -59,9 +68,12 @@ in {
catppuccin.enable = cfg.enable;
# gtk and cursor themes
environment.systemPackages = with cfg; mkIf enable [
gtk.package cursor.package
];
environment.systemPackages =
with cfg;
mkIf enable [
gtk.package
cursor.package
];
# override greetd theme
programs.regreet = mkIf cfg.enable {

View file

@ -1,7 +1,10 @@
{ pkgs
, lib
, config
, ...}: lib.mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
lib.mkIf config.passthrough.gui {
programs.chromium = {
enable = true;
package = pkgs.google-chrome;

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
gui = with config.global.gpu; enable && session;
in {
in
{
users.home.persist.directories = mkIf gui [ ".config/google-chrome" ];
security.chromiumSuidSandbox.enable = mkIf gui true;
environment.sessionVariables.NIXOS_OZONE_WL = "1";

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
programs.foot = {
enable = true;
settings.main.term = "xterm-256color";

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.gnome;
in {
in
{
imports = [
./impl/home.nix
./impl/dconf.nix

View file

@ -1,286 +1,341 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.gnome;
bg = ../../../share/54345906_p0.jpg;
in mkIf cfg.enable {
dconf.settings = let
p = "org/gnome";
pd = "${p}/desktop";
ps = "${p}/shell";
pse = "${ps}/extensions";
ptl = "${p}/terminal/legacy";
ptlp = "${ptl}/profiles:";
in {
"${pd}/peripherals/mouse".natural-scroll = true;
"${pd}/peripherals/touchpad".tap-to-click = true;
"${p}/epiphany".ask-for-default = false;
"${p}/evolution-data-server".migrated = true;
in
mkIf cfg.enable {
dconf.settings =
let
p = "org/gnome";
pd = "${p}/desktop";
ps = "${p}/shell";
pse = "${ps}/extensions";
ptl = "${p}/terminal/legacy";
ptlp = "${ptl}/profiles:";
in
{
"${pd}/peripherals/mouse".natural-scroll = true;
"${pd}/peripherals/touchpad".tap-to-click = true;
"${p}/epiphany".ask-for-default = false;
"${p}/evolution-data-server".migrated = true;
"${p}/nautilus/preferences" = {
default-folder-viewer = "icon-view";
migrated-gtk-settings = true;
search-filter-time-type = "last_modified";
"${p}/nautilus/preferences" = {
default-folder-viewer = "icon-view";
migrated-gtk-settings = true;
search-filter-time-type = "last_modified";
};
"${pd}/background" = {
color-shading-type = "solid";
picture-options = "zoom";
picture-uri = "file://${bg}";
picture-uri-dark = "file://${bg}";
primary-color = "#000000000000";
secondary-color = "#000000000000";
};
"${pd}/interface" = {
color-scheme = "prefer-dark";
cursor-theme = "Bibata-Modern-Classic";
font-antialiasing = "grayscale";
font-hinting = "slight";
gtk-theme = "adw-gtk3-dark";
icon-theme = "Papirus-Dark";
};
"${pd}/screensaver" = {
color-shading-type = "solid";
lock-enabled = false;
picture-options = "zoom";
picture-uri = "file://${bg}";
primary-color = "#000000000000";
secondary-color = "#000000000000";
};
"${pd}/wm/preferences" = {
action-double-click-titlebar = "toggle-maximize";
action-middle-click-titlebar = "minimize";
button-layout = "close:appmenu";
resize-with-right-button = true;
};
"${pd}/wm/keybindings" = {
panel-run-dialog = [ ];
begin-resize = [ "<Super>r" ];
close = [ "<Shift><Super>q" ];
minimize = [ "<Super>BackSpace" ];
move-to-workspace-1 = [ "<Shift><Super>1" ];
move-to-workspace-2 = [ "<Shift><Super>2" ];
move-to-workspace-3 = [ "<Shift><Super>3" ];
move-to-workspace-4 = [ "<Shift><Super>4" ];
move-to-workspace-left = [ "<Shift><Super>h" ];
move-to-workspace-right = [ "<Shift><Super>l" ];
switch-to-workspace-1 = [ "<Super>1" ];
switch-to-workspace-2 = [ "<Super>2" ];
switch-to-workspace-3 = [ "<Super>3" ];
switch-to-workspace-4 = [ "<Super>4" ];
toggle-maximized = [ "<Super>f" ];
};
"${ps}/keybindings" = {
switch-to-application-1 = [ ];
switch-to-application-2 = [ ];
switch-to-application-3 = [ ];
switch-to-application-4 = [ ];
switch-to-application-5 = [ ];
switch-to-application-6 = [ ];
switch-to-application-7 = [ ];
switch-to-application-8 = [ ];
switch-to-application-9 = [ ];
toggle-application-view = [ "<Super>d" ];
};
"${p}/settings-daemon/plugins/media-keys" = {
custom-keybindings = [
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/"
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/"
];
logout = [ ];
screensaver = [ "<Control><Alt>l" ];
};
"${p}/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = {
binding = "<Super>Return";
command = "kgx";
name = "Launch console";
};
"${p}/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = {
binding = "<Super>q";
command = "google-chrome-stable";
name = "Launch Google Chrome";
};
"${ptlp}" = {
#default = "95894cfd-82f7-430d-af6e-84d168bc34f5";
list = [
"de8a9081-8352-4ce4-9519-5de655ad9361"
"71a9971e-e829-43a9-9b2f-4565c855d664"
"5083e06b-024e-46be-9cd2-892b814f1fc8"
"95894cfd-82f7-430d-af6e-84d168bc34f5"
];
};
"${ptlp}/:5083e06b-024e-46be-9cd2-892b814f1fc8" = {
background-color = "#24273a";
cursor-background-color = "#f4dbd6";
cursor-colors-set = true;
cursor-foreground-color = "#24273a";
foreground-color = "#cad3f5";
highlight-background-color = "#24273a";
highlight-colors-set = true;
highlight-foreground-color = "#5b6078";
palette = [
"#494d64"
"#ed8796"
"#a6da95"
"#eed49f"
"#8aadf4"
"#f5bde6"
"#8bd5ca"
"#b8c0e0"
"#5b6078"
"#ed8796"
"#a6da95"
"#eed49f"
"#8aadf4"
"#f5bde6"
"#8bd5ca"
"#a5adcb"
];
use-theme-colors = false;
visible-name = "Catppuccin Macchiato";
};
"${ptlp}/:71a9971e-e829-43a9-9b2f-4565c855d664" = {
background-color = "#303446";
cursor-background-color = "#f2d5cf";
cursor-colors-set = true;
cursor-foreground-color = "#303446";
default-size-columns = 150;
default-size-rows = 35;
foreground-color = "#c6d0f5";
highlight-background-color = "#303446";
highlight-colors-set = true;
highlight-foreground-color = "#626880";
palette = [
"#51576d"
"#e78284"
"#a6d189"
"#e5c890"
"#8caaee"
"#f4b8e4"
"#81c8be"
"#b5bfe2"
"#626880"
"#e78284"
"#a6d189"
"#e5c890"
"#8caaee"
"#f4b8e4"
"#81c8be"
"#a5adce"
];
use-theme-colors = false;
visible-name = "Catppuccin Frappe";
};
"${ptlp}/:95894cfd-82f7-430d-af6e-84d168bc34f5" = {
background-color = "#1e1e2e";
cursor-background-color = "#f5e0dc";
cursor-colors-set = true;
cursor-foreground-color = "#1e1e2e";
foreground-color = "#cdd6f4";
highlight-background-color = "#1e1e2e";
highlight-colors-set = true;
highlight-foreground-color = "#585b70";
palette = [
"#45475a"
"#f38ba8"
"#a6e3a1"
"#f9e2af"
"#89b4fa"
"#f5c2e7"
"#94e2d5"
"#bac2de"
"#585b70"
"#f38ba8"
"#a6e3a1"
"#f9e2af"
"#89b4fa"
"#f5c2e7"
"#94e2d5"
"#a6adc8"
];
use-theme-colors = false;
visible-name = "Catppuccin Mocha";
};
"${ptlp}/:de8a9081-8352-4ce4-9519-5de655ad9361" = {
background-color = "#eff1f5";
cursor-background-color = "#dc8a78";
cursor-colors-set = true;
cursor-foreground-color = "#eff1f5";
foreground-color = "#4c4f69";
highlight-background-color = "#eff1f5";
highlight-colors-set = true;
highlight-foreground-color = "#acb0be";
palette = [
"#5c5f77"
"#d20f39"
"#40a02b"
"#df8e1d"
"#1e66f5"
"#ea76cb"
"#179299"
"#acb0be"
"#6c6f85"
"#d20f39"
"#40a02b"
"#df8e1d"
"#1e66f5"
"#ea76cb"
"#179299"
"#bcc0cc"
];
use-theme-colors = false;
visible-name = "Catppuccin Latte";
};
"${ps}" = {
disabled-extensions = [
"light-style@gnome-shell-extensions.gcampax.github.com"
"places-menu@gnome-shell-extensions.gcampax.github.com"
"windowsNavigator@gnome-shell-extensions.gcampax.github.com"
"window-list@gnome-shell-extensions.gcampax.github.com"
"workspace-indicator@gnome-shell-extensions.gcampax.github.com"
"dash-to-dock@micxgx.gmail.com"
];
enabled-extensions = [
"user-theme@gnome-shell-extensions.gcampax.github.com"
"apps-menu@gnome-shell-extensions.gcampax.github.com"
"drive-menu@gnome-shell-extensions.gcampax.github.com"
"appindicatorsupport@rgcjonas.gmail.com"
"dash-to-panel@jderose9.github.com"
"caffeine@patapon.info"
"PrivacyMenu@stuarthayhurst"
];
last-selected-power-profile = "performance";
welcome-dialog-last-shown-version = "45.3";
};
#"${pse}/user-theme".name = "catppuccin-mocha-pink-compact";
"${pse}/caffeine" = {
screen-blank = "never";
};
"${pse}/dash-to-dock" = {
background-opacity = 0.80000000000000004;
dash-max-icon-size = 48;
dock-position = "BOTTOM";
height-fraction = 0.90000000000000002;
multi-monitor = false;
running-indicator-style = "DOTS";
custom-theme-shrink = true;
};
"${pse}/dash-to-panel" = {
animate-appicon-hover = false;
animate-appicon-hover-animation-type = "SIMPLE";
appicon-margin = 0;
appicon-padding = 4;
appicon-style = "NORMAL";
available-monitors = [ 0 ];
dot-position = "BOTTOM";
dot-style-focused = "METRO";
dot-style-unfocused = "DOTS";
group-apps = true;
hide-overview-on-startup = true;
hotkeys-overlay-combo = "TEMPORARILY";
intellihide = true;
intellihide-behaviour = "FOCUSED_WINDOWS";
intellihide-hide-from-windows = true;
isolate-workspaces = false;
leftbox-padding = -1;
overview-click-to-exit = true;
panel-anchors = ''{"0":"MIDDLE"}'';
panel-element-positions = ''{"0":[{"element":"showAppsButton","visible":true,"position":"stackedTL"},{"element":"activitiesButton","visible":true,"position":"stackedTL"},{"element":"leftBox","visible":false,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"centerMonitor"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":false,"position":"stackedBR"}]}'';
panel-lengths = ''{"0":100}'';
panel-positions = ''{"0":"BOTTOM"}'';
panel-sizes = ''{"0":42}'';
primary-monitor = 0;
secondarymenu-contains-showdetails = true;
show-showdesktop-hover = true;
status-icon-padding = -1;
stockgs-force-hotcorner = false;
stockgs-keep-dash = false;
stockgs-keep-top-panel = false;
stockgs-panelbtn-click-only = false;
trans-bg-color = "#2a2a2a";
trans-dynamic-anim-target = 1.0;
trans-dynamic-behavior = "MAXIMIZED_WINDOWS";
trans-gradient-bottom-color = "#000000";
trans-gradient-bottom-opacity = 0.5;
trans-gradient-top-opacity = 0.0;
trans-panel-opacity = 0.0;
trans-use-custom-bg = true;
trans-use-custom-gradient = true;
trans-use-custom-opacity = true;
trans-use-dynamic-opacity = true;
tray-padding = -1;
window-preview-title-position = "TOP";
};
};
"${pd}/background" = {
color-shading-type = "solid";
picture-options = "zoom";
picture-uri = "file://${bg}";
picture-uri-dark = "file://${bg}";
primary-color = "#000000000000";
secondary-color = "#000000000000";
};
"${pd}/interface" = {
color-scheme = "prefer-dark";
cursor-theme = "Bibata-Modern-Classic";
font-antialiasing = "grayscale";
font-hinting = "slight";
gtk-theme = "adw-gtk3-dark";
icon-theme = "Papirus-Dark";
};
"${pd}/screensaver" = {
color-shading-type = "solid";
lock-enabled = false;
picture-options = "zoom";
picture-uri = "file://${bg}";
primary-color = "#000000000000";
secondary-color = "#000000000000";
};
"${pd}/wm/preferences" = {
action-double-click-titlebar = "toggle-maximize";
action-middle-click-titlebar = "minimize";
button-layout = "close:appmenu";
resize-with-right-button = true;
};
"${pd}/wm/keybindings" = {
panel-run-dialog = [ ];
begin-resize = [ "<Super>r" ];
close = [ "<Shift><Super>q" ];
minimize = [ "<Super>BackSpace" ];
move-to-workspace-1 = [ "<Shift><Super>1" ];
move-to-workspace-2 = [ "<Shift><Super>2" ];
move-to-workspace-3 = [ "<Shift><Super>3" ];
move-to-workspace-4 = [ "<Shift><Super>4" ];
move-to-workspace-left = [ "<Shift><Super>h" ];
move-to-workspace-right = [ "<Shift><Super>l" ];
switch-to-workspace-1 = [ "<Super>1" ];
switch-to-workspace-2 = [ "<Super>2" ];
switch-to-workspace-3 = [ "<Super>3" ];
switch-to-workspace-4 = [ "<Super>4" ];
toggle-maximized = [ "<Super>f" ];
};
"${ps}/keybindings" = {
switch-to-application-1 = [ ];
switch-to-application-2 = [ ];
switch-to-application-3 = [ ];
switch-to-application-4 = [ ];
switch-to-application-5 = [ ];
switch-to-application-6 = [ ];
switch-to-application-7 = [ ];
switch-to-application-8 = [ ];
switch-to-application-9 = [ ];
toggle-application-view = [ "<Super>d" ];
};
"${p}/settings-daemon/plugins/media-keys" = {
custom-keybindings = [
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom0/"
"/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/custom1/"
];
logout = [ ];
screensaver = [ "<Control><Alt>l" ];
};
"${p}/settings-daemon/plugins/media-keys/custom-keybindings/custom0" = {
binding = "<Super>Return";
command = "kgx";
name = "Launch console";
};
"${p}/settings-daemon/plugins/media-keys/custom-keybindings/custom1" = {
binding = "<Super>q";
command = "google-chrome-stable";
name = "Launch Google Chrome";
};
"${ptlp}" = {
#default = "95894cfd-82f7-430d-af6e-84d168bc34f5";
list = [
"de8a9081-8352-4ce4-9519-5de655ad9361"
"71a9971e-e829-43a9-9b2f-4565c855d664"
"5083e06b-024e-46be-9cd2-892b814f1fc8"
"95894cfd-82f7-430d-af6e-84d168bc34f5"
];
};
"${ptlp}/:5083e06b-024e-46be-9cd2-892b814f1fc8" = {
background-color = "#24273a";
cursor-background-color = "#f4dbd6";
cursor-colors-set = true;
cursor-foreground-color = "#24273a";
foreground-color = "#cad3f5";
highlight-background-color = "#24273a";
highlight-colors-set = true;
highlight-foreground-color = "#5b6078";
palette = [
"#494d64" "#ed8796" "#a6da95" "#eed49f"
"#8aadf4" "#f5bde6" "#8bd5ca" "#b8c0e0"
"#5b6078" "#ed8796" "#a6da95" "#eed49f"
"#8aadf4" "#f5bde6" "#8bd5ca" "#a5adcb"
];
use-theme-colors = false;
visible-name = "Catppuccin Macchiato";
};
"${ptlp}/:71a9971e-e829-43a9-9b2f-4565c855d664" = {
background-color = "#303446";
cursor-background-color = "#f2d5cf";
cursor-colors-set = true;
cursor-foreground-color = "#303446";
default-size-columns = 150;
default-size-rows = 35;
foreground-color = "#c6d0f5";
highlight-background-color = "#303446";
highlight-colors-set = true;
highlight-foreground-color = "#626880";
palette = [
"#51576d" "#e78284" "#a6d189" "#e5c890"
"#8caaee" "#f4b8e4" "#81c8be" "#b5bfe2"
"#626880" "#e78284" "#a6d189" "#e5c890"
"#8caaee" "#f4b8e4" "#81c8be" "#a5adce"
];
use-theme-colors = false;
visible-name = "Catppuccin Frappe";
};
"${ptlp}/:95894cfd-82f7-430d-af6e-84d168bc34f5" = {
background-color = "#1e1e2e";
cursor-background-color = "#f5e0dc";
cursor-colors-set = true;
cursor-foreground-color = "#1e1e2e";
foreground-color = "#cdd6f4";
highlight-background-color = "#1e1e2e";
highlight-colors-set = true;
highlight-foreground-color = "#585b70";
palette = [
"#45475a" "#f38ba8" "#a6e3a1" "#f9e2af"
"#89b4fa" "#f5c2e7" "#94e2d5" "#bac2de"
"#585b70" "#f38ba8" "#a6e3a1" "#f9e2af"
"#89b4fa" "#f5c2e7" "#94e2d5" "#a6adc8"
];
use-theme-colors = false;
visible-name = "Catppuccin Mocha";
};
"${ptlp}/:de8a9081-8352-4ce4-9519-5de655ad9361" = {
background-color = "#eff1f5";
cursor-background-color = "#dc8a78";
cursor-colors-set = true;
cursor-foreground-color = "#eff1f5";
foreground-color = "#4c4f69";
highlight-background-color = "#eff1f5";
highlight-colors-set = true;
highlight-foreground-color = "#acb0be";
palette = [
"#5c5f77" "#d20f39" "#40a02b" "#df8e1d"
"#1e66f5" "#ea76cb" "#179299" "#acb0be"
"#6c6f85" "#d20f39" "#40a02b" "#df8e1d"
"#1e66f5" "#ea76cb" "#179299" "#bcc0cc"
];
use-theme-colors = false;
visible-name = "Catppuccin Latte";
};
"${ps}" = {
disabled-extensions = [
"light-style@gnome-shell-extensions.gcampax.github.com"
"places-menu@gnome-shell-extensions.gcampax.github.com"
"windowsNavigator@gnome-shell-extensions.gcampax.github.com"
"window-list@gnome-shell-extensions.gcampax.github.com"
"workspace-indicator@gnome-shell-extensions.gcampax.github.com"
"dash-to-dock@micxgx.gmail.com"
];
enabled-extensions = [
"user-theme@gnome-shell-extensions.gcampax.github.com"
"apps-menu@gnome-shell-extensions.gcampax.github.com"
"drive-menu@gnome-shell-extensions.gcampax.github.com"
"appindicatorsupport@rgcjonas.gmail.com"
"dash-to-panel@jderose9.github.com"
"caffeine@patapon.info"
"PrivacyMenu@stuarthayhurst"
];
last-selected-power-profile = "performance";
welcome-dialog-last-shown-version = "45.3";
};
#"${pse}/user-theme".name = "catppuccin-mocha-pink-compact";
"${pse}/caffeine" = {
screen-blank = "never";
};
"${pse}/dash-to-dock" = {
background-opacity = 0.80000000000000004;
dash-max-icon-size = 48;
dock-position = "BOTTOM";
height-fraction = 0.90000000000000002;
multi-monitor = false;
running-indicator-style = "DOTS";
custom-theme-shrink = true;
};
"${pse}/dash-to-panel" = {
animate-appicon-hover = false;
animate-appicon-hover-animation-type = "SIMPLE";
appicon-margin = 0;
appicon-padding = 4;
appicon-style= "NORMAL";
available-monitors = [ 0 ];
dot-position = "BOTTOM";
dot-style-focused = "METRO";
dot-style-unfocused = "DOTS";
group-apps = true;
hide-overview-on-startup = true;
hotkeys-overlay-combo = "TEMPORARILY";
intellihide = true;
intellihide-behaviour = "FOCUSED_WINDOWS";
intellihide-hide-from-windows = true;
isolate-workspaces = false;
leftbox-padding = -1;
overview-click-to-exit = true;
panel-anchors = ''{"0":"MIDDLE"}'';
panel-element-positions = ''{"0":[{"element":"showAppsButton","visible":true,"position":"stackedTL"},{"element":"activitiesButton","visible":true,"position":"stackedTL"},{"element":"leftBox","visible":false,"position":"stackedTL"},{"element":"taskbar","visible":true,"position":"centerMonitor"},{"element":"centerBox","visible":true,"position":"stackedBR"},{"element":"rightBox","visible":true,"position":"stackedBR"},{"element":"dateMenu","visible":true,"position":"stackedBR"},{"element":"systemMenu","visible":true,"position":"stackedBR"},{"element":"desktopButton","visible":false,"position":"stackedBR"}]}'';
panel-lengths = ''{"0":100}'';
panel-positions = ''{"0":"BOTTOM"}'';
panel-sizes = ''{"0":42}'';
primary-monitor = 0;
secondarymenu-contains-showdetails = true;
show-showdesktop-hover = true;
status-icon-padding = -1;
stockgs-force-hotcorner = false;
stockgs-keep-dash = false;
stockgs-keep-top-panel = false;
stockgs-panelbtn-click-only = false;
trans-bg-color = "#2a2a2a";
trans-dynamic-anim-target = 1.0;
trans-dynamic-behavior = "MAXIMIZED_WINDOWS";
trans-gradient-bottom-color = "#000000";
trans-gradient-bottom-opacity = 0.5;
trans-gradient-top-opacity = 0.0;
trans-panel-opacity = 0.0;
trans-use-custom-bg = true;
trans-use-custom-gradient = true;
trans-use-custom-opacity = true;
trans-use-dynamic-opacity = true;
tray-padding = -1;
window-preview-title-position = "TOP";
};
};
}

View file

@ -1,23 +1,29 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.gnome;
in mkIf cfg.enable {
in
mkIf cfg.enable {
home.packages =
with pkgs;
with gnome;
with gnomeExtensions; [
# gtk3 theme
adw-gtk3
with pkgs;
with gnome;
with gnomeExtensions;
[
# gtk3 theme
adw-gtk3
# gnomeExtensions
caffeine
dash-to-panel
dash-to-dock
appindicator
privacy-settings-menu
];
# gnomeExtensions
caffeine
dash-to-panel
dash-to-dock
appindicator
privacy-settings-menu
];
catppuccin.enable = mkForce false;
home.pointerCursor = mkForce null;
@ -26,7 +32,9 @@ in mkIf cfg.enable {
home.persistence."/nix/persist/home/${config.home.username}" = {
removePrefixDirectory = true;
files = [
(if config.specialisation != {} then "gnome/.config/monitors.xml" else "extern/.config/monitors.xml")
(
if config.specialisation != { } then "gnome/.config/monitors.xml" else "extern/.config/monitors.xml"
)
];
};
}

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.gnome;
in mkIf cfg.enable {
in
mkIf cfg.enable {
global.flatpak.enable = mkDefault true;
home.catppuccin.enable = mkDefault false;
catppuccin.enable = false;
@ -17,33 +22,43 @@ in mkIf cfg.enable {
xdg.portal.configPackages = with pkgs; [ gnome-session ];
services.pulseaudio.enable = false;
environment.gnome.excludePackages = (with pkgs; [
snapshot
gnome-tour
] ++ optionals config.global.flatpak.enable [
baobab
simple-scan
evince
file-roller
geary
loupe
seahorse
totem
epiphany
gnome-calculator
gnome-calendar
gnome-connections
gnome-font-viewer
gnome-text-editor
gnome-characters
gnome-clocks
gnome-contacts
gnome-logs
gnome-maps
gnome-music
gnome-weather
]) ++ (with pkgs.gnome; [ ] ++ optionals config.global.flatpak.enable [
]);
environment.gnome.excludePackages =
(
with pkgs;
[
snapshot
gnome-tour
]
++ optionals config.global.flatpak.enable [
baobab
simple-scan
evince
file-roller
geary
loupe
seahorse
totem
epiphany
gnome-calculator
gnome-calendar
gnome-connections
gnome-font-viewer
gnome-text-editor
gnome-characters
gnome-clocks
gnome-contacts
gnome-logs
gnome-maps
gnome-music
gnome-weather
]
)
++ (
with pkgs.gnome;
[ ]
++ optionals config.global.flatpak.enable [
]
);
users.home.persist.directories = [ ".config/dconf" ];
}

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.gnome;
in {
in
{
imports = [ ./impl/nixos.nix ];
options.home.gnome = {
@ -16,10 +21,12 @@ in {
{ passthrough.gnome = cfg; }
];
specialisation.nognome = with cfg; mkIf enable {
configuration = {
home.gnome.enable = mkForce false;
specialisation.nognome =
with cfg;
mkIf enable {
configuration = {
home.gnome.enable = mkForce false;
};
};
};
};
}

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
catppuccin = config.passthrough.catppuccin.enable;
in {
in
{
config = mkIf config.passthrough.gui {
# cursor theme
home.pointerCursor = {

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
gui = with config.global.gpu; enable && session;
catppuccin = config.home.catppuccin;
in {
in
{
config = {
users.homeModules = [
# this module passes gui configuration to home-manager
@ -13,13 +18,18 @@ in {
users.adminGroups = mkIf gui [ "video" ];
# themes and icons
environment.systemPackages = with pkgs; mkIf gui ([
papirus-icon-theme
] ++ optionals (!catppuccin.enable) [
whitesur-gtk-theme
whitesur-icon-theme
bibata-cursors
]);
environment.systemPackages =
with pkgs;
mkIf gui (
[
papirus-icon-theme
]
++ optionals (!catppuccin.enable) [
whitesur-gtk-theme
whitesur-icon-theme
bibata-cursors
]
);
fonts.enableDefaultPackages = mkIf gui true;

View file

@ -1,13 +1,21 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.gyroflow;
in mkIf cfg.enable {
in
mkIf cfg.enable {
# temporarily gone until regression is fixed
#home.packages = [ cfg.package ];
wayland.windowManager.sway.config.window.commands = [
{ criteria.app_id = "xyz.gyroflow.gyroflow"; command = "floating enable"; }
{
criteria.app_id = "xyz.gyroflow.gyroflow";
command = "floating enable";
}
];
}

View file

@ -1,16 +1,23 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.gyroflow;
in {
in
{
options.home.gyroflow = {
enable = mkEnableOption "gyroflow stabilisation software";
package = mkOption {
type = with types; package;
default = pkgs.gyroflow.overrideAttrs (finalAttrs: previousAttrs: {
buildInputs = previousAttrs.buildInputs ++ [ pkgs.qt6Packages.qtwayland ];
});
default = pkgs.gyroflow.overrideAttrs (
finalAttrs: previousAttrs: {
buildInputs = previousAttrs.buildInputs ++ [ pkgs.qt6Packages.qtwayland ];
}
);
description = "gyroflow package";
};
};

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.headless;
in mkIf (cfg.enable != null) {
in
mkIf (cfg.enable != null) {
wayland.windowManager.sway.config = {
output = {
${cfg.enable}.pos = "0 0";
@ -13,12 +18,14 @@ in mkIf (cfg.enable != null) {
startup = [ { command = "swaymsg create_output && swaymsg output HEADLESS-1 disable"; } ];
};
home.packages = [ (pkgs.writeShellScriptBin "headless" ''
swaymsg output HEADLESS-1 enable
${pkgs.wayvnc}/bin/wayvnc \
--output=HEADLESS-1 \
${cfg.extraArgs} \
${cfg.host} ${toString cfg.port}
swaymsg output HEADLESS-1 disable
'') ];
home.packages = [
(pkgs.writeShellScriptBin "headless" ''
swaymsg output HEADLESS-1 enable
${pkgs.wayvnc}/bin/wayvnc \
--output=HEADLESS-1 \
${cfg.extraArgs} \
${cfg.host} ${toString cfg.port}
swaymsg output HEADLESS-1 disable
'')
];
}

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.headless;
in {
in
{
options.home.headless = {
enable = mkOption {
type = with types; nullOr str;

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
programs.i3status = {
enable = true;
enableDefault = false;
@ -48,8 +52,9 @@
position = 5;
settings = {
format = "%1min %5min %15min";
max_threshold =
removeSuffix "\n" (builtins.readFile (pkgs.runCommandLocal "nproc" { } "nproc > $out"));
max_threshold = removeSuffix "\n" (
builtins.readFile (pkgs.runCommandLocal "nproc" { } "nproc > $out")
);
};
};
@ -70,7 +75,9 @@
"tztime local" = {
position = 127;
settings = { format = "%Y-%m-%d %H:%M:%S"; };
settings = {
format = "%Y-%m-%d %H:%M:%S";
};
};
};
};

View file

@ -1,6 +1,10 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
programs.imv.enable = true;
}

View file

@ -1,11 +1,18 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.jetbrains;
in mkIf cfg.enable {
home.packages = with pkgs.jetbrains; [ pkgs.go ] ++
optional cfg.idea idea-community ++
optional cfg.clion clion ++
optional cfg.goland goland;
in
mkIf cfg.enable {
home.packages =
with pkgs.jetbrains;
[ pkgs.go ]
++ optional cfg.idea idea-community
++ optional cfg.clion clion
++ optional cfg.goland goland;
}

View file

@ -1,14 +1,21 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.jetbrains;
in {
in
{
options.home.jetbrains = {
enable = mkEnableOption "jetbrains text editor";
idea = mkEnableOption "intellij idea";
clion = mkEnableOption "clion ide";
goland = mkEnableOption "goland ide" // { default = true; };
goland = mkEnableOption "goland ide" // {
default = true;
};
};
config = {

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.libreoffice;
enable = cfg.enable && (cfg.allUsers || (config.home.username == "app"));
in mkIf enable {
in
mkIf enable {
home.packages = with pkgs; [ libreoffice ];
}

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.libreoffice;
persist = [ ".config/libreoffice" ];
in {
in
{
options.home.libreoffice = {
enable = mkEnableOption "open source office suite";
allUsers = mkEnableOption "set up for all users";

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
services.mako = {
enable = true;
defaultTimeout = 5000;

View file

@ -1,16 +1,27 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
inherit (config.passthrough) gui;
cfg = config.passthrough.minecraft;
enable = cfg.enable && config.home.username == cfg.user;
in mkIf enable {
home.packages = with pkgs; [
jdk8
] ++ optional gui prismlauncher;
in
mkIf enable {
home.packages =
with pkgs;
[
jdk8
]
++ optional gui prismlauncher;
wayland.windowManager.sway.config.window.commands = mkIf gui [
{ criteria.app_id = "org.prismlauncher.PrismLauncher"; command = "floating enable"; }
{
criteria.app_id = "org.prismlauncher.PrismLauncher";
command = "floating enable";
}
];
}

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.minecraft;
gui = with config.global.gpu; enable && session;
in {
in
{
options.home.minecraft = {
enable = mkEnableOption "minecraft game launcher and jvm";
user = mkOption {

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
programs.mpv = {
enable = true;
config = {

View file

@ -1,5 +1,8 @@
{ pkgs
, ... }: {
{
pkgs,
...
}:
{
programs.neovim = {
enable = true;
defaultEditor = true;

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.plasma;
image = ../../share/54345906_p0.jpg;
in mkIf cfg.enable {
in
mkIf cfg.enable {
programs.plasma = {
# https://github.com/pjones/plasma-manager
enable = true;

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, plasma-manager
, ... }: with lib; let
{
pkgs,
lib,
config,
plasma-manager,
...
}:
with lib;
let
cfg = config.home.plasma;
in {
in
{
options.home.plasma = {
enable = mkEnableOption "plasma desktop and configuration";
specialise = mkEnableOption "enable plasma in a specialisation";

View file

@ -1,41 +1,48 @@
{ pkgs
, lib
, config
, inputs
, ... }: with lib; let
{
pkgs,
lib,
config,
inputs,
...
}:
with lib;
let
cfg = config.users;
in {
in
{
options.users = {
profiles = mkOption {
type = with types; attrsOf (submodule {
options = {
uid = mkOption {
type = with types; nullOr int;
default = null;
description = "uid passthrough to base user configuration";
type =
with types;
attrsOf (submodule {
options = {
uid = mkOption {
type = with types; nullOr int;
default = null;
description = "uid passthrough to base user configuration";
};
description = mkOption {
type = with types; nullOr str;
default = null;
description = "description passthrough to base user configuration";
};
admin = mkOption {
type = with types; bool;
default = false;
description = "add user to privileged groups";
};
sshLogin = mkOption {
type = with types; bool;
default = false;
description = "enable ssh authorized keys for user";
};
picture = mkOption {
type = with types; nullOr path;
default = null;
description = "path to user profile picture";
};
};
description = mkOption {
type = with types; nullOr str;
default = null;
description = "description passthrough to base user configuration";
};
admin = mkOption {
type = with types; bool;
default = false;
description = "add user to privileged groups";
};
sshLogin = mkOption {
type = with types; bool;
default = false;
description = "enable ssh authorized keys for user";
};
picture = mkOption {
type = with types; nullOr path;
default = null;
description = "path to user profile picture";
};
};
});
});
description = "preconfigured users with profile options";
};
@ -57,11 +64,21 @@ in {
};
persist = {
files = mkOption {
type = with types; listOf (oneOf [ str (attrsOf str) ]);
type =
with types;
listOf (oneOf [
str
(attrsOf str)
]);
default = [ ];
};
directories = mkOption {
type = with types; listOf (oneOf [ str (attrsOf str) ]);
type =
with types;
listOf (oneOf [
str
(attrsOf str)
]);
default = [ ];
};
};
@ -74,8 +91,9 @@ in {
inherit (opts) uid;
description = with opts; mkIf (description != null) description;
extraGroups = [ "dialout" ] ++ optionals opts.admin cfg.adminGroups;
openssh.authorizedKeys.keys = mkIf (opts.sshLogin && config.services.openssh.enable)
config.global.auth.openssh.publicKeys;
openssh.authorizedKeys.keys = mkIf (
opts.sshLogin && config.services.openssh.enable
) config.global.auth.openssh.publicKeys;
hashedPasswordFile = "/nix/persist/shadow/${name}";
shell = pkgs.zsh;
isNormalUser = mkIf (name != "root") true;
@ -85,98 +103,125 @@ in {
# base groups
adminGroups = [
"wheel" "kvm"
"wheel"
"kvm"
"systemd-journal"
"networkmanager"
];
# base home modules in current directory
homeModules = pipe ./. [
builtins.readDir
(filterAttrs (n: ty: ty == "directory" && builtins.pathExists ./${n}/home.nix))
(mapAttrsToList (n: _: ./${n}/home.nix))
] ++ [ {
options.passthrough = mkOption {
type = with types; attrsOf anything;
description = "passthrough values from nixos configuration";
};
} ];
homeModules =
pipe ./. [
builtins.readDir
(filterAttrs (n: ty: ty == "directory" && builtins.pathExists ./${n}/home.nix))
(mapAttrsToList (n: _: ./${n}/home.nix))
]
++ [
{
options.passthrough = mkOption {
type = with types; attrsOf anything;
description = "passthrough values from nixos configuration";
};
}
];
# basic persistence
home.persist = {
directories = [
"src"
{ directory = ".gnupg"; mode = "0700"; }
{ directory = ".ssh"; mode = "0700"; }
{ directory = ".local/share/keyrings"; mode = "0700"; }
{
directory = ".gnupg";
mode = "0700";
}
{
directory = ".ssh";
mode = "0700";
}
{
directory = ".local/share/keyrings";
mode = "0700";
}
];
};
};
# mount tmpfs on each user's home directory with appropriate ownership
fileSystems = mapAttrs'
(name: opts: nameValuePair
# nixpkgs quirk: accessing user configuration here causes infinite recursion
# this workaround ensures proper home directory path unless overridden elsewhere
(if name != "root" then "/home/${name}" else "/root") {
device = "homefs";
fsType = "tmpfs";
options = [ "size=${cfg.home.size}"
"uid=${builtins.toString opts.uid}"
"gid=${builtins.toString cfg.groups.${cfg.users.${name}.group}.gid}"
"mode=700" ];
fileSystems = mapAttrs' (
name: opts:
nameValuePair
# nixpkgs quirk: accessing user configuration here causes infinite recursion
# this workaround ensures proper home directory path unless overridden elsewhere
(if name != "root" then "/home/${name}" else "/root")
{
device = "homefs";
fsType = "tmpfs";
options = [
"size=${cfg.home.size}"
"uid=${builtins.toString opts.uid}"
"gid=${builtins.toString cfg.groups.${cfg.users.${name}.group}.gid}"
"mode=700"
];
# impermanence sets permissions before filesystems are mounted
# this mounts filesystem in initrd therefore working around that bug
neededForBoot = true;
}) cfg.profiles;
# impermanence sets permissions before filesystems are mounted
# this mounts filesystem in initrd therefore working around that bug
neededForBoot = true;
}
) cfg.profiles;
global.fs.zfs.mountpoints = mapAttrs'
(name: opts: nameValuePair
"/nix/persist/home/${name}"
"home/${name}")
(filterAttrs (n: _: n != "root") config.users.profiles);
global.fs.zfs.mountpoints = mapAttrs' (
name: opts: nameValuePair "/nix/persist/home/${name}" "home/${name}"
) (filterAttrs (n: _: n != "root") config.users.profiles);
home-manager.users = mapAttrs (name: opts: {
imports = with inputs; cfg.homeModules ++ [
impermanence.homeManagerModules.impermanence
catppuccin.homeManagerModules.catppuccin
];
imports =
with inputs;
cfg.homeModules
++ [
impermanence.homeManagerModules.impermanence
catppuccin.homeManagerModules.catppuccin
];
home.file.".face" = mkIf (opts.picture != null) {
source = opts.picture;
};
home.stateVersion = "23.11";
}) cfg.profiles;
system.activationScripts = mapAttrs'
(name: opts: nameValuePair
"${name}-profile-icon"
{
deps = [ "users" ];
text = let
iconDest = "/var/lib/AccountsService/icons/${name}";
userConf = pkgs.writeText "${name}-config" ''
[User]
Session=
Icon=${iconDest}
SystemAccount=false
'';
in ''
install -Dm 0444 ${opts.picture} ${iconDest}
install -Dm 0400 ${userConf} /var/lib/AccountsService/users/${name}
'';
})
(filterAttrs (n: _: n != "root") config.users.profiles);
system.activationScripts = mapAttrs' (
name: opts:
nameValuePair "${name}-profile-icon" {
deps = [ "users" ];
text =
let
iconDest = "/var/lib/AccountsService/icons/${name}";
userConf = pkgs.writeText "${name}-config" ''
[User]
Session=
Icon=${iconDest}
SystemAccount=false
'';
in
''
install -Dm 0444 ${opts.picture} ${iconDest}
install -Dm 0400 ${userConf} /var/lib/AccountsService/users/${name}
'';
}
) (filterAttrs (n: _: n != "root") config.users.profiles);
# set up standard persistence for users
# this is registered internally for each software's configuration
environment.persistence."/nix/persist" = {
users = (mapAttrs (name: _: cfg.home.persist // {
# root workaround, ugly but necessary
# cannot get it properly for the same reason
# mentioned above in fileSystems
home = mkIf (name == "root") "/root";
}) cfg.profiles);
users = (
mapAttrs (
name: _:
cfg.home.persist
// {
# root workaround, ugly but necessary
# cannot get it properly for the same reason
# mentioned above in fileSystems
home = mkIf (name == "root") "/root";
}
) cfg.profiles
);
hideMounts = true;
};

View file

@ -1,14 +1,27 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.steam;
in mkIf cfg.enable {
in
mkIf cfg.enable {
hardware.steam-hardware.enable = true;
networking.firewall = {
allowedTCPPorts = [ 27015 27036 ];
allowedTCPPorts = [
27015
27036
];
allowedUDPPorts = [ 27015 ];
allowedUDPPortRanges = [ { from = 27031; to = 27036; } ];
allowedUDPPortRanges = [
{
from = 27031;
to = 27036;
}
];
};
}

View file

@ -1,17 +1,25 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.steam;
enable = cfg.enable && (cfg.allUsers || (config.home.username == "app"));
package = config.programs.steam.package;
in mkIf enable {
in
mkIf enable {
home.packages = with pkgs; [
cfg.package
cfg.package.run
];
wayland.windowManager.sway.config.window.commands = [
{ criteria.class = "steam"; command = "floating enable"; }
{
criteria.class = "steam";
command = "floating enable";
}
];
}

View file

@ -1,10 +1,18 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.steam;
persist = [ ".steam" ".local/share/Steam" ];
in {
persist = [
".steam"
".local/share/Steam"
];
in
{
imports = [ ./config.nix ];
options.home.steam = {

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
wayland.windowManager.sway = {
enable = true;
@ -12,33 +16,38 @@
config = {
defaultWorkspace = "workspace number 1";
modifier = "Mod4";
keybindings = let
modifier = config.wayland.windowManager.sway.config.modifier;
in mkOptionDefault {
XF86MonBrightnessUp = "light -A 5";
XF86MonBrightnessDown = "light -U 5";
keybindings =
let
modifier = config.wayland.windowManager.sway.config.modifier;
in
mkOptionDefault {
XF86MonBrightnessUp = "light -A 5";
XF86MonBrightnessDown = "light -U 5";
"Control+Alt+l" = "exec swaylock -f --grace 0";
"Print" = "exec ${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy";
"${modifier}+Print" = "exec ${pkgs.grim}/bin/grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | ${pkgs.wl-clipboard}/bin/wl-copy";
"${modifier}+q" = "exec google-chrome-stable";
"${modifier}+Home" = "exec ${pkgs.pavucontrol}/bin/pavucontrol";
};
bars = [ {
mode = "dock";
position = "bottom";
workspaceButtons = true;
workspaceNumbers = true;
statusCommand = "${pkgs.i3status}/bin/i3status";
fonts = {
names = [ "monospace" ];
size = 8.0;
"Control+Alt+l" = "exec swaylock -f --grace 0";
"Print" = "exec ${pkgs.grim}/bin/grim - | ${pkgs.wl-clipboard}/bin/wl-copy";
"${modifier}+Print" =
"exec ${pkgs.grim}/bin/grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | ${pkgs.wl-clipboard}/bin/wl-copy";
"${modifier}+q" = "exec google-chrome-stable";
"${modifier}+Home" = "exec ${pkgs.pavucontrol}/bin/pavucontrol";
};
trayOutput = "primary";
# sets transparency
colors.background = "00000000";
} ];
bars = [
{
mode = "dock";
position = "bottom";
workspaceButtons = true;
workspaceNumbers = true;
statusCommand = "${pkgs.i3status}/bin/i3status";
fonts = {
names = [ "monospace" ];
size = 8.0;
};
trayOutput = "primary";
# sets transparency
colors.background = "00000000";
}
];
input."*".natural_scroll = "enabled";
input."type:touchpad".tap = "enabled";

View file

@ -1,36 +1,48 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
gui = with config.global.gpu; enable && session;
nvidia = with config.global.gpu; type == "nvidia" || type == "prime";
in mkIf gui {
in
mkIf gui {
services.displayManager.sessionPackages = [
(pkgs.writeTextFile {
name = "sway-session";
destination = "/share/wayland-sessions/sway.desktop";
text = ''
[Desktop Entry]
Name=Sway
Comment=An i3-compatible Wayland compositor
Exec=${pkgs.writeTextFile {
name = "sway-wrapper";
executable = true;
text = ''
#!${pkgs.zsh}/bin/zsh
SHLVL=0
for profile in ''${(z)NIX_PROFILES}; do
fpath+=($profile/share/zsh/site-functions $profile/share/zsh/$ZSH_VERSION/functions $profile/share/zsh/vendor-completions)
done
exec sway${if nvidia then " --unsupported-gpu" else ""} 2>&1 >> $XDG_CACHE_HOME/sway
'';
checkPhase = ''
${pkgs.stdenv.shellDryRun} "$target"
'';
}}
Type=Application
'';
} // { providedSessions = [ pkgs.sway.meta.mainProgram ]; })
(
pkgs.writeTextFile {
name = "sway-session";
destination = "/share/wayland-sessions/sway.desktop";
text = ''
[Desktop Entry]
Name=Sway
Comment=An i3-compatible Wayland compositor
Exec=${
pkgs.writeTextFile {
name = "sway-wrapper";
executable = true;
text = ''
#!${pkgs.zsh}/bin/zsh
SHLVL=0
for profile in ''${(z)NIX_PROFILES}; do
fpath+=($profile/share/zsh/site-functions $profile/share/zsh/$ZSH_VERSION/functions $profile/share/zsh/vendor-completions)
done
exec sway${if nvidia then " --unsupported-gpu" else ""} 2>&1 >> $XDG_CACHE_HOME/sway
'';
checkPhase = ''
${pkgs.stdenv.shellDryRun} "$target"
'';
}
}
Type=Application
'';
}
// {
providedSessions = [ pkgs.sway.meta.mainProgram ];
}
)
];
programs.light.enable = true;

View file

@ -1,24 +1,40 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
services.swayidle = let
sway = config.wayland.windowManager.sway.package;
swaymsg = "${sway}/bin/swaymsg";
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
in {
enable = true;
systemdTarget = "sway-session.target";
timeouts = [
{ timeout = 600; command = "${swaymsg} 'output * dpms off'"; resumeCommand = "${swaymsg} 'output * dpms on'"; }
];
events = [
{ event = "before-sleep"; command = "${swaylock} -f --grace 0"; }
];
};
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
services.swayidle =
let
sway = config.wayland.windowManager.sway.package;
swaymsg = "${sway}/bin/swaymsg";
swaylock = "${config.programs.swaylock.package}/bin/swaylock";
in
{
enable = true;
systemdTarget = "sway-session.target";
timeouts = [
{
timeout = 600;
command = "${swaymsg} 'output * dpms off'";
resumeCommand = "${swaymsg} 'output * dpms on'";
}
];
events = [
{
event = "before-sleep";
command = "${swaylock} -f --grace 0";
}
];
};
# fullscreen as simple idle inhibitor shortcut
wayland.windowManager.sway.config.window.commands = [
{ criteria.shell = ".*"; command = "inhibit_idle fullscreen"; }
{
criteria.shell = ".*";
command = "inhibit_idle fullscreen";
}
];
}

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;

View file

@ -1,8 +1,13 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
gui = with config.global.gpu; enable && session;
in mkIf gui {
in
mkIf gui {
security.pam.services.swaylock = { };
}

View file

@ -1,33 +1,61 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.util;
in {
home.packages = with pkgs; [
pv file wget e2fsprogs
] ++ optionals (!cfg.minimal) [
tio mbuffer sedutil
lsscsi zip unzip
nix-index dnsutils whois
pciutils usbutils nvme-cli
] ++ optionals config.passthrough.gui [
gtk-engine-murrine
gnome-themes-extra
in
{
home.packages =
with pkgs;
[
pv
file
wget
e2fsprogs
]
++ optionals (!cfg.minimal) [
tio
mbuffer
sedutil
lsscsi
zip
unzip
nix-index
dnsutils
whois
pciutils
usbutils
nvme-cli
]
++ optionals config.passthrough.gui [
gtk-engine-murrine
gnome-themes-extra
mission-planner
inav-configurator
inav-blackbox-tools
(blhelisuite32.override { workdir = "${config.home.homeDirectory}/.blhelisuite32"; })
] ++ optionals (config.passthrough.gui && !config.passthrough.flatpak.enable) [
xfce.thunar gimp
jellyfin-media-player
betaflight-configurator
expresslrs-configurator
];
mission-planner
inav-configurator
inav-blackbox-tools
(blhelisuite32.override { workdir = "${config.home.homeDirectory}/.blhelisuite32"; })
]
++ optionals (config.passthrough.gui && !config.passthrough.flatpak.enable) [
xfce.thunar
gimp
jellyfin-media-player
betaflight-configurator
expresslrs-configurator
];
wayland.windowManager.sway.config.window.commands = mkIf config.passthrough.gui [
{ criteria.class = "BLHeliSuite32xl"; command = "floating enable"; }
{ criteria.app_id = "thunar"; command = "floating enable"; }
{
criteria.class = "BLHeliSuite32xl";
command = "floating enable";
}
{
criteria.app_id = "thunar";
command = "floating enable";
}
];
}

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.util;
gui = with config.global.gpu; enable && session;
in {
in
{
options.home.util = {
minimal = mkEnableOption "minimal system environment with less packages";
};
@ -20,25 +25,26 @@ in {
programs.zsh.enable = true;
environment.shells = singleton pkgs.zsh;
users.home.persist.directories = [ ] ++
optionals (!cfg.minimal) [
".cache/nix-index"
] ++
optionals gui [
# mission-planner
".local/share/Mission Planner"
# inav-configurator
".config/inav-configurator"
] ++
optionals (gui && !config.global.flatpak.enable) [
# jellyfin-media-player
".config/jellyfin.org"
".local/share/jellyfinmediaplayer"
".local/share/Jellyfin Media Player"
# expresslrs-configurator
".config/ExpressLRS Configurator"
# betaflight-configurator
".config/betaflight-configurator"
];
users.home.persist.directories =
[ ]
++ optionals (!cfg.minimal) [
".cache/nix-index"
]
++ optionals gui [
# mission-planner
".local/share/Mission Planner"
# inav-configurator
".config/inav-configurator"
]
++ optionals (gui && !config.global.flatpak.enable) [
# jellyfin-media-player
".config/jellyfin.org"
".local/share/jellyfinmediaplayer"
".local/share/Jellyfin Media Player"
# expresslrs-configurator
".config/ExpressLRS Configurator"
# betaflight-configurator
".config/betaflight-configurator"
];
};
}

View file

@ -1,58 +1,73 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
dconf.settings = let
p = "org/virt-manager/virt-manager";
in {
${p} = {
xmleditor-enabled = true;
# swaybar tray doesn't really work
system-tray = false;
};
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
dconf.settings =
let
p = "org/virt-manager/virt-manager";
in
{
${p} = {
xmleditor-enabled = true;
# swaybar tray doesn't really work
system-tray = false;
};
"${p}/details".show-toolbar = true;
"${p}/console" = {
scaling = 0;
auto-redirect = false;
resize-guest = 1;
};
"${p}/stats" = {
enable-memory-poll = true;
enable-disk-poll = true;
enable-net-poll = true;
};
"${p}/vmlist-fields" = {
host-cpu-usage = true;
memory-usage = true;
disk-usage = true;
network-traffic = true;
};
"${p}/details".show-toolbar = true;
"${p}/console" = {
scaling = 0;
auto-redirect = false;
resize-guest = 1;
};
"${p}/stats" = {
enable-memory-poll = true;
enable-disk-poll = true;
enable-net-poll = true;
};
"${p}/vmlist-fields" = {
host-cpu-usage = true;
memory-usage = true;
disk-usage = true;
network-traffic = true;
};
"${p}/new-vm" = {
firmware = "uefi";
graphics-type = "system";
};
"${p}/new-vm" = {
firmware = "uefi";
graphics-type = "system";
};
"${p}/confirm" = {
unapplied-dev = true;
removedev = true;
delete-storage = true;
forcepoweroff = false;
};
"${p}/confirm" = {
unapplied-dev = true;
removedev = true;
delete-storage = true;
forcepoweroff = false;
};
"${p}/connections" = let
uri = "qemu:///system";
in {
uris = [ uri ];
autoconnect = [ uri ];
"${p}/connections" =
let
uri = "qemu:///system";
in
{
uris = [ uri ];
autoconnect = [ uri ];
};
"${p}/conns/qemu:system".pretty-name = "KVM";
};
"${p}/conns/qemu:system".pretty-name = "KVM";
};
# floating other than main window
wayland.windowManager.sway.config.window.commands = [
{ criteria.app_id = "virt-manager"; command = "floating enable"; }
{ criteria.app_id = "virt-manager"; criteria.title = "Virtual Machine Manager"; command = "floating disable"; }
{
criteria.app_id = "virt-manager";
command = "floating enable";
}
{
criteria.app_id = "virt-manager";
criteria.title = "Virtual Machine Manager";
command = "floating disable";
}
];
}

View file

@ -1,8 +1,13 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
gui = with config.global.gpu; enable && session;
in mkIf gui {
in
mkIf gui {
programs.virt-manager.enable = true;
}

View file

@ -1,10 +1,15 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.passthrough.vscode;
theme = config.passthrough.catppuccin.enable;
in mkIf cfg.enable {
in
mkIf cfg.enable {
programs.vscode = {
enable = true;
mutableExtensionsDir = false;
@ -12,8 +17,11 @@ in mkIf cfg.enable {
enableExtensionUpdateCheck = false;
package = pkgs.vscodium;
extensions = with pkgs.vscode-extensions; [
catppuccin.catppuccin-vsc catppuccin.catppuccin-vsc-icons
bbenoist.nix golang.go rust-lang.rust-analyzer
catppuccin.catppuccin-vsc
catppuccin.catppuccin-vsc-icons
bbenoist.nix
golang.go
rust-lang.rust-analyzer
];
userSettings = {
"workbench.colorTheme" = mkIf theme "Catppuccin Mocha";

View file

@ -1,9 +1,14 @@
{ pkgs
, lib
, config
, ... }: with lib; let
{
pkgs,
lib,
config,
...
}:
with lib;
let
cfg = config.home.vscode;
in {
in
{
options.home.vscode = {
enable = mkEnableOption "vscode text editor";
};

View file

@ -1,7 +1,11 @@
{ pkgs
, lib
, config
, ... }: with lib; mkIf config.passthrough.gui {
{
pkgs,
lib,
config,
...
}:
with lib;
mkIf config.passthrough.gui {
programs.wofi = {
enable = true;
settings.mode = "drun";

View file

@ -1,21 +1,26 @@
{ config
, ... }: {
{
config,
...
}:
{
xdg = {
enable = true;
userDirs = let
home = config.home.homeDirectory;
local = "${home}/local";
in {
enable = true;
createDirectories = true;
download = "${home}/dl";
desktop = "${local}/desktop";
documents = "${local}/documents";
music = "${local}/music";
pictures = "${local}/pictures";
publicShare = "${local}/public";
templates = "${local}/templates";
videos = "${local}/videos";
};
userDirs =
let
home = config.home.homeDirectory;
local = "${home}/local";
in
{
enable = true;
createDirectories = true;
download = "${home}/dl";
desktop = "${local}/desktop";
documents = "${local}/documents";
music = "${local}/music";
pictures = "${local}/pictures";
publicShare = "${local}/public";
templates = "${local}/templates";
videos = "${local}/videos";
};
};
}

View file

@ -1,3 +1,6 @@
{
users.home.persist.directories = [ "local" "dl" ];
users.home.persist.directories = [
"local"
"dl"
];
}

View file

@ -1,24 +1,32 @@
{ config
, ... }: {
{
config,
...
}:
{
programs.zsh = {
enable = true;
autocd = false;
defaultKeymap = "emacs";
localVariables.PROMPT = let
op = {
res = "%{$reset_color%}";
col = color: "%{$fg[${color}]%}";
};
c = color: text: "${op.col color}${text}${op.res}";
in "${c "green" "%n"}${c "cyan" "@"}${c "yellow" "%m"} ${c "magenta" "<3"} %~ ${c "blue" "$PARTICLE"}${c "red" "%#"} ";
localVariables.PROMPT =
let
op = {
res = "%{$reset_color%}";
col = color: "%{$fg[${color}]%}";
};
c = color: text: "${op.col color}${text}${op.res}";
in
"${c "green" "%n"}${c "cyan" "@"}${c "yellow" "%m"} ${c "magenta" "<3"} %~ ${c "blue" "$PARTICLE"}${c "red" "%#"} ";
sessionVariables.LIBVIRT_DEFAULT_URI = "qemu:///system";
history = {
extended = true;
path = "${config.home.homeDirectory}/.local/state/zsh/history";
ignorePatterns = [
"rm *" "reboot"
"kill *" "killall *" "pkill *"
"rm *"
"reboot"
"kill *"
"killall *"
"pkill *"
];
};

View file

@ -1,3 +1,8 @@
{
users.home.persist.directories = [ { directory = ".local/state/zsh"; mode = "0700"; } ];
users.home.persist.directories = [
{
directory = ".local/state/zsh";
mode = "0700";
}
];
}