nixos: remove forEachUser helper

This commit is contained in:
2026-02-03 20:30:39 -08:00
parent 8620cc6287
commit ebfbca4827
28 changed files with 421 additions and 289 deletions

View File

@@ -1,4 +1,4 @@
{ config, pkgs, forEachUser, makeEnable, realUsers, ... }: { config, pkgs, makeEnable, realUsers, ... }:
makeEnable config "myModules.base" true { makeEnable config "myModules.base" true {
nixpkgs.config.permittedInsecurePackages = [ nixpkgs.config.permittedInsecurePackages = [
"electron-12.2.3" "electron-12.2.3"

View File

@@ -97,9 +97,7 @@
specialArgs = rec { specialArgs = rec {
inherit inputs machineNames; inherit inputs machineNames;
makeEnable = (import ../make-enable.nix) nixpkgs.lib; makeEnable = (import ../make-enable.nix) nixpkgs.lib;
mapValueToKeys = keys: value: builtins.listToAttrs (map (name: { inherit name value; }) keys);
realUsers = [ "root" "imalison" "kat" "dean" "alex" "ben"]; realUsers = [ "root" "imalison" "kat" "dean" "alex" "ben"];
forEachUser = mapValueToKeys realUsers;
} // specialArgs // (import ../keys.nix); } // specialArgs // (import ../keys.nix);
}); });
in in

View File

@@ -1,4 +1,4 @@
{ config, lib, forEachUser, ... }: { config, lib, ... }:
{ {
imports = [ imports = [
./android.nix ./android.nix

View File

@@ -4,6 +4,7 @@ makeEnable config "myModules.desktop" true {
imports = [ imports = [
./fonts.nix ./fonts.nix
./hyprland.nix ./hyprland.nix
./keyd.nix
]; ];
services.xserver = { services.xserver = {
@@ -47,6 +48,7 @@ makeEnable config "myModules.desktop" true {
# XOrg # XOrg
autorandr autorandr
keyd
wmctrl wmctrl
xclip xclip
xdotool xdotool

View File

@@ -1,4 +1,4 @@
{ pkgs, config, makeEnable, forEachUser, ... }: { pkgs, config, makeEnable, ... }:
makeEnable config "myModules.electron" false { makeEnable config "myModules.electron" false {
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
element-desktop element-desktop
@@ -8,21 +8,23 @@ makeEnable config "myModules.electron" false {
# keybase-gui # keybase-gui
zoom-us zoom-us
]; ];
home-manager.users = forEachUser (if pkgs.stdenv.hostPlatform.system == "x86_64-linux" then { home-manager.sharedModules = [
# systemd.user.services.bitwarden = { (if pkgs.stdenv.hostPlatform.system == "x86_64-linux" then {
# Unit = { # systemd.user.services.bitwarden = {
# Description = "Bitwarden"; # Unit = {
# After = [ "graphical-session-pre.target" "tray.target" ]; # Description = "Bitwarden";
# PartOf = [ "graphical-session.target" ]; # After = [ "graphical-session-pre.target" "tray.target" ];
# }; # PartOf = [ "graphical-session.target" ];
# };
# Install = { WantedBy = [ "graphical-session.target" ]; }; # Install = { WantedBy = [ "graphical-session.target" ]; };
# Service = { # Service = {
# ExecStart = "${pkgs.bitwarden}/bin/bitwarden"; # ExecStart = "${pkgs.bitwarden}/bin/bitwarden";
# Restart = "always"; # Restart = "always";
# RestartSec = 3; # RestartSec = 3;
# }; # };
# }; # };
} else {}); } else {})
];
} }

View File

@@ -342,8 +342,6 @@
(_: value: (builtins.elem "isNormalUser" (builtins.attrNames value)) && value.isNormalUser) (_: value: (builtins.elem "isNormalUser" (builtins.attrNames value)) && value.isNormalUser)
usersInfo.users.users) usersInfo.users.users)
); );
mapAllKeysToValue = keys: value: builtins.listToAttrs (map (name: {inherit name value;}) keys);
forEachUser = mapAllKeysToValue realUsers;
} }
// specialArgs; // specialArgs;
}; };

View File

