parent
6fe3b539e0
commit
0ebed30a10
@ -0,0 +1,234 @@ |
|||||||
|
{ config, lib, pkgs, ... }: |
||||||
|
|
||||||
|
with lib; |
||||||
|
|
||||||
|
let |
||||||
|
|
||||||
|
cfg = config.services.gromit-mpx; |
||||||
|
|
||||||
|
# Select the appropriate hot key: |
||||||
|
hotkey = if isInt cfg.hotKey then |
||||||
|
"--keycode ${toString cfg.hotKey}" |
||||||
|
else if cfg.hotKey != null then |
||||||
|
"--key ${cfg.hotKey}" |
||||||
|
else |
||||||
|
"--key none"; |
||||||
|
|
||||||
|
# Select the appropriate undo key: |
||||||
|
undokey = if isInt cfg.undoKey then |
||||||
|
"--undo-keycode ${toString cfg.undoKey}" |
||||||
|
else if cfg.undoKey != null then |
||||||
|
"--undo-key ${cfg.undoKey}" |
||||||
|
else |
||||||
|
"--undo-key none"; |
||||||
|
|
||||||
|
# The command line to send to gromit-mpx: |
||||||
|
commandArgs = concatStringsSep " " [ hotkey undokey ]; |
||||||
|
|
||||||
|
# Gromit reads and writes from this file to store it's run time |
||||||
|
# state. That will break our config so we set it manually which, |
||||||
|
# thanks to the read-only Nix store, prevents Gromit from writing to |
||||||
|
# it. |
||||||
|
keyFile = generators.toINI { } { |
||||||
|
General.ShowIntroOnStartup = false; |
||||||
|
Drawing.Opacity = cfg.opacity; |
||||||
|
}; |
||||||
|
|
||||||
|
# Allowed modifiers: |
||||||
|
modsAndButtons = [ "1" "2" "3" "4" "5" "SHIFT" "CONTROL" "ALT" "META" ]; |
||||||
|
|
||||||
|
# Create a string of tool attributes: |
||||||
|
toolAttrs = tool: |
||||||
|
concatStringsSep " " ([ "size=${toString tool.size}" ] |
||||||
|
++ optional (tool.type != "eraser") ''color="${tool.color}"'' |
||||||
|
++ optional (tool.arrowSize != null) |
||||||
|
"arrowsize=${toString tool.arrowSize}"); |
||||||
|
|
||||||
|
# Optional tool modifier string: |
||||||
|
toolMod = tool: |
||||||
|
if tool.modifiers != [ ] then |
||||||
|
"[" + concatStringsSep ", " tool.modifiers + "]" |
||||||
|
else |
||||||
|
""; |
||||||
|
|
||||||
|
# A single tool configuration: |
||||||
|
toolToCfg = n: tool: '' |
||||||
|
"tool-${toString n}" = ${toUpper tool.type} (${toolAttrs tool}); |
||||||
|
"${tool.device}"${toolMod tool} = "tool-${toString n}"; |
||||||
|
''; |
||||||
|
|
||||||
|
# Per-tool options: |
||||||
|
toolOptions = { |
||||||
|
options = { |
||||||
|
device = mkOption { |
||||||
|
type = types.str; |
||||||
|
example = "default"; |
||||||
|
description = '' |
||||||
|
Use this tool with the given xinput device. The device with |
||||||
|
the name default works with any input. |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
type = mkOption { |
||||||
|
type = types.enum [ "pen" "eraser" "recolor" ]; |
||||||
|
default = "pen"; |
||||||
|
example = "eraser"; |
||||||
|
description = "Which type of tool this is."; |
||||||
|
}; |
||||||
|
|
||||||
|
color = mkOption { |
||||||
|
type = types.str; |
||||||
|
default = "red"; |
||||||
|
example = "#ff00ff"; |
||||||
|
description = "The stroke (or recolor) color of the tool."; |
||||||
|
}; |
||||||
|
|
||||||
|
size = mkOption { |
||||||
|
type = types.ints.positive; |
||||||
|
default = 5; |
||||||
|
example = 3; |
||||||
|
description = "The tool size."; |
||||||
|
}; |
||||||
|
|
||||||
|
arrowSize = mkOption { |
||||||
|
type = types.nullOr types.ints.positive; |
||||||
|
default = null; |
||||||
|
example = 2; |
||||||
|
description = '' |
||||||
|
If not <literal>null</literal>, automatically draw an arrow |
||||||
|
at the end of a stroke with the given size. |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
modifiers = mkOption { |
||||||
|
type = types.listOf (types.enum modsAndButtons); |
||||||
|
default = [ ]; |
||||||
|
example = [ "SHIFT" ]; |
||||||
|
description = '' |
||||||
|
Only activate this tool if the given modifiers are also active. |
||||||
|
''; |
||||||
|
}; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
in { |
||||||
|
meta.maintainers = [ maintainers.pjones ]; |
||||||
|
|
||||||
|
options.services.gromit-mpx = { |
||||||
|
enable = mkEnableOption "Gromit-MPX annotation tool"; |
||||||
|
|
||||||
|
package = mkOption { |
||||||
|
type = types.package; |
||||||
|
default = pkgs.gromit-mpx; |
||||||
|
defaultText = "pkgs.gromit-mpx"; |
||||||
|
description = "The gromit-mpx package to use."; |
||||||
|
}; |
||||||
|
|
||||||
|
hotKey = mkOption { |
||||||
|
type = with types; nullOr (either str ints.positive); |
||||||
|
default = "F9"; |
||||||
|
example = "Insert"; |
||||||
|
description = '' |
||||||
|
A keysym or raw keycode that toggles the activation state of |
||||||
|
gromit-mpx. Set to <literal>null</literal> to disable the |
||||||
|
hotkey in which case you'll have to activate gromit-mpx |
||||||
|
manually using the command line. |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
undoKey = mkOption { |
||||||
|
type = with types; nullOr (either str ints.positive); |
||||||
|
default = "F10"; |
||||||
|
description = '' |
||||||
|
A keysym or raw keycode that causes gromit-mpx to undo the |
||||||
|
last stroke. Use this key along with the shift key to redo an |
||||||
|
undone stoke. Set to <literal>null</literal> to disable the |
||||||
|
undo hotkey. |
||||||
|
''; |
||||||
|
}; |
||||||
|
|
||||||
|
opacity = mkOption { |
||||||
|
type = types.addCheck types.float (f: f >= 0.0 && f <= 1.0) // { |
||||||
|
description = "float between 0.0 and 1.0 (inclusive)"; |
||||||
|
}; |
||||||
|
default = 0.75; |
||||||
|
example = 1.0; |
||||||
|
description = "Opacity of the drawing overlay."; |
||||||
|
}; |
||||||
|
|
||||||
|
tools = mkOption { |
||||||
|
type = types.listOf (types.submodule toolOptions); |
||||||
|
default = [ |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "pen"; |
||||||
|
size = 5; |
||||||
|
color = "red"; |
||||||
|
} |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "pen"; |
||||||
|
size = 5; |
||||||
|
color = "blue"; |
||||||
|
modifiers = [ "SHIFT" ]; |
||||||
|
} |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "pen"; |
||||||
|
size = 5; |
||||||
|
color = "yellow"; |
||||||
|
modifiers = [ "CONTROL" ]; |
||||||
|
} |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "pen"; |
||||||
|
size = 6; |
||||||
|
color = "green"; |
||||||
|
arrowSize = 1; |
||||||
|
modifiers = [ "2" ]; |
||||||
|
} |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "eraser"; |
||||||
|
size = 75; |
||||||
|
modifiers = [ "3" ]; |
||||||
|
} |
||||||
|
]; |
||||||
|
description = '' |
||||||
|
Tool definitions for gromit-mpx to use. |
||||||
|
''; |
||||||
|
}; |
||||||
|
}; |
||||||
|
|
||||||
|
config = mkIf cfg.enable { |
||||||
|
assertions = [ |
||||||
|
(lib.hm.assertions.assertPlatform "services.gromit-mpx" pkgs |
||||||
|
lib.platforms.linux) |
||||||
|
]; |
||||||
|
|
||||||
|
xdg.configFile."gromit-mpx.ini".text = keyFile; |
||||||
|
xdg.configFile."gromit-mpx.cfg".text = |
||||||
|
concatStringsSep "\n" (imap1 toolToCfg cfg.tools); |
||||||
|
|
||||||
|
home.packages = [ cfg.package ]; |
||||||
|
|
||||||
|
systemd.user.services.gromit-mpx = { |
||||||
|
Unit = { |
||||||
|
Description = "Gromit-MPX"; |
||||||
|
After = [ "graphical-session-pre.target" ]; |
||||||
|
PartOf = [ "graphical-session.target" ]; |
||||||
|
X-Restart-Triggers = [ |
||||||
|
"${config.xdg.configFile."gromit-mpx.cfg".source}" |
||||||
|
"${config.xdg.configFile."gromit-mpx.ini".source}" |
||||||
|
]; |
||||||
|
}; |
||||||
|
|
||||||
|
Service = { |
||||||
|
Type = "simple"; |
||||||
|
ExecStart = "${cfg.package}/bin/gromit-mpx ${commandArgs}"; |
||||||
|
}; |
||||||
|
|
||||||
|
Install = { WantedBy = [ "graphical-session.target" ]; }; |
||||||
|
}; |
||||||
|
}; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
"tool-1" = PEN (size=5 color="red"); |
||||||
|
"default" = "tool-1"; |
||||||
|
|
||||||
|
"tool-2" = ERASER (size=75); |
||||||
|
"default"[3] = "tool-2"; |
@ -0,0 +1,23 @@ |
|||||||
|
{ config, pkgs, ... }: |
||||||
|
|
||||||
|
{ |
||||||
|
services.gromit-mpx = { |
||||||
|
enable = true; |
||||||
|
package = config.lib.test.mkStubPackage { }; |
||||||
|
tools = [ |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "pen"; |
||||||
|
size = 5; |
||||||
|
} |
||||||
|
{ |
||||||
|
device = "default"; |
||||||
|
type = "eraser"; |
||||||
|
size = 75; |
||||||
|
modifiers = [ "3" ]; |
||||||
|
} |
||||||
|
]; |
||||||
|
}; |
||||||
|
|
||||||
|
nmt.script = import ./nmt-script.nix ./basic-configuration.cfg; |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
"tool-1" = PEN (size=5 color="red"); |
||||||
|
"default" = "tool-1"; |
||||||
|
|
||||||
|
"tool-2" = PEN (size=5 color="blue"); |
||||||
|
"default"[SHIFT] = "tool-2"; |
||||||
|
|
||||||
|
"tool-3" = PEN (size=5 color="yellow"); |
||||||
|
"default"[CONTROL] = "tool-3"; |
||||||
|
|
||||||
|
"tool-4" = PEN (size=6 color="green" arrowsize=1); |
||||||
|
"default"[2] = "tool-4"; |
||||||
|
|
||||||
|
"tool-5" = ERASER (size=75); |
||||||
|
"default"[3] = "tool-5"; |
@ -0,0 +1,10 @@ |
|||||||
|
{ config, pkgs, ... }: |
||||||
|
|
||||||
|
{ |
||||||
|
services.gromit-mpx = { |
||||||
|
enable = true; |
||||||
|
package = config.lib.test.mkStubPackage { }; |
||||||
|
}; |
||||||
|
|
||||||
|
nmt.script = import ./nmt-script.nix ./default-configuration.cfg; |
||||||
|
} |
@ -0,0 +1,4 @@ |
|||||||
|
{ |
||||||
|
gromit-mpx-default-configuration = ./default-configuration.nix; |
||||||
|
gromit-mpx-basic-configuration = ./basic-configuration.nix; |
||||||
|
} |
@ -0,0 +1,14 @@ |
|||||||
|
golden_file: |
||||||
|
|
||||||
|
'' |
||||||
|
serviceFile=home-files/.config/systemd/user/gromit-mpx.service |
||||||
|
|
||||||
|
assertFileExists $serviceFile |
||||||
|
assertFileRegex $serviceFile 'X-Restart-Triggers=.*gromitmpx\.cfg' |
||||||
|
assertFileRegex $serviceFile 'X-Restart-Triggers=.*gromitmpx\.ini' |
||||||
|
assertFileRegex $serviceFile 'ExecStart=.*/bin/gromit-mpx' |
||||||
|
|
||||||
|
assertFileExists home-files/.config/gromit-mpx.ini |
||||||
|
assertFileExists home-files/.config/gromit-mpx.cfg |
||||||
|
assertFileContent home-files/.config/gromit-mpx.cfg ${golden_file} |
||||||
|
'' |
Loading…
Reference in new issue