stockholm/krebs/5pkgs/simple/flameshot-once/config.nix

409 lines
12 KiB
Nix

{ config, pkgs, ... }:
with pkgs.stockholm.lib;
let
# 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
if i == 0 then
"\\0"
else if i < 16 then
"\\x${elemAt hexchars i0}"
else
"\\x${elemAt hexchars i1}${elemAt hexchars i0}";
x2 = i: let
i0 = mod i 256;
i1 = i / 256;
in
"${x1 i1}${x1 i0}";
x4 = i: let
i0 = mod i 65536;
i1 = i / 65536;
in
"${x2 i1}${x2 i0}";
};
toQList = t: xs:
assert t == "int";
"QList<${t}>${le.x4 0}${le.x1 (length xs)}${concatMapStrings le.x4 xs}";
in
{
options = {
imgur = mkOption {
default = {};
type = types.submodule {
options = {
enable = mkEnableOption "imgur";
createUrl = mkOption {
example = "http://p.r/image";
type = types.str;
};
deleteUrl = mkOption {
example = "http://p.r/image/delete/%1";
type = types.str;
};
xdg-open = mkOption {
default = {};
type = types.submodule {
options = {
enable = mkEnableOption "imgur.xdg-open" // {
default = true;
};
browser = mkOption {
default = "${pkgs.coreutils}/bin/false";
type = types.str;
};
createPrefix = mkOption {
default = config.imgur.createUrl;
type = types.str;
};
deletePrefix = mkOption {
default = removeSuffix "/%1" config.imgur.deleteUrl;
type = types.str;
};
};
};
};
};
};
};
package = mkOption {
type = types.package;
default = import ./flameshot { inherit pkgs; };
};
settings = {
# Options without a description are not documented in flameshot's README.
General = mapAttrs (_: recursiveUpdate { default = null; }) {
allowMultipleGuiInstances = mkOption {
description = ''
Allow multiple instances of `flameshot gui` to run at the same time
'';
type = with types; nullOr bool;
};
antialiasingPinZoom = mkOption {
description = ''
Anti-aliasing image when zoom the pinned image
'';
type = with types; nullOr bool;
};
autoCloseIdleDaemon = mkOption {
description = ''
Automatically close daemon when it's not needed
'';
type = with types; nullOr bool;
};
buttons = let
buttonTypes = {
TYPE_PENCIL = 0;
TYPE_DRAWER = 1;
TYPE_ARROW = 2;
TYPE_SELECTION = 3;
TYPE_RECTANGLE = 4;
TYPE_CIRCLE = 5;
TYPE_MARKER = 6;
TYPE_SELECTIONINDICATOR = 7;
TYPE_MOVESELECTION = 8;
TYPE_UNDO = 9;
TYPE_COPY = 10;
TYPE_SAVE = 11;
TYPE_EXIT = 12;
TYPE_IMAGEUPLOADER = 13;
TYPE_OPEN_APP = 14;
TYPE_PIXELATE = 15;
TYPE_REDO = 16;
TYPE_PIN = 17;
TYPE_TEXT = 18;
TYPE_CIRCLECOUNT = 19;
TYPE_SIZEINCREASE = 20;
TYPE_SIZEDECREASE = 21;
TYPE_INVERT = 22;
TYPE_ACCEPT = 23;
};
iterableButtonTypes = [
"TYPE_ACCEPT"
"TYPE_ARROW"
"TYPE_CIRCLE"
"TYPE_CIRCLECOUNT"
"TYPE_COPY"
"TYPE_DRAWER"
"TYPE_EXIT"
"TYPE_IMAGEUPLOADER"
"TYPE_MARKER"
"TYPE_MOVESELECTION"
"TYPE_OPEN_APP"
"TYPE_PENCIL"
"TYPE_PIN"
"TYPE_PIXELATE"
"TYPE_RECTANGLE"
"TYPE_REDO"
"TYPE_SAVE"
"TYPE_SELECTION"
"TYPE_SIZEDECREASE"
"TYPE_SIZEINCREASE"
"TYPE_TEXT"
"TYPE_UNDO"
];
in mkOption {
apply = names:
if names != null then let
values = map (name: buttonTypes.${name}) names;
in
''@Variant(\0\0\0\x7f\0\0\0\v${toQList "int" values})''
else
null;
description = ''
Configure which buttons to show after drawing a selection
'';
type = with types; nullOr (listOf (enum iterableButtonTypes));
};
checkForUpdates = mkOption {
type = with types; nullOr bool;
};
contrastOpacity = mkOption {
description = ''
Opacity of area outside selection
'';
type = with types; nullOr (boundedInt 0 255);
};
contrastUiColor = mkOption {
description = ''
Contrast UI color
'';
type = with types; nullOr flameshot.color;
};
copyAndCloseAfterUpload = mkOption {
type = with types; nullOr bool;
};
copyOnDoubleClick = mkOption {
type = with types; nullOr bool;
};
copyPathAfterSave = mkOption {
description = ''
Copy path to image after save
'';
type = with types; nullOr bool;
};
copyURLAfterUpload = mkOption {
description = ''
On successful upload, close the dialog and copy URL to clipboard
'';
type = with types; nullOr bool;
};
disabledTrayIcon = mkOption {
description = ''
Whether the tray icon is disabled
'';
type = with types; nullOr bool;
};
drawColor = mkOption {
description = ''
Last used color
'';
type = with types; nullOr flameshot.color;
};
drawFontSize = mkOption {
type = with types; nullOr positive;
};
drawThickness = mkOption {
description = ''
Last used tool thickness
'';
type = with types; nullOr positive;
};
filenamePattern = mkOption {
description = ''
Filename pattern using C++ strftime formatting
'';
type =
# This is types.filename extended by [%:][%:+]*
with types;
nullOr (addCheck str (test "[%:0-9A-Za-z._][%:+0-9A-Za-z._-]*"));
};
fontFamily = mkOption {
type = with types; nullOr str;
};
historyConfirmationToDelete = mkOption {
type = with types; nullOr bool;
};
ignoreUpdateToVersion = mkOption {
description = ''
Ignore updates to versions less than this value
'';
type = with types; nullOr str;
};
keepOpenAppLauncher = mkOption {
description = ''
Keep the App Launcher open after selecting an app
'';
type = with types; nullOr bool;
};
predefinedColorPaletteLarge = mkOption {
description = ''
Use larger color palette as the default one
'';
type = with types; nullOr bool;
};
saveAfterCopy = mkOption {
description = ''
Save image after copy
'';
type = with types; nullOr bool;
};
saveAsFileExtension = mkOption {
description = ''
Default file extension for screenshots
'';
type = with types; nullOr (addCheck filename (hasPrefix "."));
};
safeLastRegion = mkOption {
type = with types; nullOr bool;
};
savePath = mkOption {
description = ''
Image Save Path
'';
type = with types; nullOr absolute-pathname;
};
savePathFixed = mkOption {
description = ''
Whether the savePath is a fixed path
'';
type = with types; nullOr bool;
};
showDesktopNotification = mkOption {
description = ''
Show desktop notifications
'';
type = with types; nullOr bool;
};
showHelp = mkOption {
description = ''
Show the help screen on startup
'';
type = with types; nullOr bool;
};
showMagnifier = mkOption {
type = with types; nullOr bool;
};
showSelectionGeometry = mkOption {
type = with types; nullOr (boundedInt 0 5);
};
showSelectionGeometryHideTime = mkOption {
type = with types; nullOr uint;
};
showSidePanelButton = mkOption {
description = ''
Show the side panel button
'';
type = with types; nullOr bool;
};
showStartupLaunchMessage = mkOption {
type = with types; nullOr bool;
};
squareMagnifier = mkOption {
type = with types; nullOr bool;
};
startupLaunch = mkOption {
description = ''
Launch at startup
'';
type = with types; nullOr bool;
};
uiColor = mkOption {
description = ''
Main UI color
'';
type = with types; nullOr flameshot.color;
};
undoLimit = mkOption {
type = with types; nullOr (boundedInt 0 999);
};
uploadClientSecret = mkOption {
type = with types; nullOr str;
};
uploadHistoryMax = mkOption {
type = with types; nullOr uint;
};
uploadWithoutConfirmation = mkOption {
description = ''
Upload to imgur without confirmation
'';
type = with types; nullOr bool;
};
useJpgForClipboard = mkOption {
description = ''
Use JPG format instead of PNG
'';
type = with types; nullOr bool;
};
userColors = mkOption {
apply = value:
if value != null then
concatStringsSep ", " value
else
null;
description = ''
List of colors for color picker
The colors are arranged counter-clockwise with the first being set
to the right of the cursor. "picker" adds a custom color picker.
'';
type =
with types;
nullOr (listOf (either flameshot.color (enum ["picker"])));
};
};
Shortcuts = genAttrs [
"TYPE_ACCEPT"
"TYPE_ARROW"
"TYPE_CIRCLE"
"TYPE_CIRCLECOUNT"
"TYPE_COMMIT_CURRENT_TOOL"
"TYPE_COPY"
"TYPE_DELETE_CURRENT_TOOL"
"TYPE_DRAWER"
"TYPE_EXIT"
"TYPE_IMAGEUPLOADER"
"TYPE_INVERT"
"TYPE_MARKER"
"TYPE_MOVESELECTION"
"TYPE_MOVE_DOWN"
"TYPE_MOVE_LEFT"
"TYPE_MOVE_RIGHT"
"TYPE_MOVE_UP"
"TYPE_OPEN_APP"
"TYPE_PENCIL"
"TYPE_PIN"
"TYPE_PIXELATE"
"TYPE_RECTANGLE"
"TYPE_REDO"
"TYPE_RESIZE_DOWN"
"TYPE_RESIZE_LEFT"
"TYPE_RESIZE_RIGHT"
"TYPE_RESIZE_UP"
"TYPE_SAVE"
"TYPE_SELECTION"
"TYPE_SELECTIONINDICATOR"
"TYPE_SELECT_ALL"
"TYPE_SIZEDECREASE"
"TYPE_SIZEINCREASE"
"TYPE_SYM_RESIZE_DOWN"
"TYPE_SYM_RESIZE_LEFT"
"TYPE_SYM_RESIZE_RIGHT"
"TYPE_SYM_RESIZE_UP"
"TYPE_TEXT"
"TYPE_TOGGLE_PANEL"
"TYPE_UNDO"
] (name: mkOption {
default = null;
type = with types; nullOr str;
});
};
};
}