@@ -60,22 +60,6 @@
''; '';
}; };
systemd.user.services.setxkbmap = {
Unit = {
Description = "Set up keyboard in X";
After = [ "graphical-session-pre.target" ];
PartOf = [ "graphical-session.target" ];
};
Install = { WantedBy = [ "graphical-session.target" ]; };
Service = {
Type = "oneshot";
RemainAfterExit = true;
ExecStart = "/usr/bin/env load_xkb_map";
};
};
gtk = { gtk = {
enable = true; enable = true;
iconTheme = { iconTheme = {

View File

@@ -6,6 +6,119 @@ makeEnable config "myModules.hyprland" true {
package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland; package = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.hyprland;
}; };
home-manager.sharedModules = [
{
# Wire the Hyprland config from dotfiles into ~/.config/hypr
xdg.configFile."hypr" = {
source = ../dotfiles/config/hypr;
recursive = true;
force = true;
};
programs.waybar = {
enable = true;
systemd.enable = true;
settings = [
{
layer = "top";
position = "top";
height = 30;
"modules-left" = [ "hyprland/workspaces" ];
"modules-center" = [ "hyprland/window" ];
"modules-right" = [ "tray" "clock" ];
"hyprland/workspaces" = {
format = "{id}:{windows}";
"format-window-separator" = " ";
"window-rewrite-default" = "";
"window-rewrite" = {
"class<firefox>" = "";
"class<google-chrome|chromium>" = "";
"class<code|codium>" = "";
"class<Alacritty|kitty|foot>" = "";
"class<Slack>" = "";
"class<Spotify>" = "";
"class<Element|discord>" = "";
"class<pavucontrol>" = "";
"class<transmission-gtk>" = "";
};
"persistent-workspaces" = { "*" = 10; };
"all-outputs" = true;
"on-click" = "activate";
};
"hyprland/window" = {
format = "{class}: {title}";
"separate-outputs" = true;
};
tray = {
spacing = 8;
};
clock = {
format = "{:%a %b %d %I:%M:%S %p}";
};
}
];
style = ''
* {
border: none;
border-radius: 0;
font-family: "Roboto", "JetBrainsMono Nerd Font";
font-size: 11pt;
min-height: 0;
}
window#waybar {
background: rgba(24, 24, 24, 0.92);
color: #e6e6e6;
}
#workspaces {
margin-left: 6px;
}
#workspaces button {
padding: 0 8px;
margin: 4px 4px;
border-radius: 6px;
background: transparent;
color: #bfbfbf;
}
#workspaces button.active {
background: #e0b45a;
color: #1c1c1c;
}
#workspaces button.visible {
background: #3a3a3a;
color: #e6e6e6;
}
#workspaces button.urgent {
background: #e06060;
color: #1c1c1c;
}
#workspaces button.empty {
color: #777777;
}
#window {
padding: 0 10px;
}
#tray,
#clock {
padding: 0 10px;
}
'';
};
}
];
# Hyprland-specific packages # Hyprland-specific packages
environment.systemPackages = with pkgs; [ environment.systemPackages = with pkgs; [
# Hyprland utilities # Hyprland utilities

View File

@@ -1,5 +1,5 @@
{ forEachUser, ... }: { { ... }: {
home-manager.users = forEachUser { home-manager.sharedModules = [
services.kbfs.enable = true; { services.kbfs.enable = true; }
}; ];
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, inputs, forEachUser, ... }: { lib, pkgs, inputs, ... }:
{ {
imports = [ imports = [
@@ -71,9 +71,11 @@
powerManagement.cpuFreqGovernor = lib.mkDefault "performance"; powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.05"; {
}; home.stateVersion = "23.05";
}
];
system.stateVersion = "23.05"; system.stateVersion = "23.05";
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, config, inputs, forEachUser, ... }: { lib, pkgs, config, inputs, ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -18,9 +18,11 @@
wsl.defaultUser = "ben"; wsl.defaultUser = "ben";
system.stateVersion = "22.05"; system.stateVersion = "22.05";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "22.05"; {
}; home.stateVersion = "22.05";
}
];
users.users.ben = { users.users.ben = {
extraGroups = [ extraGroups = [

View File

@@ -1,4 +1,4 @@
{ pkgs, lib, forEachUser, config, ... }: { pkgs, lib, config, ... }:
let biskcomp-nginx-hostnames = "192.168.1.44 railbird.ai 1896Folsom.duckdns.org biskcomp.local 0.0.0.0 67.162.131.71"; let biskcomp-nginx-hostnames = "192.168.1.44 railbird.ai 1896Folsom.duckdns.org biskcomp.local 0.0.0.0 67.162.131.71";
in in
{ {
@@ -157,7 +157,9 @@ in
networking.hostName = "biskcomp"; networking.hostName = "biskcomp";
system.stateVersion = "23.11"; system.stateVersion = "23.11";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.11"; {
}; home.stateVersion = "23.11";
}
];
} }

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, forEachUser, ... }: { config, lib, pkgs, ... }:
{ {
imports = [ imports = [
@@ -53,9 +53,11 @@
networking.hostName = "david-blade"; networking.hostName = "david-blade";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "24.05"; {
}; home.stateVersion = "24.05";
}
];
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
system.stateVersion = "24.05"; system.stateVersion = "24.05";

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, config, inputs, forEachUser, ... }: { lib, pkgs, config, inputs, ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -15,7 +15,9 @@
wsl.defaultUser = "dean"; wsl.defaultUser = "dean";
system.stateVersion = "22.05"; system.stateVersion = "22.05";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "22.05"; {
}; home.stateVersion = "22.05";
}
];
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, config, inputs, forEachUser, ... }: { lib, pkgs, config, inputs, ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -12,7 +12,9 @@
wsl.defaultUser = "kat"; wsl.defaultUser = "kat";
system.stateVersion = "22.05"; system.stateVersion = "22.05";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "22.05"; {
}; home.stateVersion = "22.05";
}
];
} }

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, forEachUser, ... }: { config, lib, pkgs, ... }:
{ {
imports = [ imports = [
@@ -55,7 +55,9 @@
system.stateVersion = "23.05"; system.stateVersion = "23.05";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.05"; {
}; home.stateVersion = "23.05";
}
];
} }

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, forEachUser, ... }: { config, lib, pkgs, ... }:
{ {
imports = [ imports = [
@@ -106,9 +106,11 @@
{ device = "/dev/disk/by-uuid/598e9aa1-4940-4410-a2fa-3dfd8b7d2c0d"; } { device = "/dev/disk/by-uuid/598e9aa1-4940-4410-a2fa-3dfd8b7d2c0d"; }
]; ];
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.11"; {
}; home.stateVersion = "23.11";
}
];
networking.hostName = "jimi-hendnix"; networking.hostName = "jimi-hendnix";

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, forEachUser, ... }: { config, lib, pkgs, ... }:
{ {
imports = [ imports = [
@@ -201,7 +201,9 @@
system.stateVersion = "23.05"; system.stateVersion = "23.05";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.05"; {
}; home.stateVersion = "23.05";
}
];
} }

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, inputs, forEachUser, ... }: { config, lib, pkgs, inputs, ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -62,9 +62,11 @@
services.xrdp.defaultWindowManager = "startplasma-x11"; services.xrdp.defaultWindowManager = "startplasma-x11";
services.xrdp.openFirewall = true; services.xrdp.openFirewall = true;
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.11"; {
}; home.stateVersion = "23.11";
}
];
system.stateVersion = "23.11"; system.stateVersion = "23.11";
} }

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, forEachUser, inputs, orgAgendaApiContainer ? null, orgAgendaApiImageName ? "org-agenda-api", ... }: { config, lib, pkgs, inputs, orgAgendaApiContainer ? null, orgAgendaApiImageName ? "org-agenda-api", ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -86,9 +86,11 @@
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.11"; {
}; home.stateVersion = "23.11";
}
];
system.stateVersion = "23.11"; system.stateVersion = "23.11";
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, forEachUser, ... }: { lib, pkgs, ... }:
{ {
imports = [ imports = [
@@ -93,9 +93,11 @@
# services.xrdp.openFirewall = true; # services.xrdp.openFirewall = true;
system.stateVersion = "20.03"; system.stateVersion = "20.03";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "21.05"; {
}; home.stateVersion = "21.05";
}
];
# users.extraUsers.dean.home = "/shared/dean"; # users.extraUsers.dean.home = "/shared/dean";
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, config, inputs, forEachUser, ... }: { lib, pkgs, config, inputs, ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -18,7 +18,9 @@
wsl.defaultUser = "imalison"; wsl.defaultUser = "imalison";
system.stateVersion = "22.05"; system.stateVersion = "22.05";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "22.05"; {
}; home.stateVersion = "22.05";
}
];
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, forEachUser, ... }: { lib, pkgs, ... }:
{ {
imports = [ imports = [
@@ -83,9 +83,11 @@
# services.xrdp.openFirewall = true; # services.xrdp.openFirewall = true;
system.stateVersion = "20.03"; system.stateVersion = "20.03";
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "21.05"; {
}; home.stateVersion = "21.05";
}
];
# users.extraUsers.dean.home = "/shared/dean"; # users.extraUsers.dean.home = "/shared/dean";
} }

