From 91a98f919db2fab3e5c9d47d3955e3896f320f3a Mon Sep 17 00:00:00 2001
From: Alistair Potts <alistairtpotts@gmail.com>
Date: Fri, 2 Feb 2018 15:25:51 +0000
Subject: [PATCH] stalonetray: add module

Adds a service for the Stalonetray system tray.

Configured through a 'config' attribute set, which writes space
separated key value pairs on successive lines to `~/.stalonetrayrc`.
---
 modules/misc/news.nix            |  7 +++
 modules/modules.nix              |  1 +
 modules/services/stalonetray.nix | 94 ++++++++++++++++++++++++++++++++
 modules/services/syncthing.nix   |  5 +-
 4 files changed, 106 insertions(+), 1 deletion(-)
 create mode 100644 modules/services/stalonetray.nix

diff --git a/modules/misc/news.nix b/modules/misc/news.nix
index 1dab10ae4..0cb5758ec 100644
--- a/modules/misc/news.nix
+++ b/modules/misc/news.nix
@@ -550,6 +550,13 @@ in
           A new program configuration is available: 'programs.mercurial'
         '';
       }
+
+      {
+        time = "2018-02-03T10:00:00+00:00";
+        message = ''
+          A new module is available: 'services.stalonetray'
+        '';
+      }
     ];
   };
 }
diff --git a/modules/modules.nix b/modules/modules.nix
index 8c000d2f6..aa04f3271 100644
--- a/modules/modules.nix
+++ b/modules/modules.nix
@@ -57,6 +57,7 @@ let
     ./services/random-background.nix
     ./services/redshift.nix
     ./services/screen-locker.nix
+    ./services/stalonetray.nix
     ./services/syncthing.nix
     ./services/taffybar.nix
     ./services/tahoe-lafs.nix
diff --git a/modules/services/stalonetray.nix b/modules/services/stalonetray.nix
new file mode 100644
index 000000000..7b16f7544
--- /dev/null
+++ b/modules/services/stalonetray.nix
@@ -0,0 +1,94 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+  cfg = config.services.stalonetray;
+
+in
+
+{
+  options = {
+    services.stalonetray = {
+      enable = mkEnableOption "Stalonetray system tray";
+
+      package = mkOption {
+        default = pkgs.stalonetray;
+        defaultText = "pkgs.stalonetray";
+        type = types.package;
+        example = literalExample "pkgs.stalonetray";
+        description = "The package to use for the Stalonetray binary.";
+      };
+
+      config = mkOption {
+          type = with types;
+            attrsOf (nullOr (either str (either bool int)));
+          description = ''
+            Stalonetray configuration as a set of attributes.
+          '';
+          default = {};
+          example = {
+            geometry = "3x1-600+0";
+            decorations = null;
+            icon_size = 30;
+            sticky = true;
+            background = "#cccccc";
+          };
+      };
+
+      extraConfig = mkOption {
+        type = types.lines;
+        description = "Additional configuration lines for stalonetrayrc.";
+        default = "";
+        example = ''
+            geometry 3x1-600+0
+            decorations none
+            icon_size 30
+            sticky true
+            background "#cccccc"
+        '';
+      };
+    };
+  };
+
+  config = mkIf cfg.enable (mkMerge [
+    {
+      home.packages = [ cfg.package ];
+
+      systemd.user.services.stalonetray = {
+        Unit = {
+          Description = "Stalonetray system tray";
+          After = [ "graphical-session-pre.target" ];
+          PartOf = [ "graphical-session.target" ];
+        };
+
+        Install = {
+          WantedBy = [ "graphical-session.target" ];
+        };
+
+        Service = {
+          ExecStart = "${cfg.package}/bin/stalonetray";
+          Restart = "on-failure";
+        };
+      };
+    }
+
+    (mkIf (cfg.config != {}) {
+      home.file.".stalonetrayrc".text =
+        let
+          valueToString = v:
+            if isBool v then (if v then "true" else "false")
+            else if (v==null) then "none"
+            else ''"${toString v}"'';
+        in
+          concatStrings (
+            mapAttrsToList (k: v: "${k} ${valueToString v}\n") cfg.config
+          );
+    })
+
+    (mkIf (cfg.extraConfig != "") {
+      home.file.".stalonetrayrc".text = cfg.extraConfig;
+    })
+  ]);
+}
diff --git a/modules/services/syncthing.nix b/modules/services/syncthing.nix
index 1906814bc..5acf313f8 100644
--- a/modules/services/syncthing.nix
+++ b/modules/services/syncthing.nix
@@ -52,7 +52,10 @@ with lib;
         qsyncthingtray = {
           Unit = {
             Description = "QSyncthingTray";
-            After = [ "graphical-session-pre.target" "polybar.service" "taffybar.service" ];
+            After = [ "graphical-session-pre.target"
+                      "polybar.service"
+                      "taffybar.service"
+                      "stalonetray.service" ];
             PartOf = [ "graphical-session.target" ];
           };