1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-01-24 21:42:51 -05:00
Files
DankMaterialShell/distro/nix/niri.nix
NikSne 7d761c4c9a feat(distro/nix/niri): add a hack for config includes with niri flake (#1239)
It works fine but needs all dms-generated config files to be present
2026-01-03 00:43:39 +01:00

192 lines
5.7 KiB
Nix

{
config,
lib,
...
}:
let
cfg = config.programs.dank-material-shell;
in
{
imports = [
./dms-rename.nix
];
options.programs.dank-material-shell = {
niri = {
enableKeybinds = lib.mkEnableOption "DankMaterialShell niri keybinds";
enableSpawn = lib.mkEnableOption "DankMaterialShell niri spawn-at-startup";
includes = {
enable = (lib.mkEnableOption "includes for niri-flake") // {
default = true;
};
override = lib.mkOption {
type = lib.types.bool;
description = ''
Whether DMS settings will be prioritized over settings defined in niri-flake or not
'';
default = true;
example = false;
};
originalFileName = lib.mkOption {
type = lib.types.str;
description = ''
A new name for the config file generated by niri-flake
'';
default = "hm";
example = "niri-flake";
};
filesToInclude = lib.mkOption {
type = lib.types.listOf lib.types.str;
description = ''
A list of dms-generated files to include
'';
default = [
"alttab"
"binds"
"colors"
"layout"
"outputs"
"wpblur"
];
example = [
"outputs"
"wpblur"
];
};
};
};
};
config = lib.mkIf cfg.enable {
warnings = (
lib.optional (cfg.niri.enableKeybinds && cfg.niri.includes.enable) ''
It is not recommended to use both `enableKeybinds` and `includes.enable` at the same time.
''
);
# HACK: niri-flake does not support config includes yet, but we can "fix" that
# TODO: replace with proper config includes after https://github.com/sodiboo/niri-flake/pull/1548 merge
xdg.configFile = lib.mkIf cfg.niri.includes.enable (
let
cfg' = cfg.niri.includes;
withOriginalConfig =
dmsFiles:
if cfg'.override then
[ cfg'.originalFileName ] ++ dmsFiles
else
dmsFiles ++ [ cfg'.originalFileName ];
fixes = map (fix: "\n${fix}") (
lib.optional (cfg'.enable && config.programs.niri.settings.layout.border.enable)
# kdl
''
// Border fix
// See https://yalter.github.io/niri/Configuration%3A-Include.html#border-special-case for details
layout { border { on; }; }
''
);
in
{
niri-config.target = lib.mkForce "niri/${cfg'.originalFileName}.kdl";
niri-config-dms = {
target = "niri/config.kdl";
text = lib.pipe cfg'.filesToInclude [
(map (filename: "dms/${filename}"))
withOriginalConfig
(map (filename: "include \"${filename}.kdl\""))
(files: files ++ fixes)
(builtins.concatStringsSep "\n")
];
};
}
);
programs.niri.settings = lib.mkMerge [
(lib.mkIf cfg.niri.enableKeybinds {
binds =
with config.lib.niri.actions;
let
dms-ipc = spawn "dms" "ipc";
in
{
"Mod+Space" = {
action = dms-ipc "spotlight" "toggle";
hotkey-overlay.title = "Toggle Application Launcher";
};
"Mod+N" = {
action = dms-ipc "notifications" "toggle";
hotkey-overlay.title = "Toggle Notification Center";
};
"Mod+Comma" = {
action = dms-ipc "settings" "toggle";
hotkey-overlay.title = "Toggle Settings";
};
"Mod+P" = {
action = dms-ipc "notepad" "toggle";
hotkey-overlay.title = "Toggle Notepad";
};
"Super+Alt+L" = {
action = dms-ipc "lock" "lock";
hotkey-overlay.title = "Toggle Lock Screen";
};
"Mod+X" = {
action = dms-ipc "powermenu" "toggle";
hotkey-overlay.title = "Toggle Power Menu";
};
"XF86AudioRaiseVolume" = {
allow-when-locked = true;
action = dms-ipc "audio" "increment" "3";
};
"XF86AudioLowerVolume" = {
allow-when-locked = true;
action = dms-ipc "audio" "decrement" "3";
};
"XF86AudioMute" = {
allow-when-locked = true;
action = dms-ipc "audio" "mute";
};
"XF86AudioMicMute" = {
allow-when-locked = true;
action = dms-ipc "audio" "micmute";
};
"XF86MonBrightnessUp" = {
allow-when-locked = true;
action = dms-ipc "brightness" "increment" "5" "";
};
"XF86MonBrightnessDown" = {
allow-when-locked = true;
action = dms-ipc "brightness" "decrement" "5" "";
};
"Mod+Alt+N" = {
allow-when-locked = true;
action = dms-ipc "night" "toggle";
hotkey-overlay.title = "Toggle Night Mode";
};
"Mod+V" = {
action = dms-ipc "clipboard" "toggle";
hotkey-overlay.title = "Toggle Clipboard Manager";
};
}
// lib.attrsets.optionalAttrs cfg.enableSystemMonitoring {
"Mod+M" = {
action = dms-ipc "processlist" "toggle";
hotkey-overlay.title = "Toggle Process List";
};
};
})
(lib.mkIf cfg.niri.enableSpawn {
spawn-at-startup = [
{
command = [
"dms"
"run"
];
}
];
})
];
};
}