home-manager/modules/services/fusuma.nix
Emily 9f9e277b60 treewide: remove now-redundant lib.mdDoc calls
These (and the `*MD` functions apart from `literalMD`) are now no-ops
in nixpkgs and serve no purpose other than to add additional noise and
potentially mislead people into thinking unmarked DocBook documentation
will still be accepted.

Note that if backporting changes including documentation to 23.05,
the `mdDoc` calls will need to be re-added.

To reproduce this commit, run:

    $ NIX_PATH=nixpkgs=flake:nixpkgs/e7e69199f0372364a6106a1e735f68604f4c5a25 \
      nix shell nixpkgs#coreutils \
      -c find . -name '*.nix' \
      -exec nix run -- github:emilazy/nix-doc-munge/98dadf1f77351c2ba5dcb709a2a171d655f15099 \
      --strip {} +
    $ ./format
2023-07-17 18:49:09 +01:00

135 lines
3.4 KiB
Nix

{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.services.fusuma;
yamlFormat = pkgs.formats.yaml { };
configJson = pkgs.writeText "config.json" (builtins.toJSON cfg.settings);
configYamlRaw = pkgs.runCommand "config.yaml.raw" { } ''
${pkgs.remarshal}/bin/json2yaml -i ${configJson} -o $out;
'';
# convert keys into literal numbers where necessary,
# fusuma does not support string type finger count.
strToInt = pkgs.writers.writePython3 "str2int" {
libraries = [ pkgs.python3Packages.pyyaml ];
} ''
import yaml
from yaml import FullLoader
def str2int(config):
if type(config) is not dict:
return
for key in list(config):
if type(config[key]) is dict and key.isdigit():
t = config[key]
del config[key]
config[int(key)] = t
else:
str2int(config[key])
if __name__ == '__main__':
path = "${configYamlRaw}"
with open(path) as f:
config = yaml.load(f, Loader=FullLoader)
str2int(config)
print(yaml.dump(config))
'';
configYaml = pkgs.stdenv.mkDerivation {
name = "config.yaml";
buildCommand = ''
${strToInt} > $out
'';
};
makeBinPath = packages:
foldl (a: b: if a == "" then b else "${a}:${b}") ""
(map (pkg: "${pkg}/bin") packages);
in {
meta.maintainers = [ hm.maintainers.iosmanthus ];
options.services.fusuma = {
enable = mkEnableOption
"the fusuma systemd service to automatically enable touchpad gesture";
package = mkOption {
type = types.package;
default = pkgs.fusuma;
defaultText = literalExpression "pkgs.fusuma";
description = "Package providing {command}`fusuma`.";
};
settings = mkOption {
type = yamlFormat.type;
example = literalExpression ''
{
threshold = {
swipe = 0.1;
};
interval = {
swipe = 0.7;
};
swipe = {
"3" = {
left = {
# GNOME: Switch to left workspace
command = "xdotool key ctrl+alt+Right";
};
};
};
};
'';
description = ''
YAML config that will override the default fusuma configuration.
'';
};
extraPackages = mkOption {
type = types.listOf types.package;
default = with pkgs; [ coreutils ];
defaultText = literalExpression "pkgs.coreutils";
example = literalExpression ''
with pkgs; [ coreutils xdotool ];
'';
description = ''
Extra packages needs to bring to the scope of fusuma service.
'';
};
};
config = mkIf cfg.enable {
assertions = [
(lib.hm.assertions.assertPlatform "services.fusuma" pkgs
lib.platforms.linux)
];
xdg.configFile."fusuma/config.yaml".source = configYaml;
systemd.user.services.fusuma = {
Unit = {
Description = "Fusuma services";
After = [ "graphical-session-pre.target" ];
PartOf = [ "graphical-session.target" ];
};
Service = {
Environment = with pkgs; "PATH=${makeBinPath cfg.extraPackages}";
ExecStart =
"${cfg.package}/bin/fusuma -c ${config.xdg.configHome}/fusuma/config.yaml";
};
Install = { WantedBy = [ "graphical-session.target" ]; };
};
};
}