1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-11-08 19:46:05 +01:00

sketchybar: use finalpackage wrapper

Use finalPackage pattern with wrapper so that people who don't use the
service can benefit from the other options.

Signed-off-by: Austin Horstman <khaneliman12@gmail.com>
This commit is contained in:
Austin Horstman 2025-05-21 22:36:24 -05:00
parent 5dc3bc3368
commit e4b0102f69
10 changed files with 295 additions and 238 deletions

View file

@ -0,0 +1,15 @@
{ pkgs, ... }:
{
time = "2025-05-22T23:47:11+00:00";
condition = pkgs.stdenv.hostPlatform.isDarwin;
message = ''
A new sketchybar module has been added.
- Simple configuration with a single `config` option that accepts the
configuration as lines, a file, or a directory.
- Support for both bash and lua configuration types
- `extraLuaPackages` option for additional Lua dependencies
- `extraPackages` option for additional runtime dependencies
- Integrated launchd service management
'';
}

View file

@ -23,6 +23,13 @@ in
package = lib.mkPackageOption pkgs "sketchybar" { }; package = lib.mkPackageOption pkgs "sketchybar" { };
finalPackage = mkOption {
type = types.package;
readOnly = true;
internal = true;
description = "Resulting customized sketchybar package.";
};
configType = mkOption { configType = mkOption {
type = types.enum [ type = types.enum [
"bash" "bash"
@ -77,6 +84,38 @@ in
''; '';
}; };
sbarLuaPackage = lib.mkPackageOption pkgs "sbarlua" {
nullable = true;
extraDescription = "Required when using a lua configuration.";
};
luaPackage = lib.mkPackageOption pkgs "lua5_4" {
nullable = true;
extraDescription = "Lua interpreter to use when configType is lua.";
};
extraLuaPackages = mkOption {
type = with types; functionTo (listOf package);
default = _: [ ];
defaultText = literalExpression "ps: [ ]";
example = literalExpression "luaPkgs: with luaPkgs; [ luautf8 ]";
description = ''
The extra Lua packages required for your plugins to work.
This option accepts a function that takes a Lua package set as an argument,
and selects the required Lua packages from this package set.
See the example for more info.
'';
};
extraPackages = mkOption {
type = with lib.types; listOf package;
default = [ ];
example = literalExpression "[ pkgs.jq ]";
description = ''
Extra packages to add to PATH for the sketchybar service.
'';
};
service = { service = {
enable = mkEnableOption "sketchybar service" // { enable = mkEnableOption "sketchybar service" // {
default = true; default = true;
@ -97,99 +136,122 @@ in
example = "/Users/khaneliman/Library/Logs/sketchybar.log"; example = "/Users/khaneliman/Library/Logs/sketchybar.log";
description = "Absolute path to log all stdout output."; description = "Absolute path to log all stdout output.";
}; };
sbarLuaPackage = lib.mkPackageOption pkgs "sbarlua" {
nullable = true;
extraDescription = "Required when using a lua configuration.";
};
extraLuaPackages = mkOption {
type = with types; functionTo (listOf package);
default = _: [ ];
defaultText = literalExpression "ps: [ ]";
example = literalExpression "luaPkgs: with luaPkgs; [ luautf8 ]";
description = ''
The extra Lua packages required for your plugins to work.
This option accepts a function that takes a Lua package set as an argument,
and selects the required Lua packages from this package set.
See the example for more info.
'';
};
extraPackages = mkOption {
type = with lib.types; listOf package;
default = [ ];
example = literalExpression "[ pkgs.jq ]";
description = ''
Extra packages to add to PATH for the sketchybar service.
'';
};
}; };
}; };
config = lib.mkMerge [ config = lib.mkIf cfg.enable {
(lib.mkIf cfg.enable { assertions = [
assertions = [ (lib.hm.assertions.assertPlatform "programs.sketchybar" pkgs lib.platforms.darwin)
{ {
assertion = !(cfg.configType == "lua" && cfg.sbarLuaPackage == null); assertion = !(cfg.configType == "lua" && cfg.sbarLuaPackage == null);
message = "When configType is set to \"lua\", sbarLuaPackage must be specified"; message = "When configType is set to \"lua\", service.sbarLuaPackage must be specified";
}
];
programs.sketchybar.finalPackage =
let
resolvedExtraLuaPackages = cfg.extraLuaPackages pkgs.lua54Packages;
pathPackages =
[ cfg.package ]
++ cfg.extraPackages
++ lib.optional (cfg.configType == "lua" && cfg.luaPackage != null) cfg.luaPackage;
luaPaths = lib.filter (x: x != "") [
(lib.optionalString (cfg.configType == "lua" && resolvedExtraLuaPackages != [ ]) (
lib.concatMapStringsSep ";" pkgs.lua54Packages.getLuaPath resolvedExtraLuaPackages
))
(lib.optionalString (cfg.configType == "lua" && cfg.sbarLuaPackage != null) (
pkgs.lua54Packages.getLuaPath cfg.sbarLuaPackage
))
(lib.optionalString (cfg.configType == "lua" && cfg.config != null && cfg.config.source != null) (
let
configDir = "${config.xdg.configHome}/sketchybar";
in
"${configDir}/?.lua;${configDir}/?/init.lua;${configDir}/?/?.lua"
))
];
luaCPaths = lib.filter (x: x != "") [
(lib.optionalString (cfg.configType == "lua" && resolvedExtraLuaPackages != [ ]) (
lib.concatMapStringsSep ";" pkgs.lua54Packages.getLuaCPath resolvedExtraLuaPackages
))
(lib.optionalString (cfg.configType == "lua" && cfg.sbarLuaPackage != null) (
pkgs.lua54Packages.getLuaCPath cfg.sbarLuaPackage
))
];
makeWrapperArgs = lib.flatten (
lib.filter (x: x != [ ]) [
(lib.optional (pathPackages != [ ]) [
"--prefix"
"PATH"
":"
"${lib.makeBinPath pathPackages}"
])
(lib.optional (luaPaths != [ ]) [
"--prefix"
"LUA_PATH"
";"
"${lib.concatStringsSep ";" luaPaths}"
])
(lib.optional (luaCPaths != [ ]) [
"--prefix"
"LUA_CPATH"
";"
"${lib.concatStringsSep ";" luaCPaths}"
])
]
);
hasWrapperArgs = makeWrapperArgs != [ ];
in
if hasWrapperArgs then
pkgs.symlinkJoin {
name = "sketchybar";
paths = [ cfg.package ];
nativeBuildInputs = [ pkgs.makeWrapper ];
postBuild = ''
wrapProgram $out/bin/sketchybar ${lib.escapeShellArgs makeWrapperArgs}
'';
} }
]; else
cfg.package;
home.packages = [ cfg.package ]; home.packages = [ cfg.finalPackage ];
xdg.configFile."sketchybar/sketchybarrc".source = lib.mkIf (cfg.config != "") ( xdg.configFile."sketchybar/sketchybarrc".source = lib.mkIf (cfg.config != "") (
pkgs.writeTextFile { pkgs.writeTextFile {
name = "sketchybarrc"; name = "sketchybarrc";
text = text =
if cfg.configType == "lua" then if cfg.configType == "lua" then
'' ''
#!/usr/bin/env lua #!/usr/bin/env lua
-- Generated by home-manager -- Generated by home-manager
${cfg.config} ${cfg.config}
'' ''
else else
'' ''
#!/usr/bin/env bash #!/usr/bin/env bash
# Generated by home-manager # Generated by home-manager
${cfg.config} ${cfg.config}
''; '';
executable = true; executable = true;
} }
); );
})
(lib.mkIf cfg.service.enable { launchd.agents.sketchybar = {
assertions = [ enable = cfg.service.enable;
(lib.hm.assertions.assertPlatform "programs.sketchybar" pkgs lib.platforms.darwin) config = {
]; Program = lib.getExe cfg.finalPackage;
ProcessType = "Interactive";
launchd.agents.sketchybar = KeepAlive = true;
let RunAtLoad = true;
resolvedExtraLuaPackages = cfg.service.extraLuaPackages pkgs.lua54Packages; StandardErrorPath = cfg.service.errorLogFile;
in StandardOutPath = cfg.service.outLogFile;
{ };
enable = true; };
config = { };
Program = lib.getExe cfg.package;
ProcessType = "Interactive";
KeepAlive = true;
RunAtLoad = true;
StandardErrorPath = cfg.service.errorLogFile;
StandardOutPath = cfg.service.outLogFile;
EnvironmentVariables =
{
PATH = (lib.concatMapStringsSep ":" (p: "${p}/bin") ([ cfg.package ] ++ cfg.service.extraPackages));
}
// lib.optionalAttrs
(cfg.configType == "lua" && (cfg.sbarLuaPackage != null || cfg.extraLuaPackages != (_: [ ])))
{
LUA_CPATH = "${
lib.concatMapStringsSep ";" pkgs.lua54Packages.getLuaCPath resolvedExtraLuaPackages
};${cfg.sbarLuaPackage}/lib/lua/${pkgs.lua.luaversion}/?.so";
};
};
};
})
];
} }

