mirror of
https://github.com/ItsDrike/nixdots
synced 2025-01-24 03:24:34 +00:00
Compare commits
No commits in common. "575e6ae979f4ad10735e6fcaba9e42790960726d" and "e79a5d7cde768a3690e448758e7bae5966eba52b" have entirely different histories.
575e6ae979
...
e79a5d7cde
|
@ -1,15 +1,26 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
# TODO: Only apply this to workstations
|
osConfig,
|
||||||
home.packages = with pkgs; [
|
lib,
|
||||||
libnotify # send desktop notifications
|
pkgs,
|
||||||
imagemagick # create/edit images
|
...
|
||||||
trash-cli # interface to freedesktop trashcan
|
}: let
|
||||||
bitwarden-cli # pw manager
|
inherit (lib) mkIf;
|
||||||
slides # terminal based presentation tool
|
|
||||||
brightnessctl # brightness control
|
devType = osConfig.myOptions.device.roles.type;
|
||||||
pulsemixer # manage audio (TUI)
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
nix-tree # interactively browse nix store
|
in {
|
||||||
glow # render markdown
|
config = mkIf (builtins.elem devType acceptedTypes) {
|
||||||
ffmpeg # record, convert and stream audio and video
|
home.packages = with pkgs; [
|
||||||
];
|
libnotify # send desktop notifications
|
||||||
|
imagemagick # create/edit images
|
||||||
|
trash-cli # interface to freedesktop trashcan
|
||||||
|
bitwarden-cli # pw manager
|
||||||
|
slides # terminal based presentation tool
|
||||||
|
brightnessctl # brightness control
|
||||||
|
pulsemixer # manage audio (TUI)
|
||||||
|
nix-tree # interactively browse nix store
|
||||||
|
glow # render markdown
|
||||||
|
ffmpeg # record, convert and stream audio and video
|
||||||
|
];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
{pkgs, ...}: {
|
|
||||||
home.packages = with pkgs; [ninja];
|
|
||||||
}
|
|
|
@ -1,6 +1,5 @@
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./python
|
./python
|
||||||
./cpp.nix
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
nixd
|
nixd
|
||||||
emmet-language-server
|
emmet-language-server
|
||||||
vscode-langservers-extracted
|
vscode-langservers-extracted
|
||||||
kotlin-language-server
|
|
||||||
|
|
||||||
# Linters / formatters
|
# Linters / formatters
|
||||||
stylua
|
stylua
|
||||||
|
@ -50,7 +49,6 @@
|
||||||
alejandra
|
alejandra
|
||||||
deadnix
|
deadnix
|
||||||
statix
|
statix
|
||||||
ktlint
|
|
||||||
|
|
||||||
# Other tools / utilities
|
# Other tools / utilities
|
||||||
ripgrep
|
ripgrep
|
||||||
|
|
|
@ -4,14 +4,10 @@
|
||||||
|
|
||||||
# A list of shared modules that ALL systems need
|
# A list of shared modules that ALL systems need
|
||||||
shared = [
|
shared = [
|
||||||
../system/shared
|
../system
|
||||||
../home
|
../home
|
||||||
../options
|
../options
|
||||||
];
|
];
|
||||||
|
|
||||||
workstationRole = ../system/roles/workstation;
|
|
||||||
laptopRole = ../system/roles/laptop;
|
|
||||||
uniRole = ../system/roles/uni;
|
|
||||||
in {
|
in {
|
||||||
herugrim = lib.nixosSystem {
|
herugrim = lib.nixosSystem {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
|
@ -22,8 +18,6 @@ in {
|
||||||
inputs.home-manager.nixosModules.home-manager
|
inputs.home-manager.nixosModules.home-manager
|
||||||
inputs.impermanence.nixosModules.impermanence
|
inputs.impermanence.nixosModules.impermanence
|
||||||
inputs.lanzaboote.nixosModules.lanzaboote
|
inputs.lanzaboote.nixosModules.lanzaboote
|
||||||
workstationRole
|
|
||||||
laptopRole
|
|
||||||
]
|
]
|
||||||
++ shared;
|
++ shared;
|
||||||
};
|
};
|
||||||
|
@ -37,9 +31,6 @@ in {
|
||||||
inputs.home-manager.nixosModules.home-manager
|
inputs.home-manager.nixosModules.home-manager
|
||||||
inputs.impermanence.nixosModules.impermanence
|
inputs.impermanence.nixosModules.impermanence
|
||||||
inputs.lanzaboote.nixosModules.lanzaboote
|
inputs.lanzaboote.nixosModules.lanzaboote
|
||||||
workstationRole
|
|
||||||
laptopRole
|
|
||||||
uniRole
|
|
||||||
]
|
]
|
||||||
++ shared;
|
++ shared;
|
||||||
};
|
};
|
||||||
|
|
|
@ -98,11 +98,6 @@
|
||||||
".local/share/cargo"
|
".local/share/cargo"
|
||||||
".local/share/go"
|
".local/share/go"
|
||||||
".config/rye"
|
".config/rye"
|
||||||
|
|
||||||
# University crap
|
|
||||||
"Android/Sdk"
|
|
||||||
"AndroidStudioProjects"
|
|
||||||
".android"
|
|
||||||
];
|
];
|
||||||
extraFiles = [
|
extraFiles = [
|
||||||
".config/gtk-3.0/bookmarks"
|
".config/gtk-3.0/bookmarks"
|
||||||
|
@ -143,7 +138,10 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
device = {
|
device = {
|
||||||
roles.virtual-machine = false;
|
roles = {
|
||||||
|
type = "laptop";
|
||||||
|
virtual-machine = false;
|
||||||
|
};
|
||||||
cpu.type = "amd";
|
cpu.type = "amd";
|
||||||
gpu.type = "amd";
|
gpu.type = "amd";
|
||||||
hasTPM = true;
|
hasTPM = true;
|
||||||
|
@ -184,10 +182,10 @@
|
||||||
"eDP-1, 1920x1200@60, 0x1080, 1"
|
"eDP-1, 1920x1200@60, 0x1080, 1"
|
||||||
|
|
||||||
# HDMI-A-1 above primary
|
# HDMI-A-1 above primary
|
||||||
#"HDMI-A-1, 1920x1080@60, 0x0, 1"
|
"HDMI-A-1, 1920x1080@60, 0x0, 1"
|
||||||
|
|
||||||
# HDMI-A-1 left to primary
|
# HDMI-A-1 left to primary
|
||||||
"HDMI-A-1, 1920x1080@60, 1920x1080, 1"
|
#"HDMI-A-1, 1920x1080@60, 1920x1080, 1"
|
||||||
|
|
||||||
# Mirror the primary (laptop) monitor on externals
|
# Mirror the primary (laptop) monitor on externals
|
||||||
", preferred, auto, 1, mirror, eDP-1"
|
", preferred, auto, 1, mirror, eDP-1"
|
||||||
|
|
|
@ -1,11 +1,39 @@
|
||||||
{lib, ...}: let
|
{
|
||||||
inherit (lib) mkOption;
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkOption types;
|
||||||
|
|
||||||
|
cfg = config.myOptions.device.roles;
|
||||||
in {
|
in {
|
||||||
options.myOptions.device.roles = {
|
options.myOptions.device.roles = {
|
||||||
|
type = mkOption {
|
||||||
|
type = types.enum ["laptop" "desktop" "server"];
|
||||||
|
default = "";
|
||||||
|
description = ''
|
||||||
|
The type/purpoes of the device that will be used within the rest of the configuration.
|
||||||
|
- laptop: portable devices with battery optimizations
|
||||||
|
- desktop: stationary devices configured for maximum performance
|
||||||
|
- server: server and infrastructure
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
virtual-machine = mkOption {
|
virtual-machine = mkOption {
|
||||||
type = lib.types.bool;
|
type = lib.types.bool;
|
||||||
default = false;
|
default = false;
|
||||||
description = "Is this system a virtual machine?";
|
description = "Is this system a virtual machine?";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
isWorkstation = mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = builtins.elem cfg.type ["laptop" "desktop"];
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Is this machine a workstation?
|
||||||
|
|
||||||
|
Workstation machines are meant for regular day-to-day use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
11
system/roles/default.nix
Normal file
11
system/roles/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
# We import all of the roles here, with the type checks being handled
|
||||||
|
# in the individual files each time. This is a bit ugly, but necessary
|
||||||
|
# as NixOS doesn't support optional imports, due to circual imports
|
||||||
|
# (there might be a change of the config value inside one of the
|
||||||
|
# imported files).
|
||||||
|
imports = [
|
||||||
|
./workstation
|
||||||
|
./laptop
|
||||||
|
];
|
||||||
|
}
|
|
@ -1,20 +1,27 @@
|
||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
|
lib,
|
||||||
config,
|
config,
|
||||||
...
|
...
|
||||||
}: {
|
}: let
|
||||||
hardware.acpilight.enable = true;
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
hardware.acpilight.enable = true;
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [acpi];
|
environment.systemPackages = with pkgs; [acpi];
|
||||||
|
|
||||||
# handle ACPI events
|
# handle ACPI events
|
||||||
services.acpid.enable = true;
|
services.acpid.enable = true;
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
kernelModules = ["acpi_call"];
|
kernelModules = ["acpi_call"];
|
||||||
extraModulePackages = with config.boot.kernelPackages; [
|
extraModulePackages = with config.boot.kernelPackages; [
|
||||||
acpi_call
|
acpi_call
|
||||||
cpupower
|
cpupower
|
||||||
];
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,13 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop"];
|
||||||
|
in {
|
||||||
imports = [
|
imports = [
|
||||||
./power-profiles-daemon
|
./power-profiles-daemon
|
||||||
./upower.nix
|
./upower.nix
|
||||||
|
@ -6,7 +15,7 @@
|
||||||
./systemd.nix
|
./systemd.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
config = {
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
environment.systemPackages = with pkgs; [powertop];
|
environment.systemPackages = with pkgs; [powertop];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,37 +1,43 @@
|
||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
|
config,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
inherit (lib.modules) mkForce;
|
inherit (lib.modules) mkForce;
|
||||||
inherit (lib.strings) makeBinPath;
|
inherit (lib.strings) makeBinPath;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop"];
|
||||||
in {
|
in {
|
||||||
# allows changing system behavior based upon user-selected power profiles
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
# (with `powerprofilesctl` command)
|
# allows changing system behavior based upon user-selected power profiles
|
||||||
services.power-profiles-daemon.enable = true;
|
# (with `powerprofilesctl` command)
|
||||||
|
services.power-profiles-daemon.enable = true;
|
||||||
|
|
||||||
# Power state monitor. Switches power profiles based on charging state.
|
# Power state monitor. Switches power profiles based on charging state.
|
||||||
# Plugged in - performance (if available, falls back to balance)
|
# Plugged in - performance (if available, falls back to balance)
|
||||||
# Unplugged - balanced, until below 50%, then power-saver
|
# Unplugged - balanced, until below 50%, then power-saver
|
||||||
systemd.services."power-monitor" = let
|
systemd.services."power-monitor" = let
|
||||||
dependencies = with pkgs; [
|
dependencies = with pkgs; [
|
||||||
coreutils
|
coreutils
|
||||||
gnugrep
|
gnugrep
|
||||||
power-profiles-daemon
|
power-profiles-daemon
|
||||||
inotify-tools
|
inotify-tools
|
||||||
jaq
|
jaq
|
||||||
];
|
];
|
||||||
in {
|
in {
|
||||||
description = "Power Monitoring Service";
|
description = "Power Monitoring Service";
|
||||||
environment.PATH = mkForce "/run/wrappers/bin:${makeBinPath dependencies}";
|
environment.PATH = mkForce "/run/wrappers/bin:${makeBinPath dependencies}";
|
||||||
script = builtins.readFile ./power_monitor.sh;
|
script = builtins.readFile ./power_monitor.sh;
|
||||||
|
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "simple";
|
Type = "simple";
|
||||||
Restart = "on-failure";
|
Restart = "on-failure";
|
||||||
|
};
|
||||||
|
|
||||||
|
wants = ["power-profiles-daemon.service"];
|
||||||
|
wantedBy = ["default.target"];
|
||||||
};
|
};
|
||||||
|
|
||||||
wants = ["power-profiles-daemon.service"];
|
|
||||||
wantedBy = ["default.target"];
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,23 @@
|
||||||
{
|
{
|
||||||
services = {
|
pkgs,
|
||||||
# DBus service that provides power management support to applications
|
lib,
|
||||||
upower = {
|
config,
|
||||||
enable = true;
|
...
|
||||||
percentageLow = 15;
|
}: let
|
||||||
percentageCritical = 5;
|
inherit (lib) mkIf;
|
||||||
percentageAction = 3;
|
deviceType = config.myOptions.device.roles.type;
|
||||||
criticalPowerAction = "Hibernate";
|
acceptedTypes = ["laptop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
services = {
|
||||||
|
# DBus service that provides power management support to applications
|
||||||
|
upower = {
|
||||||
|
enable = true;
|
||||||
|
percentageLow = 15;
|
||||||
|
percentageCritical = 5;
|
||||||
|
percentageAction = 3;
|
||||||
|
criticalPowerAction = "Hibernate";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,32 @@
|
||||||
{
|
{
|
||||||
services.libinput = {
|
lib,
|
||||||
# enable libinput
|
config,
|
||||||
enable = true;
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
services.libinput = {
|
||||||
|
# enable libinput
|
||||||
|
enable = true;
|
||||||
|
|
||||||
# disable mouse acceleration
|
# disable mouse acceleration
|
||||||
mouse = {
|
mouse = {
|
||||||
accelProfile = "flat";
|
accelProfile = "flat";
|
||||||
accelSpeed = "0";
|
accelSpeed = "0";
|
||||||
middleEmulation = false;
|
middleEmulation = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
# touchpad settings
|
# touchpad settings
|
||||||
touchpad = {
|
touchpad = {
|
||||||
naturalScrolling = false; # I'm not natural
|
naturalScrolling = false; # I'm not natural
|
||||||
tapping = true;
|
tapping = true;
|
||||||
clickMethod = "clickfinger";
|
clickMethod = "clickfinger";
|
||||||
horizontalScrolling = true;
|
horizontalScrolling = true;
|
||||||
disableWhileTyping = true;
|
disableWhileTyping = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
{pkgs, ...}: {
|
|
||||||
environment.systemPackages = [pkgs.android-studio];
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
{
|
|
||||||
imports = [
|
|
||||||
./android.nix
|
|
||||||
];
|
|
||||||
}
|
|
|
@ -4,9 +4,12 @@
|
||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
inherit (lib) getExe;
|
inherit (lib) mkIf getExe;
|
||||||
inherit (lib.strings) concatStringsSep;
|
inherit (lib.strings) concatStringsSep;
|
||||||
|
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
|
||||||
greetingMsg = "'Access is restricted to authorized personnel only.'";
|
greetingMsg = "'Access is restricted to authorized personnel only.'";
|
||||||
tuiGreetTheme = "'border=magenta;text=cyan;prompt=green;time=red;action=white;button=yellow;container=black;input=gray'";
|
tuiGreetTheme = "'border=magenta;text=cyan;prompt=green;time=red;action=white;button=yellow;container=black;input=gray'";
|
||||||
|
|
||||||
|
@ -43,31 +46,33 @@
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
in {
|
in {
|
||||||
services.greetd = {
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
enable = true;
|
services.greetd = {
|
||||||
vt = 1;
|
enable = true;
|
||||||
|
vt = 1;
|
||||||
|
|
||||||
# <https://man.sr.ht/~kennylevinsen/greetd/>
|
# <https://man.sr.ht/~kennylevinsen/greetd/>
|
||||||
settings = {
|
settings = {
|
||||||
# default session is what will be used if no session is selected
|
# default session is what will be used if no session is selected
|
||||||
# in this case it'll be a TUI greeter
|
# in this case it'll be a TUI greeter
|
||||||
default_session = defaultSession;
|
default_session = defaultSession;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
# Suppress error messages on tuigreet. They sometimes obscure the TUI
|
# Suppress error messages on tuigreet. They sometimes obscure the TUI
|
||||||
# boundaries of the greeter.
|
# boundaries of the greeter.
|
||||||
# See: https://github.com/apognu/tuigreet/issues/68#issuecomment-1586359960
|
# See: https://github.com/apognu/tuigreet/issues/68#issuecomment-1586359960
|
||||||
systemd.services.greetd.serviceConfig = {
|
systemd.services.greetd.serviceConfig = {
|
||||||
Type = "idle";
|
Type = "idle";
|
||||||
StandardInput = "tty";
|
StandardInput = "tty";
|
||||||
StandardOutput = "tty";
|
StandardOutput = "tty";
|
||||||
StandardError = "journal";
|
StandardError = "journal";
|
||||||
TTYReset = true;
|
TTYReset = true;
|
||||||
TTYVHangup = true;
|
TTYVHangup = true;
|
||||||
TTYVTDisallocate = true;
|
TTYVTDisallocate = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Persist info about previous session & user
|
# Persist info about previous session & user
|
||||||
myOptions.system.impermanence.root.extraDirectories = ["/var/cache/tuigreet"];
|
myOptions.system.impermanence.root.extraDirectories = ["/var/cache/tuigreet"];
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,35 @@
|
||||||
{
|
{
|
||||||
# unlock GPG keyring on login
|
lib,
|
||||||
security.pam.services = let
|
config,
|
||||||
gnupg = {
|
...
|
||||||
enable = true;
|
}: let
|
||||||
noAutostart = true;
|
inherit (lib) mkIf;
|
||||||
storeOnly = true;
|
deviceType = config.myOptions.device.roles.type;
|
||||||
};
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
in {
|
in {
|
||||||
login = {
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
enableGnomeKeyring = true;
|
# unlock GPG keyring on login
|
||||||
inherit gnupg;
|
security.pam.services = let
|
||||||
};
|
gnupg = {
|
||||||
|
enable = true;
|
||||||
|
noAutostart = true;
|
||||||
|
storeOnly = true;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
login = {
|
||||||
|
enableGnomeKeyring = true;
|
||||||
|
inherit gnupg;
|
||||||
|
};
|
||||||
|
|
||||||
greetd = {
|
greetd = {
|
||||||
enableGnomeKeyring = true;
|
enableGnomeKeyring = true;
|
||||||
inherit gnupg;
|
inherit gnupg;
|
||||||
};
|
};
|
||||||
|
|
||||||
tuigreet = {
|
tuigreet = {
|
||||||
enableGnomeKeyring = true;
|
enableGnomeKeyring = true;
|
||||||
inherit gnupg;
|
inherit gnupg;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,109 +1,120 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
fonts = {
|
pkgs,
|
||||||
enableDefaultPackages = false;
|
lib,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
fonts = {
|
||||||
|
enableDefaultPackages = false;
|
||||||
|
|
||||||
fontconfig = {
|
fontconfig = {
|
||||||
defaultFonts = let
|
defaultFonts = let
|
||||||
common = [
|
common = [
|
||||||
"Iosevka Nerd Font"
|
"Iosevka Nerd Font"
|
||||||
"Symbols Nerd Font"
|
"Symbols Nerd Font"
|
||||||
"Noto Color Emoji"
|
|
||||||
];
|
|
||||||
in {
|
|
||||||
monospace =
|
|
||||||
[
|
|
||||||
"Monaspace Krypton"
|
|
||||||
"Source Code Pro Medium"
|
|
||||||
"Source Han Mono"
|
|
||||||
]
|
|
||||||
++ common;
|
|
||||||
|
|
||||||
sansSerif =
|
|
||||||
[
|
|
||||||
"Noto Sans"
|
|
||||||
"Jost"
|
|
||||||
"Lexend"
|
|
||||||
]
|
|
||||||
++ common;
|
|
||||||
|
|
||||||
serif =
|
|
||||||
[
|
|
||||||
"Noto Serif"
|
|
||||||
]
|
|
||||||
++ common;
|
|
||||||
|
|
||||||
emoji =
|
|
||||||
[
|
|
||||||
"Noto Color Emoji"
|
"Noto Color Emoji"
|
||||||
]
|
];
|
||||||
++ common;
|
in {
|
||||||
|
monospace =
|
||||||
|
[
|
||||||
|
"Monaspace Krypton"
|
||||||
|
"Source Code Pro Medium"
|
||||||
|
"Source Han Mono"
|
||||||
|
]
|
||||||
|
++ common;
|
||||||
|
|
||||||
|
sansSerif =
|
||||||
|
[
|
||||||
|
"Noto Sans"
|
||||||
|
"Jost"
|
||||||
|
"Lexend"
|
||||||
|
]
|
||||||
|
++ common;
|
||||||
|
|
||||||
|
serif =
|
||||||
|
[
|
||||||
|
"Noto Serif"
|
||||||
|
]
|
||||||
|
++ common;
|
||||||
|
|
||||||
|
emoji =
|
||||||
|
[
|
||||||
|
"Noto Color Emoji"
|
||||||
|
]
|
||||||
|
++ common;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fontDir = {
|
||||||
|
enable = true;
|
||||||
|
decompressFonts = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
packages = with pkgs; [
|
||||||
|
# programming fonts
|
||||||
|
sarasa-gothic
|
||||||
|
source-code-pro
|
||||||
|
monaspace
|
||||||
|
|
||||||
|
# desktop fonts
|
||||||
|
corefonts # MS fonts
|
||||||
|
b612 # high legibility
|
||||||
|
material-icons
|
||||||
|
material-design-icons
|
||||||
|
roboto
|
||||||
|
work-sans
|
||||||
|
comic-neue
|
||||||
|
source-sans
|
||||||
|
inter
|
||||||
|
lato
|
||||||
|
lexend
|
||||||
|
jost
|
||||||
|
dejavu_fonts
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-cjk
|
||||||
|
|
||||||
|
# emojis
|
||||||
|
noto-fonts-color-emoji
|
||||||
|
twemoji-color-font
|
||||||
|
openmoji-color
|
||||||
|
openmoji-black
|
||||||
|
font-awesome
|
||||||
|
material-symbols
|
||||||
|
|
||||||
|
# defaults worth keeping
|
||||||
|
dejavu_fonts
|
||||||
|
freefont_ttf
|
||||||
|
gyre-fonts
|
||||||
|
liberation_ttf
|
||||||
|
unifont
|
||||||
|
|
||||||
|
# specific nerd fonts only
|
||||||
|
# (installing all nerd fonts is slow and takes gigabytes)
|
||||||
|
# see: <https://github.com/NixOS/nixpkgs/blob/master/pkgs/data/fonts/nerdfonts/shas.nix>
|
||||||
|
# for all available fonts
|
||||||
|
(nerdfonts.override {
|
||||||
|
fonts = [
|
||||||
|
"JetBrainsMono"
|
||||||
|
"Iosevka"
|
||||||
|
"NerdFontsSymbolsOnly"
|
||||||
|
"FiraCode"
|
||||||
|
"FiraMono"
|
||||||
|
"Hack"
|
||||||
|
"HeavyData"
|
||||||
|
"Gohu"
|
||||||
|
];
|
||||||
|
})
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
fontDir = {
|
environment.systemPackages = with pkgs; [
|
||||||
enable = true;
|
# Tool for searching and previewing installed fonts
|
||||||
decompressFonts = true;
|
font-manager
|
||||||
};
|
|
||||||
|
|
||||||
packages = with pkgs; [
|
|
||||||
# programming fonts
|
|
||||||
sarasa-gothic
|
|
||||||
source-code-pro
|
|
||||||
monaspace
|
|
||||||
|
|
||||||
# desktop fonts
|
|
||||||
corefonts # MS fonts
|
|
||||||
b612 # high legibility
|
|
||||||
material-icons
|
|
||||||
material-design-icons
|
|
||||||
roboto
|
|
||||||
work-sans
|
|
||||||
comic-neue
|
|
||||||
source-sans
|
|
||||||
inter
|
|
||||||
lato
|
|
||||||
lexend
|
|
||||||
jost
|
|
||||||
dejavu_fonts
|
|
||||||
noto-fonts
|
|
||||||
noto-fonts-cjk
|
|
||||||
|
|
||||||
# emojis
|
|
||||||
noto-fonts-color-emoji
|
|
||||||
twemoji-color-font
|
|
||||||
openmoji-color
|
|
||||||
openmoji-black
|
|
||||||
font-awesome
|
|
||||||
material-symbols
|
|
||||||
|
|
||||||
# defaults worth keeping
|
|
||||||
dejavu_fonts
|
|
||||||
freefont_ttf
|
|
||||||
gyre-fonts
|
|
||||||
liberation_ttf
|
|
||||||
unifont
|
|
||||||
|
|
||||||
# specific nerd fonts only
|
|
||||||
# (installing all nerd fonts is slow and takes gigabytes)
|
|
||||||
# see: <https://github.com/NixOS/nixpkgs/blob/master/pkgs/data/fonts/nerdfonts/shas.nix>
|
|
||||||
# for all available fonts
|
|
||||||
(nerdfonts.override {
|
|
||||||
fonts = [
|
|
||||||
"JetBrainsMono"
|
|
||||||
"Iosevka"
|
|
||||||
"NerdFontsSymbolsOnly"
|
|
||||||
"FiraCode"
|
|
||||||
"FiraMono"
|
|
||||||
"Hack"
|
|
||||||
"HeavyData"
|
|
||||||
"Gohu"
|
|
||||||
];
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
# Tool for searching and previewing installed fonts
|
|
||||||
font-manager
|
|
||||||
];
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +1,28 @@
|
||||||
{
|
{
|
||||||
programs = {
|
lib,
|
||||||
# allow non-root users to mount fuse filesystems with allow_other
|
config,
|
||||||
fuse.userAllowOther = true;
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
programs = {
|
||||||
|
# allow non-root users to mount fuse filesystems with allow_other
|
||||||
|
fuse.userAllowOther = true;
|
||||||
|
|
||||||
# show network usage
|
# show network usage
|
||||||
bandwhich.enable = true;
|
bandwhich.enable = true;
|
||||||
|
|
||||||
# network inspection utility
|
# network inspection utility
|
||||||
wireshark.enable = true;
|
wireshark.enable = true;
|
||||||
|
|
||||||
# gnome's keyring manager
|
# gnome's keyring manager
|
||||||
seahorse.enable = true;
|
seahorse.enable = true;
|
||||||
|
|
||||||
# registry for linux (thanks to Gnome)
|
# registry for linux (thanks to Gnome)
|
||||||
dconf.enable = true;
|
dconf.enable = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,17 +1,27 @@
|
||||||
{
|
{
|
||||||
# Screen locker which works across all virtual terminals
|
lib,
|
||||||
# Use `systemctl start physlock` to securely lock the screen
|
config,
|
||||||
services.physlock = {
|
...
|
||||||
enable = true;
|
}: let
|
||||||
lockMessage = "System is locked...";
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
# Screen locker which works across all virtual terminals
|
||||||
|
# Use `systemctl start physlock` to securely lock the screen
|
||||||
|
services.physlock = {
|
||||||
|
enable = true;
|
||||||
|
lockMessage = "System is locked...";
|
||||||
|
|
||||||
# I only use physlock manually in some circumstances
|
# I only use physlock manually in some circumstances
|
||||||
lockOn = {
|
lockOn = {
|
||||||
# Don't auto-lock the system with physlock on suspend, I prefer other (gui) lockers
|
# Don't auto-lock the system with physlock on suspend, I prefer other (gui) lockers
|
||||||
suspend = false;
|
suspend = false;
|
||||||
# Do use physlock on resuming from hibernation though, as this just restored RAM,
|
# Do use physlock on resuming from hibernation though, as this just restored RAM,
|
||||||
# potentially bypassing the login screen and even initial disk encryption password
|
# potentially bypassing the login screen and even initial disk encryption password
|
||||||
hibernate = true;
|
hibernate = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,10 @@
|
||||||
}: let
|
}: let
|
||||||
inherit (lib) mkIf;
|
inherit (lib) mkIf;
|
||||||
cfg = config.myOptions.home-manager.programs.games.steam;
|
cfg = config.myOptions.home-manager.programs.games.steam;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf ((builtins.elem deviceType acceptedTypes) && cfg.enable) {
|
||||||
programs.steam = {
|
programs.steam = {
|
||||||
enable = true;
|
enable = true;
|
||||||
remotePlay.openFirewall = false;
|
remotePlay.openFirewall = false;
|
||||||
|
|
|
@ -1,25 +1,36 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
# Unconditionally enable thunar file manager here as a relatively
|
lib,
|
||||||
# lightweight fallback option for my default file manager.
|
pkgs,
|
||||||
programs.thunar = {
|
config,
|
||||||
enable = true;
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
# Unconditionally enable thunar file manager here as a relatively
|
||||||
|
# lightweight fallback option for my default file manager.
|
||||||
|
programs.thunar = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
plugins = with pkgs.xfce; [
|
plugins = with pkgs.xfce; [
|
||||||
thunar-archive-plugin
|
thunar-archive-plugin
|
||||||
thunar-media-tags-plugin
|
thunar-media-tags-plugin
|
||||||
];
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment = {
|
||||||
|
systemPackages = with pkgs; [
|
||||||
|
# packages necessery for thunar thumbnails
|
||||||
|
xfce.tumbler
|
||||||
|
libgsf # odf files
|
||||||
|
ffmpegthumbnailer
|
||||||
|
ark # GUI archiver for thunar archive plugin
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# thumbnail support on thunar
|
||||||
|
services.tumbler.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
environment = {
|
|
||||||
systemPackages = with pkgs; [
|
|
||||||
# packages necessery for thunar thumbnails
|
|
||||||
xfce.tumbler
|
|
||||||
libgsf # odf files
|
|
||||||
ffmpegthumbnailer
|
|
||||||
ark # GUI archiver for thunar archive plugin
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# thumbnail support on thunar
|
|
||||||
services.tumbler.enable = true;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,10 @@
|
||||||
inherit (lib) mkIf;
|
inherit (lib) mkIf;
|
||||||
cfgUser = config.myOptions.system.username;
|
cfgUser = config.myOptions.system.username;
|
||||||
cfg = config.myOptions.home-manager.programs.applications.virtualbox;
|
cfg = config.myOptions.home-manager.programs.applications.virtualbox;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf ((builtins.elem deviceType acceptedTypes) && cfg.enable) {
|
||||||
virtualisation.virtualbox.host = {
|
virtualisation.virtualbox.host = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,10 @@
|
||||||
inherit (lib) mkIf;
|
inherit (lib) mkIf;
|
||||||
cfgUser = config.myOptions.system.username;
|
cfgUser = config.myOptions.system.username;
|
||||||
cfg = config.myOptions.home-manager.programs.applications.wireshark;
|
cfg = config.myOptions.home-manager.programs.applications.wireshark;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf ((builtins.elem deviceType acceptedTypes) && cfg.enable) {
|
||||||
programs.wireshark = {
|
programs.wireshark = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.wireshark;
|
package = pkgs.wireshark;
|
||||||
|
|
|
@ -1,49 +1,57 @@
|
||||||
{
|
{
|
||||||
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}: {
|
}: let
|
||||||
environment.systemPackages = [pkgs.appimage-run];
|
inherit (lib) mkIf;
|
||||||
|
|
||||||
# run appimages with appimage-run
|
deviceType = config.myOptions.device.roles.type;
|
||||||
boot.binfmt.registrations = lib.genAttrs ["appimage" "AppImage"] (_: {
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
wrapInterpreterInShell = false;
|
in {
|
||||||
interpreter = "${pkgs.appimage-run}/bin/appimage-run";
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
recognitionType = "magic";
|
environment.systemPackages = [pkgs.appimage-run];
|
||||||
offset = 0;
|
|
||||||
mask = "\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\xff\\xff\\xff";
|
|
||||||
magicOrExtension = "\\x7fELF....AI\\x02";
|
|
||||||
});
|
|
||||||
|
|
||||||
# run unpatched linux binaries with nix-ld
|
# run appimages with appimage-run
|
||||||
programs.nix-ld = {
|
boot.binfmt.registrations = lib.genAttrs ["appimage" "AppImage"] (_: {
|
||||||
enable = true;
|
wrapInterpreterInShell = false;
|
||||||
libraries = with pkgs; [
|
interpreter = "${pkgs.appimage-run}/bin/appimage-run";
|
||||||
stdenv.cc.cc
|
recognitionType = "magic";
|
||||||
openssl
|
offset = 0;
|
||||||
curl
|
mask = "\\xff\\xff\\xff\\xff\\x00\\x00\\x00\\x00\\xff\\xff\\xff";
|
||||||
glib
|
magicOrExtension = "\\x7fELF....AI\\x02";
|
||||||
util-linux
|
});
|
||||||
glibc
|
|
||||||
icu
|
# run unpatched linux binaries with nix-ld
|
||||||
libunwind
|
programs.nix-ld = {
|
||||||
libuuid
|
enable = true;
|
||||||
zlib
|
libraries = with pkgs; [
|
||||||
libsecret
|
stdenv.cc.cc
|
||||||
# graphical
|
openssl
|
||||||
freetype
|
curl
|
||||||
libglvnd
|
glib
|
||||||
libnotify
|
util-linux
|
||||||
SDL2
|
glibc
|
||||||
vulkan-loader
|
icu
|
||||||
gdk-pixbuf
|
libunwind
|
||||||
xorg.libX11
|
libuuid
|
||||||
];
|
zlib
|
||||||
|
libsecret
|
||||||
|
# graphical
|
||||||
|
freetype
|
||||||
|
libglvnd
|
||||||
|
libnotify
|
||||||
|
SDL2
|
||||||
|
vulkan-loader
|
||||||
|
gdk-pixbuf
|
||||||
|
xorg.libX11
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# Some pre-compiled binaries hard-code ssl cert file to /etc/ssl/cert.pem
|
||||||
|
# instead of what NixOS uses (/etc/ssl/certs/ca-certificates.crt). Make a
|
||||||
|
# symlink there for compatibility.
|
||||||
|
# - For example the rye installed python binaries look there
|
||||||
|
environment.etc."ssl/cert.pem".source = "/etc/ssl/certs/ca-certificates.crt";
|
||||||
};
|
};
|
||||||
|
|
||||||
# Some pre-compiled binaries hard-code ssl cert file to /etc/ssl/cert.pem
|
|
||||||
# instead of what NixOS uses (/etc/ssl/certs/ca-certificates.crt). Make a
|
|
||||||
# symlink there for compatibility.
|
|
||||||
# - For example the rye installed python binaries look there
|
|
||||||
environment.etc."ssl/cert.pem".source = "/etc/ssl/certs/ca-certificates.crt";
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,5 @@
|
||||||
./misc.nix
|
./misc.nix
|
||||||
./logind.nix
|
./logind.nix
|
||||||
./gnome-keyring.nix
|
./gnome-keyring.nix
|
||||||
./flatpak.nix
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,33 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
# https://dataswamp.org/~solene/2022-09-28-earlyoom.html
|
pkgs,
|
||||||
# avoid the linux kernel locking itself when we're putting too much strain on the memory
|
lib,
|
||||||
# this helps avoid having to shut down forcefully when we OOM
|
config,
|
||||||
services.earlyoom = {
|
...
|
||||||
enable = true;
|
}: let
|
||||||
enableNotifications = true; # annoying, but we want to know what's killed
|
inherit (lib) mkIf;
|
||||||
freeSwapThreshold = 2;
|
deviceType = config.myOptions.device.roles.type;
|
||||||
freeMemThreshold = 2;
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
extraArgs = [
|
in {
|
||||||
"-g" # kill all processes within a process group
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
"--avoid 'Hyprland|soffice|soffice.bin|firefox|thunderbird)$'" # things we want to not kill
|
# https://dataswamp.org/~solene/2022-09-28-earlyoom.html
|
||||||
"--prefer '^(electron|.*.exe)$'" # I wish we could kill electron permanently
|
# avoid the linux kernel locking itself when we're putting too much strain on the memory
|
||||||
];
|
# this helps avoid having to shut down forcefully when we OOM
|
||||||
|
services.earlyoom = {
|
||||||
|
enable = true;
|
||||||
|
enableNotifications = true; # annoying, but we want to know what's killed
|
||||||
|
freeSwapThreshold = 2;
|
||||||
|
freeMemThreshold = 2;
|
||||||
|
extraArgs = [
|
||||||
|
"-g" # kill all processes within a process group
|
||||||
|
"--avoid 'Hyprland|soffice|soffice.bin|firefox|thunderbird)$'" # things we want to not kill
|
||||||
|
"--prefer '^(electron|.*.exe)$'" # I wish we could kill electron permanently
|
||||||
|
];
|
||||||
|
|
||||||
# we should ideally write the logs into a designated log file; or even better, to the journal
|
# we should ideally write the logs into a designated log file; or even better, to the journal
|
||||||
# for now we can hope this echo sends the log to somewhere we can observe later
|
# for now we can hope this echo sends the log to somewhere we can observe later
|
||||||
killHook = pkgs.writeShellScript "earlyoom-kill-hook" ''
|
killHook = pkgs.writeShellScript "earlyoom-kill-hook" ''
|
||||||
echo "Process $EARLYOOM_NAME ($EARLYOOM_PID) was killed"
|
echo "Process $EARLYOOM_NAME ($EARLYOOM_PID) was killed"
|
||||||
'';
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
{
|
|
||||||
services.flatpak.enable = true;
|
|
||||||
}
|
|
|
@ -1,14 +1,25 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
services = {
|
pkgs,
|
||||||
udev.packages = with pkgs; [gnome.gnome-settings-daemon];
|
lib,
|
||||||
gnome.gnome-keyring.enable = true;
|
config,
|
||||||
};
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
services = {
|
||||||
|
udev.packages = with pkgs; [gnome.gnome-settings-daemon];
|
||||||
|
gnome.gnome-keyring.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
# seahorse is an application for managing encryption keys
|
# seahorse is an application for managing encryption keys
|
||||||
# and passwords in the gnome keyring
|
# and passwords in the gnome keyring
|
||||||
programs.seahorse.enable = true;
|
programs.seahorse.enable = true;
|
||||||
|
|
||||||
xdg.portal.config.common = {
|
xdg.portal.config.common = {
|
||||||
"org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
|
"org.freedesktop.impl.portal.Secret" = ["gnome-keyring"];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,22 @@
|
||||||
{
|
{
|
||||||
# despite being under logind, this has nothing to do with login
|
lib,
|
||||||
# it's about power management
|
config,
|
||||||
services.logind = {
|
...
|
||||||
lidSwitch = "suspend";
|
}: let
|
||||||
lidSwitchExternalPower = "suspend";
|
inherit (lib) mkIf;
|
||||||
extraConfig = ''
|
deviceType = config.myOptions.device.roles.type;
|
||||||
HandlePowerKey=suspend
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
HibernateDelaySec=3600
|
in {
|
||||||
'';
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
# despite being under logind, this has nothing to do with login
|
||||||
|
# it's about power management
|
||||||
|
services.logind = {
|
||||||
|
lidSwitch = "suspend";
|
||||||
|
lidSwitchExternalPower = "suspend";
|
||||||
|
extraConfig = ''
|
||||||
|
HandlePowerKey=suspend
|
||||||
|
HibernateDelaySec=3600
|
||||||
|
'';
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,20 @@
|
||||||
{
|
{
|
||||||
services = {
|
config,
|
||||||
# enable GVfs - a userspace virtual filesystem
|
lib,
|
||||||
gvfs.enable = true;
|
...
|
||||||
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
|
||||||
# storage daemon required for udiskie auto-mount
|
deviceType = config.myOptions.device.roles.type;
|
||||||
udisks2.enable = true;
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
services = {
|
||||||
|
# enable GVfs - a userspace virtual filesystem
|
||||||
|
gvfs.enable = true;
|
||||||
|
|
||||||
|
# storage daemon required for udiskie auto-mount
|
||||||
|
udisks2.enable = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,20 @@
|
||||||
{config, ...}: {
|
{
|
||||||
services = {
|
lib,
|
||||||
# enable GVfs, a userspace virtual filesystem
|
config,
|
||||||
# (allows viewing ftp,sftp,... directly from the file manager)
|
...
|
||||||
gvfs.enable = true;
|
}: let
|
||||||
|
inherit (lib) mkIf;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
in {
|
||||||
|
config = mkIf (builtins.elem deviceType acceptedTypes) {
|
||||||
|
services = {
|
||||||
|
# enable GVfs, a userspace virtual filesystem
|
||||||
|
# (allows viewing ftp,sftp,... directly from the file manager)
|
||||||
|
gvfs.enable = true;
|
||||||
|
|
||||||
# Storage daemon required for udiskie auto-mount
|
# Storage daemon required for udiskie auto-mount
|
||||||
udisks2.enable = !config.boot.isContainer;
|
udisks2.enable = !config.boot.isContainer;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,11 +5,13 @@
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
inherit (lib) mkIf optional;
|
inherit (lib) mkIf optional;
|
||||||
|
deviceType = config.myOptions.device.roles.type;
|
||||||
|
acceptedTypes = ["laptop" "desktop"];
|
||||||
|
|
||||||
cfg = config.myOptions.workstation.printing;
|
cfg = config.myOptions.workstation.printing;
|
||||||
cfgUser = config.myOptions.system.username;
|
cfgUser = config.myOptions.system.username;
|
||||||
in {
|
in {
|
||||||
config = mkIf cfg.enable {
|
config = mkIf (builtins.elem deviceType acceptedTypes && cfg.enable) {
|
||||||
# enable cups and add some drivers for common printers
|
# enable cups and add some drivers for common printers
|
||||||
services = {
|
services = {
|
||||||
printing = {
|
printing = {
|
||||||
|
|
Loading…
Reference in a new issue