nix-config/modules/desktop.nix
Donovan Glover d261262277
meta: Inline dwm config
Trying to override the values with callPackage here seemingly
didn't work, so inlining is necessary to use the color values from
`config`.
2024-08-29 20:12:23 -04:00

424 lines
12 KiB
Nix

{
nix-config,
pkgs,
config,
lib,
...
}:
let
inherit (lib.types) float int;
inherit (config.modules.system) username;
inherit (nix-config.packages.${pkgs.system}) aleo-fonts;
inherit (builtins) attrValues;
inherit (config.lib.stylix.colors.withHashtag) base00 base03 base05;
inherit (lib)
mkEnableOption
mkIf
mkMerge
mkOption
;
inherit (cfg)
bloat
container
opacity
fontSize
graphical
;
inherit (pkgs)
phinger-cursors
noto-fonts-cjk-sans
maple-mono
noto-fonts-emoji
;
stylix-background = pkgs.callPackage ../packages/stylix-background.nix {
color = config.lib.stylix.colors.base00;
};
cfg = config.modules.desktop;
in
{
imports = attrValues {
inherit (nix-config.inputs.stylix.nixosModules) stylix;
};
options.modules.desktop = {
opacity = mkOption {
type = float;
default = 0.95;
};
fontSize = mkOption {
type = int;
default = 11;
};
bloat = mkEnableOption "GUI applications";
container = mkEnableOption "disable some options for container performance";
graphical = mkEnableOption "xserver for graphical containers";
};
config = {
hardware.graphics.enable32Bit = true;
programs = {
hyprland.enable = mkIf (!container) true;
cdemu.enable = true;
thunar = {
enable = true;
plugins = with pkgs.xfce; [ thunar-volman ];
};
};
i18n.inputMethod = {
enable = true;
type = "fcitx5";
fcitx5 = {
addons = with pkgs; [ fcitx5-mozc ];
waylandFrontend = true;
};
};
services = {
udisks2 = {
enable = true;
mountOnMedia = true;
};
libinput = {
touchpad = {
naturalScrolling = true;
accelProfile = "flat";
accelSpeed = "0.75";
};
mouse = {
accelProfile = "flat";
};
};
xserver = mkIf (!container || graphical) {
enable = true;
excludePackages = with pkgs; [ xterm ];
displayManager.startx.enable = mkIf (!container) true;
windowManager.dwm = mkIf (!container) {
enable = true;
package = pkgs.dwm.override {
conf = # c
''
#include <X11/XF86keysym.h>
static const unsigned int borderpx = 0;
static const unsigned int snap = 32;
static const int user_bh = 10;
static const int showbar = 1;
static const int topbar = 1;
static const char *fonts[] = {
"Maple Mono:size=10",
"Noto Sans Mono CJK JP:size=10",
"Noto Color Emoji:size=10",
};
static const char *colors[][3] = {
[SchemeNorm] = { "${base03}", "${base00}", "${base03}" },
[SchemeSel] = { "${base05}", "${base00}", "${base05}" },
};
static const unsigned int baralpha = 243;
static const unsigned int alphas[][3] = {
[SchemeNorm] = { OPAQUE, baralpha, baralpha },
[SchemeSel] = { OPAQUE, baralpha, baralpha },
};
static const char *tags[] = { "", "", "" };
static const Rule rules[] = {
{ "librewolf", NULL, NULL, 0, 1, -1 },
};
static const float mfact = 0.55;
static const int nmaster = 1;
static const int resizehints = 1;
static const int lockfullscreen = 1;
static const Layout layouts[] = {
{ "[]=", tile },
};
#define MODKEY Mod4Mask
static char dmenumon[2] = "0";
static const char *dmenucmd[] = { "rofi", "-show", "drun", NULL };
static const char *quitcmd[] = { "kill", "xinit", NULL };
static const char *termcmd[] = { "kitty", NULL };
static const char *brighter[] = { "brightnessctl", "set", "5%+", NULL };
static const char *dimmer[] = { "brightnessctl", "set", "5%-", NULL };
static const char *up_vol[] = { "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", "5%+", NULL };
static const char *down_vol[] = { "wpctl", "set-volume", "@DEFAULT_AUDIO_SINK@", "5%-", NULL };
static const char *mute_vol[] = { "wpctl", "set-mute", "@DEFAULT_AUDIO_SINK@", "toggle", NULL };
static const Key keys[] = {
{ 0, XF86XK_AudioMute, spawn, {.v = mute_vol } },
{ 0, XF86XK_AudioLowerVolume, spawn, {.v = down_vol } },
{ 0, XF86XK_AudioRaiseVolume, spawn, {.v = up_vol } },
{ 0, XF86XK_MonBrightnessDown, spawn, {.v = dimmer } },
{ 0, XF86XK_MonBrightnessUp, spawn, {.v = brighter } },
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
{ MODKEY, XK_o, togglebar, {0} },
{ MODKEY, XK_f, togglefullscr, {0} },
{ MODKEY, XK_v, togglefloating, {0} },
{ MODKEY, XK_j, focusstack, {.i = +1 } },
{ MODKEY, XK_k, focusstack, {.i = -1 } },
{ MODKEY, XK_Return, zoom, {0} },
{ MODKEY, XK_comma, focusmon, {.i = -1 } },
{ MODKEY, XK_period, focusmon, {.i = +1 } },
{ MODKEY, XK_1, viewprev, {0} },
{ MODKEY, XK_2, viewnext, {0} },
{ MODKEY|ShiftMask, XK_1, tagtoprev, {0} },
{ MODKEY|ShiftMask, XK_1, reorganizetags, {0} },
{ MODKEY|ShiftMask, XK_2, tagtonext, {0} },
{ MODKEY|ShiftMask, XK_2, reorganizetags, {0} },
{ MODKEY|ShiftMask, XK_h, setmfact, {.f = -0.05} },
{ MODKEY|ShiftMask, XK_l, setmfact, {.f = +0.05} },
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
{ MODKEY|ShiftMask, XK_q, killclient, {0} },
{ MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } },
{ MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } },
{ MODKEY|Mod1Mask, XK_Delete, spawn, {.v = quitcmd } },
};
static const Button buttons[] = {
{ ClkTagBar, 0, Button1, view, {0} },
{ ClkClientWin, MODKEY, Button1, movemouse, {0} },
{ ClkClientWin, MODKEY, Button3, resizemouse, {0} },
};
'';
patches = with pkgs; [
../assets/dwm-actualfullscreen.patch
../assets/dwm-adjacenttag.patch
../assets/dwm-remove-layout-indicator.patch
../assets/dwm-remove-floating-indicator.patch
../assets/dwm-savefloats-alwayscenter.patch
(fetchpatch {
url = "https://dwm.suckless.org/patches/hide_vacant_tags/dwm-hide_vacant_tags-6.4.diff";
hash = "sha256-GIbRW0Inwbp99rsKLfIDGvPwZ3pqihROMBp5vFlHx5Q=";
})
(fetchpatch {
url = "https://dwm.suckless.org/patches/alpha/dwm-alpha-20230401-348f655.diff";
hash = "sha256-ZhuqyDpY+nQQgrjniQ9DNheUgE9o/MUXKaJYRU3Uyl4=";
})
(fetchpatch {
url = "https://dwm.suckless.org/patches/reorganizetags/dwm-reorganizetags-6.2.diff";
hash = "sha256-Fj+cfw+5d7i6UrakMbebhZsfmu8ZfooduQA08STovK4=";
})
(fetchpatch {
url = "https://dwm.suckless.org/patches/bar_height/dwm-bar-height-spacing-6.3.diff";
hash = "sha256-usMIMmloUG4NrX10AVbgr8kFs9ZG6Krn1NxXTVcLq70=";
})
(fetchpatch {
url = "https://raw.githubusercontent.com/bakkeby/patches/c5eae9d/dwm/dwm-desktop_icons-6.5.diff";
hash = "sha256-oIgeph9pmIWKBepnQhc+aNWU7ZHxsJbhJr5LVNTtuHc=";
})
];
};
};
};
pipewire = {
enable = true;
alsa = {
enable = true;
support32Bit = true;
};
pulse.enable = true;
};
greetd = mkIf (!container) {
enable = true;
restart = false;
settings = {
default_session = {
command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --cmd Hyprland --time-format '%F %R'";
user = "greeter";
};
initial_session = {
command = "${pkgs.hyprland}/bin/Hyprland";
user = username;
};
};
};
tumbler.enable = true;
gvfs.enable = true;
gnome.gnome-keyring.enable = true;
upower.enable = true;
};
environment.systemPackages = mkMerge [
(mkIf bloat (
with pkgs;
[
mullvad-browser
spek
audacity
gimp
libreoffice
element-desktop
signal-desktop
qbittorrent
popsicle
satty
srb2
ringracers
jamesdsp
texliveFull
]
))
(mkIf (pkgs.system == "x86_64-linux") (
with nix-config.inputs.sakaya.packages.${pkgs.system}; [ sakaya ]
))
(with pkgs; [
anki
pulseaudio
grim
wl-clipboard-rs
])
];
fonts = {
enableDefaultPackages = false;
packages =
[
noto-fonts-cjk-sans
noto-fonts-emoji
maple-mono
aleo-fonts
]
++ (with pkgs; [
noto-fonts
noto-fonts-cjk-serif
font-awesome
(nerdfonts.override { fonts = [ "Noto" ]; })
kanji-stroke-order-font
liberation_ttf
]);
fontconfig = {
defaultFonts = {
serif = [
"Noto Serif CJK JP"
"Noto Serif"
];
sansSerif = [
"Noto Sans CJK JP"
"Noto Sans"
];
monospace = [
"Noto Sans Mono CJK JP"
"Noto Sans Mono"
];
};
allowBitmaps = false;
};
};
stylix = {
enable = true;
image = "${stylix-background}/wallpaper.png";
polarity = "dark";
base16Scheme = {
system = "base16";
name = "selenized-black";
author = "Jan Warchol (https://github.com/jan-warchol/selenized) / adapted to base16 by ali";
variant = "dark";
palette = {
base00 = "181818";
base01 = "252525";
base02 = "3b3b3b";
base03 = "777777";
base04 = "777777";
base05 = "b9b9b9";
base06 = "dedede";
base07 = "dedede";
base08 = "ed4a46";
base09 = "e67f43";
base0A = "dbb32d";
base0B = "70b433";
base0C = "3fc5b7";
base0D = "368aeb";
base0E = "a580e2";
base0F = "eb6eb7";
};
};
opacity = {
terminal = opacity;
popups = opacity;
};
cursor = {
package = phinger-cursors;
name = "phinger-cursors";
size = 24;
};
fonts = {
serif = {
package = aleo-fonts;
name = "Aleo";
};
sansSerif = {
package = noto-fonts-cjk-sans;
name = "Noto Sans CJK JP";
};
monospace = {
package = maple-mono;
name = "Maple Mono";
};
emoji = {
package = noto-fonts-emoji;
name = "Noto Color Emoji";
};
sizes = {
applications = fontSize;
desktop = fontSize;
popups = fontSize;
terminal = fontSize;
};
};
};
};
}