{ lib, util, ... }: { checks = [ { assertion = util.registry.predicates.uniquePerHost (entry: entry.value.keys); message = "Desktop keybinds must use unique key chords per host."; } { assertion = entries: lib.all ( entry: (entry.value.action.kind == "exec" && entry.value.action.command != null) || ( builtins.elem entry.value.action.kind [ "focus" "move-window" ] && lib.xor (entry.value.action.direction != null) (entry.value.action.workspace != null) ) || ( entry.value.action.kind == "resize-window" && entry.value.action.direction != null && entry.value.action.workspace == null ) ) entries; message = "Desktop keybind actions must set the fields their kind requires."; } ]; type = lib.types.submodule { options = { keys = lib.mkOption { description = "Sets the key chord for this desktop keybind."; type = lib.types.str; example = "SUPER + Return"; }; repeating = lib.mkOption { description = "Repeats the keybind action while the key chord is held."; type = lib.types.bool; default = false; example = true; }; action = lib.mkOption { description = "Declares the action this keybind runs."; type = lib.types.submodule { options = { kind = lib.mkOption { description = "Selects the keybind action kind."; type = lib.types.enum [ "exec" "focus" "move-window" "resize-window" ]; }; command = lib.mkOption { description = "Command executed by an exec keybind."; type = lib.types.nullOr lib.types.str; default = null; example = "ghostty"; }; direction = lib.mkOption { description = "Direction targeted by a keybind action."; type = lib.types.nullOr ( lib.types.enum [ "down" "left" "right" "up" ] ); default = null; example = "left"; }; workspace = lib.mkOption { description = "Workspace targeted by a keybind action."; type = lib.types.nullOr lib.types.int; default = null; example = 1; }; }; }; }; }; }; }