139 lines
3.6 KiB
Nix
139 lines
3.6 KiB
Nix
with import <stockholm/lib>;
|
|
{ config, pkgs }:
|
|
let
|
|
|
|
# Refs https://github.com/lupoDharkael/flameshot/blob/master/src/widgets/capture/capturebutton.h
|
|
ButtonType = {
|
|
PENCIL = 0;
|
|
DRAWER = 1;
|
|
ARROW = 2;
|
|
SELECTION = 3;
|
|
RECTANGLE = 4;
|
|
CIRCLE = 5;
|
|
MARKER = 6;
|
|
SELECTIONINDICATOR = 7;
|
|
MOVESELECTION = 8;
|
|
UNDO = 9;
|
|
COPY = 10;
|
|
SAVE = 11;
|
|
EXIT = 12;
|
|
IMAGEUPLOADER = 13;
|
|
OPEN_APP = 14;
|
|
BLUR = 15;
|
|
REDO = 16;
|
|
PIN = 17;
|
|
TEXT = 18;
|
|
};
|
|
|
|
cfg = eval.config;
|
|
|
|
eval = evalModules {
|
|
modules = singleton {
|
|
_file = toString ./profile.nix;
|
|
imports = singleton config;
|
|
options = {
|
|
buttons = mkOption {
|
|
apply = map (name: ButtonType.${name});
|
|
default = [
|
|
"PENCIL"
|
|
"DRAWER"
|
|
"ARROW"
|
|
"SELECTION"
|
|
"RECTANGLE"
|
|
"CIRCLE"
|
|
"MARKER"
|
|
"SELECTIONINDICATOR"
|
|
"MOVESELECTION"
|
|
"UNDO"
|
|
"SAVE"
|
|
"EXIT"
|
|
"BLUR"
|
|
];
|
|
type = types.listOf (types.enum (attrNames ButtonType));
|
|
};
|
|
disabledTrayIcon = mkOption {
|
|
default = true;
|
|
type = types.bool;
|
|
};
|
|
drawThickness = mkOption {
|
|
default = 8;
|
|
type = types.positive;
|
|
};
|
|
filenamePattern = mkOption {
|
|
default = "%FT%T%z_flameshot";
|
|
type =
|
|
# This is types.filename extended by [%:][%:+]*
|
|
types.addCheck types.str (test "[%:0-9A-Za-z._][%:+0-9A-Za-z._-]*");
|
|
};
|
|
savePath = mkOption {
|
|
default = "/tmp";
|
|
type = types.absolute-pathname;
|
|
};
|
|
showDesktopNotification = mkOption {
|
|
default = false;
|
|
type = types.bool;
|
|
};
|
|
showHelp = mkOption {
|
|
default = false;
|
|
type = types.bool;
|
|
};
|
|
timeout = mkOption {
|
|
default = 100;
|
|
description = ''
|
|
Maximum time in milliseconds allowed for the flameshot daemon to
|
|
react.
|
|
'';
|
|
type = types.positive;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
hexchars = stringToCharacters "0123456789abcdef";
|
|
|
|
# Encode integer to C-escaped string of bytes, little endian / LSB 0
|
|
le = rec {
|
|
x1 = i: let
|
|
i0 = mod i 16;
|
|
i1 = i / 16;
|
|
in
|
|
"\\x${elemAt hexchars i1}${elemAt hexchars i0}";
|
|
|
|
x2 = i: let
|
|
i0 = mod i 256;
|
|
i1 = i / 256;
|
|
in
|
|
"${x1 i0}${x1 i1}";
|
|
|
|
x4 = i: let
|
|
i0 = mod i 65536;
|
|
i1 = i / 65536;
|
|
in
|
|
"${x2 i0}${x2 i1}";
|
|
};
|
|
|
|
toQList = t: xs:
|
|
assert t == "int";
|
|
"QList<${t}>${le.x4 0}${le.x4 (length xs)}${concatMapStrings le.x4 xs}";
|
|
|
|
XDG_CONFIG_HOME = pkgs.write "flameshot-config" {
|
|
"/Dharkael/flameshot.ini".text = ''
|
|
[General]
|
|
buttons=@Variant(\0\0\0\x7f\0\0\0\v${toQList "int" cfg.buttons})
|
|
disabledTrayIcon=${toJSON cfg.disabledTrayIcon}
|
|
drawThickness=${toJSON cfg.drawThickness}
|
|
filenamePattern=${toJSON cfg.filenamePattern}
|
|
savePath=${toJSON cfg.savePath}
|
|
showDesktopNotification=${toJSON cfg.showDesktopNotification}
|
|
showHelp=${toJSON cfg.showHelp}
|
|
'';
|
|
};
|
|
|
|
in
|
|
|
|
pkgs.writeDash "flameshot.profile" ''
|
|
export FLAMESHOT_CAPTURE_PATH=${cfg.savePath}
|
|
export FLAMESHOT_ONCE_TIMEOUT=${toString cfg.timeout}
|
|
export XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
|
|
''
|