From 1b526ec1a597882b7629e992c7579ee109282aa7 Mon Sep 17 00:00:00 2001
From: tv <tv@krebsco.de>
Date: Fri, 8 Feb 2019 17:46:32 +0100
Subject: [PATCH] flameshot-once: add config

---
 krebs/5pkgs/simple/flameshot-once.nix         |  15 ---
 krebs/5pkgs/simple/flameshot-once/default.nix |  26 ++++
 krebs/5pkgs/simple/flameshot-once/profile.nix | 123 ++++++++++++++++++
 3 files changed, 149 insertions(+), 15 deletions(-)
 delete mode 100644 krebs/5pkgs/simple/flameshot-once.nix
 create mode 100644 krebs/5pkgs/simple/flameshot-once/default.nix
 create mode 100644 krebs/5pkgs/simple/flameshot-once/profile.nix

diff --git a/krebs/5pkgs/simple/flameshot-once.nix b/krebs/5pkgs/simple/flameshot-once.nix
deleted file mode 100644
index 4cbc92a63..000000000
--- a/krebs/5pkgs/simple/flameshot-once.nix
+++ /dev/null
@@ -1,15 +0,0 @@
-{ pkgs }:
-
-pkgs.symlinkJoin {
-  name = "flameshot-once-wrapper";
-  paths = [
-    (pkgs.writeDashBin "flameshot-once" ''
-      export PATH=${pkgs.stdenv.lib.makeBinPath [
-        pkgs.flameshot
-        pkgs.qt5.qtbase
-      ]}
-      exec ${pkgs.haskellPackages.flameshot-once}/bin/flameshot-once "$@"
-    '')
-    pkgs.haskellPackages.flameshot-once
-  ];
-}
diff --git a/krebs/5pkgs/simple/flameshot-once/default.nix b/krebs/5pkgs/simple/flameshot-once/default.nix
new file mode 100644
index 000000000..344c5b90a
--- /dev/null
+++ b/krebs/5pkgs/simple/flameshot-once/default.nix
@@ -0,0 +1,26 @@
+with import <stockholm/lib>;
+{ pkgs, ... }@args:
+
+let
+  # config cannot be declared in the input attribute set because that would
+  # cause callPackage to inject the wrong config.  Instead, get it from ...
+  # via args.
+  config = args.config or {};
+in
+
+  pkgs.symlinkJoin {
+    name = "flameshot-once-wrapper";
+    paths = [
+      (pkgs.writeDashBin "flameshot-once" ''
+        export PATH=${makeBinPath [
+          pkgs.flameshot
+          pkgs.qt5.qtbase
+        ]}
+        ${optionalString (config != null) /* sh */ ''
+          . ${import ./profile.nix { inherit config pkgs; }}
+        ''}
+        exec ${pkgs.haskellPackages.flameshot-once}/bin/flameshot-once "$@"
+      '')
+      pkgs.haskellPackages.flameshot-once
+    ];
+  }
diff --git a/krebs/5pkgs/simple/flameshot-once/profile.nix b/krebs/5pkgs/simple/flameshot-once/profile.nix
new file mode 100644
index 000000000..bfe571ff5
--- /dev/null
+++ b/krebs/5pkgs/simple/flameshot-once/profile.nix
@@ -0,0 +1,123 @@
+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 ./config.nix;
+      imports = singleton config;
+      options = {
+        buttons = mkOption {
+          apply = map (name: ButtonType.${name});
+          default = [
+            "PENCIL"
+            "DRAWER"
+            "ARROW"
+            "SELECTION"
+            "RECTANGLE"
+            "CIRCLE"
+            "MARKER"
+            "SELECTIONINDICATOR"
+            "MOVESELECTION"
+            "UNDO"
+            "COPY"
+            "SAVE"
+            "EXIT"
+            "BLUR"
+          ];
+          type = types.listOf (types.enum (attrNames ButtonType));
+        };
+        disabledTrayIcon = mkOption {
+          default = true;
+          type = types.bool;
+        };
+        drawThickness = mkOption {
+          default = 8;
+          type = types.positive;
+        };
+        savePath = mkOption {
+          default = "/tmp";
+          type = types.absolute-pathname;
+        };
+        showDesktopNotification = mkOption {
+          default = false;
+          type = types.bool;
+        };
+        showHelp = mkOption {
+          default = false;
+          type = types.bool;
+        };
+      };
+    };
+  };
+
+  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}
+      savePath=${toJSON cfg.savePath}
+      showDesktopNotification=${toJSON cfg.showDesktopNotification}
+      showHelp=${toJSON cfg.showHelp}
+    '';
+  };
+
+in
+
+  pkgs.writeDash "flameshot.profile" ''
+    export FLAMESHOT_CAPTURE_PATH=${cfg.savePath}
+    export XDG_CONFIG_HOME=${XDG_CONFIG_HOME}
+  ''