View file

@ -1,5 +1,4 @@
{ {
# Combined tests with built-in validation
sketchybar = ./sketchybar.nix; # Bash configuration with validation sketchybar = ./sketchybar.nix; # Bash configuration with validation
sketchybar-lua-config = ./sketchybar-lua-config.nix; # Lua configuration with validation sketchybar-lua-config = ./sketchybar-lua-config.nix; # Lua configuration with validation
sketchybar-invalid-lua-config = ./sketchybar-invalid-lua-config.nix; # Tests error on missing sbarLua sketchybar-invalid-lua-config = ./sketchybar-invalid-lua-config.nix; # Tests error on missing sbarLua

View file

@ -2,22 +2,27 @@
{ {
programs.sketchybar = { programs.sketchybar = {
enable = true; enable = true;
package = config.lib.test.mkStubPackage { }; package = config.lib.test.mkStubPackage {
name = "sketchybar";
buildScript = ''
mkdir -p $out/bin
touch $out/bin/sketchybar
chmod 755 $out/bin/sketchybar
'';
};
# Test case for lua configuration without sbarLuaPackage # Test case for lua configuration without sbarLuaPackage
configType = "lua"; configType = "lua";
# sbarLuaPackage intentionally not set sbarLuaPackage = null;
variables = { config = ''
PADDING = 3; -- Basic lua config
}; local sbar = require("sbarlua")
sbar.bar:set({ height = 30 })
config.bar = { '';
height = 30;
};
}; };
test.asserts.assertions.expected = [ test.asserts.assertions.expected = [
"When configType is set to \"lua\", sbarLuaPackage must be specified" "When configType is set to \"lua\", service.sbarLuaPackage must be specified"
]; ];
} }

View file

@ -14,58 +14,54 @@ in
{ {
programs.sketchybar = { programs.sketchybar = {
enable = true; enable = true;
package = config.lib.test.mkStubPackage { }; package = config.lib.test.mkStubPackage {
name = "sketchybar";
buildScript = ''
mkdir -p $out/bin
touch $out/bin/sketchybar
chmod 755 $out/bin/sketchybar
'';
};
configType = "lua"; configType = "lua";
sbarLuaPackage = pkgsSbarlua; sbarLuaPackage = pkgsSbarlua;
variables = { config = ''
PADDING = 3;
FONT = "SF Pro";
COLOR = "0xff0000ff";
# Test more complex values
ITEMS = [
"calendar"
"cpu"
"memory"
];
SETTINGS = {
refresh_freq = 1;
enable_logging = true;
};
};
config = {
bar = {
height = 30;
position = "top";
padding_left = 10;
padding_right = 10;
blur_radius = 20;
corner_radius = 9;
};
defaults = {
"icon.font" = "$FONT";
"icon.color" = "$COLOR";
"background.height" = 24;
"label.padding" = "$PADDING";
"popup.background.border_width" = 2;
"popup.background.corner_radius" = 9;
};
};
extraConfig = ''
-- This is a test Lua configuration -- This is a test Lua configuration
local sbar = require("sbarlua")
-- Configure bar
sbar.bar:set({
height = 30,
position = "top",
padding_left = 10,
padding_right = 10,
blur_radius = 20,
corner_radius = 9,
})
-- Configure defaults
sbar.defaults:set({
["icon.font"] = "SF Pro",
["icon.color"] = "0xff0000ff",
["background.height"] = 24,
["popup.background.border_width"] = 2,
["popup.background.corner_radius"] = 9,
})
-- Add items
sbar:add("item", "cpu", { sbar:add("item", "cpu", {
position = "right", position = "right",
update_freq = 1, update_freq = 1,
script = "./scripts/cpu.lua" script = "./scripts/cpu.lua",
}) })
-- Subscribe to events -- Subscribe to events
sbar:subscribe("cpu", "system_woke") sbar:subscribe("cpu", "system_woke")
'';
-- Update the bar
sbar:update()'';
}; };
# Validate the generated Lua configuration file # Validate the generated Lua configuration file

View file

@ -2,11 +2,6 @@
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/@sketchybar@/bin:/@jq@/bin</string>
</dict>
<key>KeepAlive</key> <key>KeepAlive</key>
<true/> <true/>
<key>Label</key> <key>Label</key>

View file

@ -9,7 +9,11 @@ let
self: super: { self: super: {
sketchybar = config.lib.test.mkStubPackage { sketchybar = config.lib.test.mkStubPackage {
name = "sketchybar"; name = "sketchybar";
outPath = "/@sketchybar@"; buildScript = ''
mkdir -p $out/bin
touch $out/bin/sketchybar
chmod 755 $out/bin/sketchybar
'';
}; };
jq = config.lib.test.mkStubPackage { outPath = "/@jq@"; }; jq = config.lib.test.mkStubPackage { outPath = "/@jq@"; };
} }
@ -21,23 +25,22 @@ in
package = hmPkgs.sketchybar; package = hmPkgs.sketchybar;
configType = "bash"; configType = "bash";
variables = { config = ''
PADDING = "3"; #!/usr/bin/env bash
FONT = "SF Pro";
COLOR = "0xff0000ff";
};
config.bar = { # Configure bar
height = 30; sketchybar --bar height=30 \
position = "top"; position=top \
padding_left = 10; padding_left=10 \
padding_right = 10; padding_right=10
};
# Update the bar
sketchybar --update
'';
# Enable the integrated service # Enable the integrated service
service = { service = {
enable = true; enable = true;
extraPackages = [ hmPkgs.jq ];
errorLogFile = "/home/hm-user/Library/Logs/sketchybar/sketchybar.err.log"; errorLogFile = "/home/hm-user/Library/Logs/sketchybar/sketchybar.err.log";
outLogFile = "/home/hm-user/Library/Logs/sketchybar/sketchybar.out.log"; outLogFile = "/home/hm-user/Library/Logs/sketchybar/sketchybar.out.log";
}; };

View file

@ -3,45 +3,42 @@
{ {
programs.sketchybar = { programs.sketchybar = {
enable = true; enable = true;
package = config.lib.test.mkStubPackage { }; package = config.lib.test.mkStubPackage {
name = "sketchybar";
buildScript = ''
mkdir -p $out/bin
touch $out/bin/sketchybar
chmod 755 $out/bin/sketchybar
'';
};
configType = "bash"; configType = "bash";
variables = { config = ''
PADDING = "3"; # Define colors
FONT = "SF Pro"; export COLOR_BLACK="0xff181926"
COLOR = "0xff0000ff"; export COLOR_WHITE="0xffcad3f5"
};
config = { # Configure bar
bar = { sketchybar --bar height=32 \
height = 30; position=top \
position = "top"; padding_left=10 \
padding_left = 10; padding_right=10 \
padding_right = 10; color=$COLOR_BLACK
};
defaults = { # Configure default values
"icon.font" = "$FONT"; sketchybar --default icon.font="SF Pro:Bold:14.0" \
"icon.color" = "$COLOR"; icon.color=$COLOR_WHITE \
"background.height" = 24; label.font="SF Pro:Bold:14.0" \
}; label.color=$COLOR_WHITE
};
plugins = [ # Add items to the bar
{ sketchybar --add item clock right \
name = "clock"; --set clock script="date '+%H:%M'" \
placement = "right"; update_freq=10
script = "./scripts/clock.sh";
update_freq = 1;
}
];
extraConfig = '' # Update the bar
# This is a test configuration sketchybar --update
sketchybar --add item cpu right \
--set cpu script="$PLUGIN_DIR/cpu.sh" \
--subscribe cpu system_woke
''; '';
}; };

View file

@ -1,26 +1,27 @@
export COLOR=0xff0000ff #!/usr/bin/env bash
export FONT=SF Pro # Generated by home-manager
export PADDING=3 # Define colors
export COLOR_BLACK="0xff181926"
export COLOR_WHITE="0xffcad3f5"
sketchybar --bar \ # Configure bar
height=30 \ sketchybar --bar height=32 \
padding_left=10 \ position=top \
padding_right=10 \ padding_left=10 \
position=top padding_right=10 \
color=$COLOR_BLACK
sketchybar --default \ # Configure default values
background.height=24 \ sketchybar --default icon.font="SF Pro:Bold:14.0" \
icon.color=$COLOR \ icon.color=$COLOR_WHITE \
icon.font=$FONT label.font="SF Pro:Bold:14.0" \
label.color=$COLOR_WHITE
# Add items to the bar
sketchybar --add item clock right \
--set clock script="date '+%H:%M'" \
update_freq=10
sketchybar --add item clock right --set clock script=./scripts/clock.sh update_freq=1 # Update the bar
sketchybar --update
# This is a test configuration
sketchybar --add item cpu right \
--set cpu script="$PLUGIN_DIR/cpu.sh" \
--subscribe cpu system_woke
sketchybar --update

View file

@ -1,52 +1,36 @@
#!/usr/bin/env lua #!/usr/bin/env lua
-- Generated by home-manager -- Generated by home-manager
-- This is a test Lua configuration
local sbar = require("sbarlua") local sbar = require("sbarlua")
-- Set variables
sbar.variables["COLOR"] = "0xff0000ff"
sbar.variables["FONT"] = "SF Pro"
sbar.variables["ITEMS"] = {
"calendar",
"cpu",
"memory"
}
sbar.variables["PADDING"] = 3
sbar.variables["SETTINGS"] = {
["enable_logging"] = true,
["refresh_freq"] = 1
}
-- Configure bar -- Configure bar
sbar.bar:set({ sbar.bar:set({
["blur_radius"] = 20, height = 30,
["corner_radius"] = 9, position = "top",
["height"] = 30, padding_left = 10,
["padding_left"] = 10, padding_right = 10,
["padding_right"] = 10, blur_radius = 20,
["position"] = "top" corner_radius = 9,
}) })
-- Configure defaults -- Configure defaults
sbar.defaults:set({ sbar.defaults:set({
["icon.font"] = "SF Pro",
["icon.color"] = "0xff0000ff",
["background.height"] = 24, ["background.height"] = 24,
["icon.color"] = "$COLOR",
["icon.font"] = "$FONT",
["label.padding"] = "$PADDING",
["popup.background.border_width"] = 2, ["popup.background.border_width"] = 2,
["popup.background.corner_radius"] = 9 ["popup.background.corner_radius"] = 9,
}) })
-- Extra configuration -- Add items
-- This is a test Lua configuration
sbar:add("item", "cpu", { sbar:add("item", "cpu", {
position = "right", position = "right",
update_freq = 1, update_freq = 1,
script = "./scripts/cpu.lua" script = "./scripts/cpu.lua",
}) })
-- Subscribe to events -- Subscribe to events
sbar:subscribe("cpu", "system_woke") sbar:subscribe("cpu", "system_woke")
-- Update the bar -- Update the bar
sbar:update() sbar:update()