fusuma: add module
Fusuma is a tool supports multitouch gestures with libinput driver on Linux.
This commit is contained in:
parent
da92196a95
commit
8bdfa41b4e
3
.github/CODEOWNERS
vendored
3
.github/CODEOWNERS
vendored
|
@ -87,6 +87,9 @@
|
||||||
/modules/programs/foot.nix @plabadens
|
/modules/programs/foot.nix @plabadens
|
||||||
/tests/modules/programs/foot @plabadens
|
/tests/modules/programs/foot @plabadens
|
||||||
|
|
||||||
|
/modules/services/fusuma.nix @iosmanthus
|
||||||
|
/tests/modules/services/fusuma @iosmanthus
|
||||||
|
|
||||||
/modules/programs/gh.nix @Gerschtli @berbiche
|
/modules/programs/gh.nix @Gerschtli @berbiche
|
||||||
/tests/modules/programs/gh @Gerschtli @berbiche
|
/tests/modules/programs/gh @Gerschtli @berbiche
|
||||||
|
|
||||||
|
|
|
@ -61,6 +61,12 @@
|
||||||
github = "olmokramer";
|
github = "olmokramer";
|
||||||
githubId = 3612514;
|
githubId = 3612514;
|
||||||
};
|
};
|
||||||
|
iosmanthus = {
|
||||||
|
name = "iosmanthus";
|
||||||
|
email = "myosmanthustree@gmail.com";
|
||||||
|
github = "iosmanthus";
|
||||||
|
githubId = 16307070;
|
||||||
|
};
|
||||||
kalhauge = {
|
kalhauge = {
|
||||||
name = "Christian Gram Kalhauge";
|
name = "Christian Gram Kalhauge";
|
||||||
email = "kalhauge@users.noreply.github.com";
|
email = "kalhauge@users.noreply.github.com";
|
||||||
|
|
|
@ -2456,6 +2456,14 @@ in
|
||||||
A new module is available: 'programs.pubs'.
|
A new module is available: 'programs.pubs'.
|
||||||
'';
|
'';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
time = "2022-03-13T20:59:38+00:00";
|
||||||
|
condition = hostPlatform.isLinux;
|
||||||
|
message = ''
|
||||||
|
A new module is available: 'services.fusuma'.
|
||||||
|
'';
|
||||||
|
}
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -187,6 +187,7 @@ let
|
||||||
./services/flameshot.nix
|
./services/flameshot.nix
|
||||||
./services/fluidsynth.nix
|
./services/fluidsynth.nix
|
||||||
./services/fnott.nix
|
./services/fnott.nix
|
||||||
|
./services/fusuma.nix
|
||||||
./services/getmail.nix
|
./services/getmail.nix
|
||||||
./services/git-sync.nix
|
./services/git-sync.nix
|
||||||
./services/gnome-keyring.nix
|
./services/gnome-keyring.nix
|
||||||
|
|
138
modules/services/fusuma.nix
Normal file
138
modules/services/fusuma.nix
Normal file
|
@ -0,0 +1,138 @@
|
||||||
|
{ 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</command>.";
|
||||||
|
};
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
type = yamlFormat.type;
|
||||||
|
example = literalExpression ''
|
||||||
|
{
|
||||||
|
enable = true;
|
||||||
|
extraPackages = with pkgs;[ xdotool ];
|
||||||
|
config = {
|
||||||
|
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" ]; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -144,6 +144,7 @@ import nmt {
|
||||||
./modules/services/flameshot
|
./modules/services/flameshot
|
||||||
./modules/services/fluidsynth
|
./modules/services/fluidsynth
|
||||||
./modules/services/fnott
|
./modules/services/fnott
|
||||||
|
./modules/services/fusuma
|
||||||
./modules/services/git-sync
|
./modules/services/git-sync
|
||||||
./modules/services/gpg-agent
|
./modules/services/gpg-agent
|
||||||
./modules/services/gromit-mpx
|
./modules/services/gromit-mpx
|
||||||
|
|
4
tests/modules/services/fusuma/default.nix
Normal file
4
tests/modules/services/fusuma/default.nix
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
fusuma-example-settings = ./settings.nix;
|
||||||
|
fusuma-systemd-user-service = ./service.nix;
|
||||||
|
}
|
11
tests/modules/services/fusuma/expected-service.service
Normal file
11
tests/modules/services/fusuma/expected-service.service
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
[Install]
|
||||||
|
WantedBy=graphical-session.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Environment=PATH=@coreutils@/bin:@xdotool@/bin
|
||||||
|
ExecStart=@fusuma@/bin/fusuma -c /home/hm-user/.config/fusuma/config.yaml
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
After=graphical-session-pre.target
|
||||||
|
Description=Fusuma services
|
||||||
|
PartOf=graphical-session.target
|
12
tests/modules/services/fusuma/expected-settings.yaml
Normal file
12
tests/modules/services/fusuma/expected-settings.yaml
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
interval:
|
||||||
|
swipe: 7
|
||||||
|
swipe:
|
||||||
|
3:
|
||||||
|
left:
|
||||||
|
command: xdotool key ctrl+alt+Right
|
||||||
|
4:
|
||||||
|
left:
|
||||||
|
command: xdotool key ctrl+shift+alt+Right
|
||||||
|
threshold:
|
||||||
|
swipe: 1
|
||||||
|
|
19
tests/modules/services/fusuma/service.nix
Normal file
19
tests/modules/services/fusuma/service.nix
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{ config, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.fusuma = {
|
||||||
|
enable = true;
|
||||||
|
package = config.lib.test.mkStubPackage { outPath = "@fusuma@"; };
|
||||||
|
extraPackages = [
|
||||||
|
(config.lib.test.mkStubPackage { outPath = "@coreutils@"; })
|
||||||
|
(config.lib.test.mkStubPackage { outPath = "@xdotool@"; })
|
||||||
|
];
|
||||||
|
settings = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
nmt.script = ''
|
||||||
|
assertFileContent \
|
||||||
|
home-files/.config/systemd/user/fusuma.service \
|
||||||
|
${./expected-service.service}
|
||||||
|
'';
|
||||||
|
}
|
23
tests/modules/services/fusuma/settings.nix
Normal file
23
tests/modules/services/fusuma/settings.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{ config, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
services.fusuma = {
|
||||||
|
enable = true;
|
||||||
|
extraPackages = [ (config.lib.test.mkStubPackage { }) ];
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
threshold = { swipe = 1; };
|
||||||
|
interval = { swipe = 7; };
|
||||||
|
swipe = {
|
||||||
|
"3" = { left = { command = "xdotool key ctrl+alt+Right"; }; };
|
||||||
|
"4" = { left = { command = "xdotool key ctrl+shift+alt+Right"; }; };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nmt.script = ''
|
||||||
|
assertFileContent \
|
||||||
|
home-files/.config/fusuma/config.yaml \
|
||||||
|
${./expected-settings.yaml}
|
||||||
|
'';
|
||||||
|
}
|
Loading…
Reference in a new issue