{ pkgs, config, lib, ... }: let # generate shell command options for kmscon fom an attrset generateOptions = with builtins; ( opts: toString ( attrValues ( mapAttrs (name: value: "--${name} ${toString value}") opts ) ) ); # generate a hexadecimal number lookup table to get integers from them hexLookupTable = with lib; (listToAttrs (genList (i: { name = let r = toHexString i; in ( # pad with 0 in front if only 1 digit if (stringLength r) == 1 then "0${r}" else r ); value = toString i; }) 256)); # "parse" hex color strings and convert them to kmscon options hexToOpt = with lib; (color: concatStringsSep "," [ (getAttr (substring 1 2 (toUpper color)) hexLookupTable) (getAttr (substring 3 2 (toUpper color)) hexLookupTable) (getAttr (substring 5 2 (toUpper color)) hexLookupTable) ]); in { # TODO: global colorscheme vars for everything console.colors = [ "282828" "cc241d" "98971a" "d79921" "458588" "b16286" "689d6a" "a89984" "928374" "fb4934" "b8bb26" "fabd2f" "83a598" "d3869b" "8ec07c" "ebdbb2" ]; services.kmscon = { enable = true; fonts = [ { name = "FiraCode Nerd Font"; package = pkgs.nerdfonts.override {fonts = ["FiraCode"];}; } ]; extraConfig = "font-size=14"; # extraOptions = "--term xterm-256color"; extraOptions = generateOptions { xkb-layout = config.services.xserver.xkb.layout; xkb-variant = config.services.xserver.xkb.variant; palette = "custom"; palette-foreground = hexToOpt "#ebdbb2"; palette-background = hexToOpt "#282828"; palette-black = hexToOpt "#282828"; palette-red = hexToOpt "#cc241d"; palette-green = hexToOpt "#98971a"; palette-yellow = hexToOpt "#d79921"; palette-blue = hexToOpt "#458588"; palette-magenta = hexToOpt "#b16286"; palette-cyan = hexToOpt "#689d6a"; palette-light-grey = hexToOpt "#a89984"; palette-dark-grey = hexToOpt "#928374"; palette-light-red = hexToOpt "#fb4934"; palette-light-green = hexToOpt "#b8bb26"; palette-light-yellow = hexToOpt "#fabd2f"; palette-light-blue = hexToOpt "#83a598"; palette-light-magenta = hexToOpt "#d3869b"; palette-light-cyan = hexToOpt "#8ec07c"; palette-white = hexToOpt "#ebdbb2"; }; hwRender = true; }; }