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" ]; };