View File

@@ -1,4 +1,4 @@
{ lib, pkgs, config, inputs, forEachUser, ... }: { lib, pkgs, config, inputs, ... }:
{ {
imports = [ imports = [
../configuration.nix ../configuration.nix
@@ -11,9 +11,11 @@
wsl.defaultUser = "imalison"; wsl.defaultUser = "imalison";
system.stateVersion = "23.11"; # Did you read the comment? system.stateVersion = "23.11"; # Did you read the comment?
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.11"; {
}; home.stateVersion = "23.11";
}
];
programs.gnupg = { programs.gnupg = {
agent = { agent = {

View File

@@ -1,4 +1,4 @@
{ config, lib, pkgs, inputs, forEachUser, ... }: { config, lib, pkgs, inputs, ... }:
{ {
imports = [ imports = [
@@ -83,9 +83,11 @@
powerManagement.cpuFreqGovernor = lib.mkDefault "performance"; powerManagement.cpuFreqGovernor = lib.mkDefault "performance";
hardware.cpu.intel.updateMicrocode = lib.mkDefault true; hardware.cpu.intel.updateMicrocode = lib.mkDefault true;
home-manager.users = forEachUser { home-manager.sharedModules = [
home.stateVersion = "23.05"; {
}; home.stateVersion = "23.05";
}
];
system.stateVersion = "23.05"; system.stateVersion = "23.05";
} }

View File

@@ -1,4 +1,4 @@
{ inputs, specialArgs, config, lib, ... }: { inputs, specialArgs, config, lib, realUsers, ... }:
{ {
imports = [ imports = [
inputs.home-manager.nixosModules.home-manager inputs.home-manager.nixosModules.home-manager
@@ -11,6 +11,7 @@
}; };
}; };
config = { config = {
home-manager.users = lib.genAttrs realUsers (_: {});
home-manager.extraSpecialArgs = { home-manager.extraSpecialArgs = {
nixos = { nixos = {
inherit specialArgs config; inherit specialArgs config;

View File

@@ -1,7 +1,7 @@
{ inputs, config, makeEnable, forEachUser, ... }: { inputs, config, makeEnable, ... }:
makeEnable config "myModules.vscode" true { makeEnable config "myModules.vscode" true {
home-manager.users = forEachUser { home-manager.sharedModules = [
imports = [inputs.vscode-server.homeModules.default]; inputs.vscode-server.homeModules.default
services.vscode-server.enable = true; { services.vscode-server.enable = true; }
}; ];
} }

View File

@@ -1,4 +1,4 @@
{ config, pkgs, inputs, forEachUser, makeEnable, ... }: { config, pkgs, inputs, makeEnable, ... }:
makeEnable config "myModules.xmonad" true { makeEnable config "myModules.xmonad" true {
nixpkgs.overlays = with inputs; [ nixpkgs.overlays = with inputs; [
xmonad.overlay xmonad.overlay
@@ -34,190 +34,191 @@ makeEnable config "myModules.xmonad" true {
inputs.imalison-taffybar.defaultPackage."${pkgs.stdenv.hostPlatform.system}" inputs.imalison-taffybar.defaultPackage."${pkgs.stdenv.hostPlatform.system}"
]; ];
home-manager.users = forEachUser { home-manager.sharedModules = [
imports = [ ./dunst.nix ]; {
imports = [ ./dunst.nix ];
services.blueman-applet = { services.blueman-applet = {
enable = true; enable = true;
};
services.taffybar = {
enable = true;
package = inputs.imalison-taffybar.defaultPackage."${pkgs.stdenv.hostPlatform.system}";
};
services.kdeconnect = {
enable = true;
indicator = true;
};
services.network-manager-applet.enable = true;
# Disable the XDG autostart for nm-applet since we're managing it via systemd.
# The XDG autostart races with the systemd service and doesn't use --indicator.
xdg.configFile."autostart/nm-applet.desktop".text = ''
[Desktop Entry]
Hidden=true
'';
services.udiskie = {
enable = true;
tray = "always";
};
services.status-notifier-watcher = {
enable = true;
flags = ["--log-level" "DEBUG"];
};
services.autorandr.enable = true;
services.random-background = {
enable = true;
display = "fill";
interval = "1h";
imageDirectory = "/var/lib/syncthing/sync/Wallpaper/";
};
services.xsettingsd.enable = true;
services.pasystray.enable = true;
# services.parcellite = {
# enable = true;
# package = pkgs.clipit;
# };
services.flameshot = {
enable = true;
};
# Completely disable home-manager's picom - we manage everything ourselves
# to work around the libconfig list vs array syntax issue for animations
services.picom.enable = false;
# Our own picom systemd service
systemd.user.services.picom = {
Unit = {
Description = "Picom X11 compositor";
After = [ "graphical-session.target" ];
PartOf = [ "graphical-session.target" ];
}; };
Service = {
# Debug logging to file for monitoring services.taffybar = {
ExecStart = "${pkgs.picom}/bin/picom --config %h/.config/picom/picom.conf --log-level=debug --log-file=%h/.local/share/picom/debug.log"; enable = true;
Restart = "always"; package = inputs.imalison-taffybar.defaultPackage."${pkgs.stdenv.hostPlatform.system}";
RestartSec = 3;
}; };
Install = {
WantedBy = [ "graphical-session.target" ]; services.kdeconnect = {
enable = true;
indicator = true;
}; };
};
# Ensure log directory exists services.network-manager-applet.enable = true;
xdg.dataFile."picom/.keep".text = "";
# Write complete picom config directly to avoid home-manager's libconfig generator # Disable the XDG autostart for nm-applet since we're managing it via systemd.
# which incorrectly uses [] instead of () for the animations list # The XDG autostart races with the systemd service and doesn't use --indicator.
xdg.configFile."picom/picom.conf" = { xdg.configFile."autostart/nm-applet.desktop".text = ''
force = true; # Override home-manager's generated config [Desktop Entry]
text = '' Hidden=true
# Backend and basic settings '';
backend = "glx";
vsync = ${if config.myModules.xmonad.picom.vSync.enable then "true" else "false"};
# Spring physics animations (mainline picom with spring-physics branch) services.udiskie = {
# Syntax: spring(stiffness, dampening, mass) or spring(stiffness, dampening, mass, clamping) enable = true;
# Set clamping to false for bounce/overshoot effects tray = "always";
animations = ( };
# Window move/resize animation with spring physics
# "geometry" is alias for "size" + "position" triggers
# Suppress opacity changes so they don't interrupt geometry animations
{
triggers = ["geometry"];
suppressions = ["decrease-opacity", "increase-opacity"];
offset-x = {
curve = "spring(150, 18, 1.5, false)";
start = "window-x-before - window-x";
end = 0;
};
offset-y = {
curve = "spring(150, 18, 1.5, false)";
start = "window-y-before - window-y";
end = 0;
};
scale-x = {
curve = "spring(150, 18, 1.5, false)";
start = "window-width-before / window-width";
end = 1;
};
scale-y = {
curve = "spring(150, 18, 1.5, false)";
start = "window-height-before / window-height";
end = 1;
};
},
# Window open/show animation with spring physics
{
triggers = ["open", "show"];
# Opacity uses spring with clamping to prevent going above 1
opacity = {
curve = "spring(150, 18, 1.5, true)";
start = 0;
end = "window-raw-opacity";
};
# Scale uses spring with bounce for a nice "pop" effect
scale-x = {
curve = "spring(150, 18, 1.5, false)";
start = 0.85;
end = 1;
};
scale-y = {
curve = "spring(150, 18, 1.5, false)";
start = 0.85;
end = 1;
};
# Center the scaling effect
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
},
# Window close/hide animation with spring physics
{
triggers = ["close", "hide"];
opacity = {
curve = "spring(150, 18, 1.5, true)";
start = "window-raw-opacity";
end = 0;
};
scale-x = {
curve = "spring(150, 18, 1.5, true)";
start = 1;
end = 0.9;
};
scale-y = {
curve = "spring(150, 18, 1.5, true)";
start = 1;
end = 0.9;
};
# Center the scaling effect
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
}
);
# Fading services.status-notifier-watcher = {
fading = true; enable = true;
fade-in-step = 0.028; flags = ["--log-level" "DEBUG"];
fade-out-step = 0.028; };
# Corners services.autorandr.enable = true;
corner-radius = 10;
round-borders = 0; services.random-background = {
rounded-corners-exclude = [ enable = true;
"! name~='''", display = "fill";
"window_type = 'dock'", interval = "1h";
"window_type = 'desktop'", imageDirectory = "/var/lib/syncthing/sync/Wallpaper/";
"class_g ?= 'Dunst'" };
services.xsettingsd.enable = true;
services.pasystray.enable = true;
# services.parcellite = {
# enable = true;
# package = pkgs.clipit;
# };
services.flameshot = {
enable = true;
};
# Completely disable home-manager's picom - we manage everything ourselves
# to work around the libconfig list vs array syntax issue for animations
services.picom.enable = false;
# Our own picom systemd service
systemd.user.services.picom = {
Unit = {
Description = "Picom X11 compositor";
After = [ "graphical-session.target" ];
PartOf = [ "graphical-session.target" ];
};
Service = {
# Debug logging to file for monitoring
ExecStart = "${pkgs.picom}/bin/picom --config %h/.config/picom/picom.conf --log-level=debug --log-file=%h/.local/share/picom/debug.log";
Restart = "always";
RestartSec = 3;
};
Install = {
WantedBy = [ "graphical-session.target" ];
};
};
# Ensure log directory exists
xdg.dataFile."picom/.keep".text = "";
# Write complete picom config directly to avoid home-manager's libconfig generator
# which incorrectly uses [] instead of () for the animations list
xdg.configFile."picom/picom.conf" = {
force = true; # Override home-manager's generated config
text = ''
# Backend and basic settings
backend = "glx";
vsync = ${if config.myModules.xmonad.picom.vSync.enable then "true" else "false"};
# Spring physics animations (mainline picom with spring-physics branch)
# Syntax: spring(stiffness, dampening, mass) or spring(stiffness, dampening, mass, clamping)
# Set clamping to false for bounce/overshoot effects
animations = (
# Window move/resize animation with spring physics
# "geometry" is alias for "size" + "position" triggers
# Suppress opacity changes so they don't interrupt geometry animations
{
triggers = ["geometry"];
suppressions = ["decrease-opacity", "increase-opacity"];
offset-x = {
curve = "spring(150, 18, 1.5, false)";
start = "window-x-before - window-x";
end = 0;
};
offset-y = {
curve = "spring(150, 18, 1.5, false)";
start = "window-y-before - window-y";
end = 0;
};
scale-x = {
curve = "spring(150, 18, 1.5, false)";
start = "window-width-before / window-width";
end = 1;
};
scale-y = {
curve = "spring(150, 18, 1.5, false)";
start = "window-height-before / window-height";
end = 1;
};
},
# Window open/show animation with spring physics
{
triggers = ["open", "show"];
# Opacity uses spring with clamping to prevent going above 1
opacity = {
curve = "spring(150, 18, 1.5, true)";
start = 0;
end = "window-raw-opacity";
};
# Scale uses spring with bounce for a nice "pop" effect
scale-x = {
curve = "spring(150, 18, 1.5, false)";
start = 0.85;
end = 1;
};
scale-y = {
curve = "spring(150, 18, 1.5, false)";
start = 0.85;
end = 1;
};
# Center the scaling effect
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
},
# Window close/hide animation with spring physics
{
triggers = ["close", "hide"];
opacity = {
curve = "spring(150, 18, 1.5, true)";
start = "window-raw-opacity";
end = 0;
};
scale-x = {
curve = "spring(150, 18, 1.5, true)";
start = 1;
end = 0.9;
};
scale-y = {
curve = "spring(150, 18, 1.5, true)";
start = 1;
end = 0.9;
};
# Center the scaling effect
offset-x = "(1 - scale-x) / 2 * window-width";
offset-y = "(1 - scale-y) / 2 * window-height";
}
);
# Fading
fading = true;
fade-in-step = 0.028;
fade-out-step = 0.028;
# Corners
corner-radius = 10;
round-borders = 0;
rounded-corners-exclude = [
"! name~='''",
"window_type = 'dock'",
"window_type = 'desktop'",
"class_g ?= 'Dunst'"
]; ];
round-borders-exclude = [ round-borders-exclude = [
"! name~='''" "! name~='''"
@@ -260,5 +261,6 @@ makeEnable config "myModules.xmonad" true {
# RestartSec = 3; # RestartSec = 3;
# }; # };
# }; # };
}; }
];
} }