hotkeys: Initial support for custom key shortcuts

This commit is contained in:
Peter Jones 2022-06-23 16:25:24 -07:00
parent 8acad695b0
commit 28a19f2292
No known key found for this signature in database
GPG Key ID: 9DAFAA8D01941E49
3 changed files with 116 additions and 2 deletions

View File

@ -3,10 +3,15 @@
programs.plasma = {
enable = true;
# A high-level setting:
# Some high-level settings:
workspace.clickItemTo = "select";
# A mid-level setting:
hotkeys.commands."Launch Konsole" = {
key = "Meta+Alt+K";
command = "konsole";
};
# Some mid-level settings:
shortcuts = {
ksmserver = {
"Lock Session" = [ "Screensaver" "Meta+Ctrl+Alt+L" ];

View File

@ -3,6 +3,7 @@
{
imports = [
./files.nix
./hotkeys.nix
./shortcuts.nix
./windows.nix
./workspace.nix

108
modules/hotkeys.nix Normal file
View File

@ -0,0 +1,108 @@
# Global hotkeys (user-defined keyboard shortcuts):
{ config, lib, ... }:
let
cfg = config.programs.plasma;
commandType = { name, ... }: {
options = {
name = lib.mkOption {
type = lib.types.str;
default = name;
description = "Command hotkey name.";
};
comment = lib.mkOption {
type = lib.types.str;
default = name;
description = "Optional comment to display in the KDE settings UI.";
};
key = lib.mkOption {
type = lib.types.str;
description = "The key that triggers the action.";
};
command = lib.mkOption {
type = lib.types.str;
description = "The command to execute.";
};
};
};
# Create a hotkey attribute set from the given command. The idx
# parameter is the index within the hotkey list for this command.
commandToHotkey = cmd: idx: {
inherit (cmd) name comment;
triggers = [{
Key = cmd.key;
Type = "SHORTCUT";
Uuid = "{" + builtins.hashString "sha256" (builtins.toString idx + cmd.name) + "}";
}];
actions = [{
CommandURL = cmd.command;
Type = "COMMAND_URL";
}];
conditions = [ ];
};
# Convert a hotkey to an attribute set that can be used with
# programs.plasma.files:
hotkeyToSettings = hotkey: idx:
let
prefix = "Data_${toString idx}";
toSection = name: items:
builtins.listToAttrs
(lib.imap0
(jdx: item: {
name = "${prefix}${name}${toString jdx}";
value = item;
})
items);
in
{
${prefix} = {
Comment = hotkey.comment;
Enabled = true;
Name = hotkey.name;
Type = "SIMPLE_ACTION_DATA";
};
"${prefix}Conditions".ConditionsCount =
builtins.length (hotkey.conditions);
"${prefix}Actions".ActionsCount =
builtins.length (hotkey.actions);
"${prefix}Triggers".TriggersCount =
builtins.length (hotkey.triggers);
}
// toSection "Conditions" hotkey.conditions
// toSection "Actions" hotkey.actions
// toSection "Triggers" hotkey.triggers;
# Turn all options in this module into an attribute sets for
# programs.plasma.files.
hotkeys =
let items =
(map commandToHotkey (builtins.attrValues cfg.hotkeys.commands));
in
lib.foldr (a: b: a // b) { Data.DataCount = builtins.length items; }
(lib.imap1 (idx: hotkey: hotkeyToSettings (hotkey idx) idx) items);
in
{
options.programs.plasma.hotkeys = {
commands = lib.mkOption {
type = with lib.types; attrsOf (submodule commandType);
default = { };
description = "Commands triggered by a keyboard shortcut.";
};
};
config = lib.mkIf (cfg.enable && builtins.length (builtins.attrNames hotkeys) != 0) {
programs.plasma.files.khotkeysrc = hotkeys;
};
}