xcape: add service
This commit is contained in:
parent
f8b03f5750
commit
c48db4fbba
|
@ -1012,6 +1012,13 @@ in
|
||||||
A new module is available: 'programs.lsd'.
|
A new module is available: 'programs.lsd'.
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
time = "2019-04-09T20:10:22+00:00";
|
||||||
|
message = ''
|
||||||
|
A new module is available: 'services.xcape'.
|
||||||
|
'';
|
||||||
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,6 +118,7 @@ let
|
||||||
(loadModule ./services/window-managers/awesome.nix { })
|
(loadModule ./services/window-managers/awesome.nix { })
|
||||||
(loadModule ./services/window-managers/i3.nix { })
|
(loadModule ./services/window-managers/i3.nix { })
|
||||||
(loadModule ./services/window-managers/xmonad.nix { })
|
(loadModule ./services/window-managers/xmonad.nix { })
|
||||||
|
(loadModule ./services/xcape.nix { condition = hostPlatform.isLinux; })
|
||||||
(loadModule ./services/xembed-sni-proxy.nix { condition = hostPlatform.isLinux; })
|
(loadModule ./services/xembed-sni-proxy.nix { condition = hostPlatform.isLinux; })
|
||||||
(loadModule ./services/xscreensaver.nix { })
|
(loadModule ./services/xscreensaver.nix { })
|
||||||
(loadModule ./systemd.nix { })
|
(loadModule ./systemd.nix { })
|
||||||
|
|
76
modules/services/xcape.nix
Normal file
76
modules/services/xcape.nix
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
|
||||||
|
cfg = config.services.xcape;
|
||||||
|
|
||||||
|
in
|
||||||
|
|
||||||
|
{
|
||||||
|
meta.maintainers = [ maintainers.nickhu ];
|
||||||
|
|
||||||
|
options = {
|
||||||
|
services.xcape = {
|
||||||
|
enable = mkEnableOption "xcape";
|
||||||
|
|
||||||
|
timeout = mkOption {
|
||||||
|
type = types.nullOr types.int;
|
||||||
|
default = null;
|
||||||
|
example = 500;
|
||||||
|
description = ''
|
||||||
|
If you hold a key longer than this timeout, xcape will not
|
||||||
|
generate a key event. Default is 500 ms.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
mapExpression = mkOption {
|
||||||
|
type = types.attrsOf types.str;
|
||||||
|
default = {};
|
||||||
|
example = { Shift_L = "Escape"; Control_L = "Control_L|O"; };
|
||||||
|
description = ''
|
||||||
|
The value has the grammar <literal>Key[|OtherKey]</literal>.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
The list of key names is found in the header file
|
||||||
|
<filename>X11/keysymdef.h</filename> (remove the
|
||||||
|
<literal>XK_</literal> prefix). Note that due to limitations
|
||||||
|
of X11 shifted keys must be specified as a shift key
|
||||||
|
followed by the key to be pressed rather than the actual
|
||||||
|
name of the character. For example to generate "{" the
|
||||||
|
expression <literal>Shift_L|bracketleft</literal> could be
|
||||||
|
used (assuming that you have a key with "{" above "[").
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
You can also specify keys in decimal (prefix #), octal (#0),
|
||||||
|
or hexadecimal (#0x). They will be interpreted as keycodes
|
||||||
|
unless no corresponding key name is found.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
systemd.user.services.xcape = {
|
||||||
|
Unit = {
|
||||||
|
Description = "xcape";
|
||||||
|
After = [ "graphical-session-pre.target" ];
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
Service = {
|
||||||
|
Type = "forking";
|
||||||
|
ExecStart = "${pkgs.xcape}/bin/xcape"
|
||||||
|
+ optionalString (cfg.timeout != null) " -t ${toString cfg.timeout}"
|
||||||
|
+ optionalString (cfg.mapExpression != {})
|
||||||
|
" -e '${builtins.concatStringsSep ";"
|
||||||
|
(attrsets.mapAttrsToList (n: v: "${n}=${v}") cfg.mapExpression)}'";
|
||||||
|
};
|
||||||
|
|
||||||
|
Install = {
|
||||||
|
WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Loading…
Reference in a new issue