Files
zen-browser-flake/hm-module.nix

397 lines
14 KiB
Nix
Raw Permalink Normal View History

2025-04-02 20:18:24 +05:00
{
home-manager,
self,
name,
2025-04-03 18:14:58 -05:00
}: {
2025-04-02 20:18:24 +05:00
config,
pkgs,
2025-04-02 20:18:24 +05:00
lib,
...
2025-04-03 18:14:58 -05:00
}: let
inherit
(lib)
getAttrFromPath
isPath
mkIf
mkOption
setAttrByPath
types
;
cfg = getAttrFromPath modulePath config;
2025-04-02 20:18:24 +05:00
applicationName = "Zen Browser";
modulePath = [
"programs"
"zen-browser"
];
linuxConfigPath = ".zen";
darwinConfigPath = "Library/Application Support/Zen";
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
configPath = "${
(
if pkgs.stdenv.isDarwin
then darwinConfigPath
else linuxConfigPath
)
}";
2025-04-02 20:18:24 +05:00
mkFirefoxModule = import "${home-manager.outPath}/modules/programs/firefox/mkFirefoxModule.nix";
2025-04-03 18:14:58 -05:00
in {
2025-04-02 20:18:24 +05:00
imports = [
(mkFirefoxModule {
inherit modulePath;
name = applicationName;
wrappedPackageName = "zen-${name}";
unwrappedPackageName = "zen-${name}-unwrapped";
2025-04-02 20:18:24 +05:00
visible = true;
platforms = {
linux = {
vendorPath = linuxConfigPath;
configPath = linuxConfigPath;
2025-04-02 20:18:24 +05:00
};
darwin = {
configPath = darwinConfigPath;
2025-04-02 20:18:24 +05:00
};
};
})
];
options = setAttrByPath modulePath {
profiles = mkOption {
type = with types;
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
attrsOf (
submodule (
{...}: {
options = {
spacesForce = mkOption {
type = bool;
description = "Whether to delete existing spaces not declared in the configuration.";
default = false;
};
spaces = mkOption {
type = attrsOf (
submodule (
{name, ...}: {
options = {
name = mkOption {
type = str;
description = "Name of the space.";
default = name;
};
id = mkOption {
type = str;
description = "REQUIRED. Unique Version 4 UUID for space.";
};
position = mkOption {
type = ints.unsigned;
description = "Position of space in the left bar.";
default = 1000;
};
icon = mkOption {
type = nullOr (either str path);
description = "Emoji or icon URI to be used as space icon.";
apply = v:
if isPath v
then "file://${v}"
else v;
default = null;
};
container = mkOption {
type = nullOr ints.unsigned;
description = "Container ID to be used in space";
default = null;
};
theme.type = mkOption {
type = nullOr str;
default = "gradient";
};
theme.colors = mkOption {
type = nullOr (
listOf (
submodule (
{...}: {
options = {
red = mkOption {
type = ints.between 0 255;
default = 0;
};
green = mkOption {
type = ints.between 0 255;
default = 0;
};
blue = mkOption {
type = ints.between 0 255;
default = 0;
};
custom = mkOption {
type = bool;
default = false;
};
algorithm = mkOption {
type = enum [
"complementary"
"floating"
"analogous"
];
default = "floating";
};
primary = mkOption {
type = bool;
default = true;
};
lightness = mkOption {
type = int;
default = 0;
};
position.x = mkOption {
type = int;
default = 0;
};
position.y = mkOption {
type = int;
default = 0;
};
type = mkOption {
type = enum [
"undefined"
"explicit-lightness"
];
default = "undefined";
};
};
}
)
)
);
default = [];
};
theme.opacity = mkOption {
type = nullOr float;
default = 0.5;
};
theme.rotation = mkOption {
type = nullOr int;
default = null;
};
theme.texture = mkOption {
type = nullOr float;
default = 0.0;
};
};
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
}
)
);
default = {};
};
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
};
}
)
);
};
};
config = mkIf cfg.enable {
2025-04-02 20:18:24 +05:00
programs.zen-browser = {
package =
(pkgs.wrapFirefox (self.packages.${pkgs.stdenv.hostPlatform.system}."${name}-unwrapped".override {
# Seems like zen uses relative (to the original binary) path to the policies.json file
# and ignores the overrides by pkgs.wrapFirefox
policies = cfg.policies;
}) {}).override
{
nativeMessagingHosts = cfg.nativeMessagingHosts;
};
policies = {
DisableAppUpdate = lib.mkDefault true;
DisableTelemetry = lib.mkDefault true;
2025-04-02 20:18:24 +05:00
};
};
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
home.file = let
inherit
(builtins)
isNull
toJSON
toString
;
inherit
(lib)
concatStringsSep
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
concatMapStringsSep
concatMapAttrsStringSep
filterAttrs
getExe
getExe'
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
mapAttrs'
mapAttrsToList
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
nameValuePair
optionalString
pipe
;
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
in (mapAttrs' (profileName: profile: let
sqlite3 = getExe' pkgs.sqlite "sqlite3";
scriptFile = "${configPath}/${profileName}/places_update.sh";
placesFile = "${config.home.homeDirectory}/${configPath}/${profileName}/places.sqlite";
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
insertSpaces = ''
# Reference: https://github.com/zen-browser/desktop/blob/4e2dfd8a138fd28767bb4799a3ca9d8aab80430e/src/zen/workspaces/ZenWorkspacesStorage.mjs#L25-L55
${sqlite3} "${placesFile}" "${
concatStringsSep " " [
"CREATE TABLE IF NOT EXISTS zen_workspaces ("
"id INTEGER PRIMARY KEY,"
"uuid TEXT UNIQUE NOT NULL,"
"name TEXT NOT NULL,"
"icon TEXT,"
"container_id INTEGER,"
"position INTEGER NOT NULL DEFAULT 0,"
"created_at INTEGER NOT NULL,"
"updated_at INTEGER NOT NULL"
");"
]
}" || exit 1
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
columns=($(${sqlite3} "${placesFile}" "SELECT name FROM pragma_table_info('zen_workspaces');"))
if [[ ! "''${columns[@]}" =~ "theme_type" ]]; then
${sqlite3} "${placesFile}" "ALTER TABLE zen_workspaces ADD COLUMN theme_type TEXT;" || exit 1
fi
if [[ ! "''${columns[@]}" =~ "theme_colors" ]]; then
${sqlite3} "${placesFile}" "ALTER TABLE zen_workspaces ADD COLUMN theme_colors TEXT;" || exit 1
fi
if [[ ! "''${columns[@]}" =~ "theme_opacity" ]]; then
${sqlite3} "${placesFile}" "ALTER TABLE zen_workspaces ADD COLUMN theme_opacity REAL;" || exit 1
fi
if [[ ! "''${columns[@]}" =~ "theme_rotation" ]]; then
${sqlite3} "${placesFile}" "ALTER TABLE zen_workspaces ADD COLUMN theme_rotation INTEGER;" || exit 1
fi
if [[ ! "''${columns[@]}" =~ "theme_texture" ]]; then
${sqlite3} "${placesFile}" "ALTER TABLE zen_workspaces ADD COLUMN theme_texture REAL;" || exit 1
fi
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
# Reference: https://github.com/zen-browser/desktop/blob/4e2dfd8a138fd28767bb4799a3ca9d8aab80430e/src/zen/workspaces/ZenWorkspacesStorage.mjs#L141-L149
${sqlite3} "${placesFile}" "${
(concatStringsSep " " [
"INSERT OR REPLACE INTO zen_workspaces ("
"uuid,"
"name,"
"icon,"
"container_id,"
"position,"
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
"theme_type,"
"theme_colors,"
"theme_opacity,"
"theme_rotation,"
"theme_texture,"
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
"created_at,"
"updated_at"
") VALUES "
])
+ (pipe profile.spaces [
(mapAttrsToList (_: s: [
"'{${s.id}}'"
"'${s.name}'"
(
if isNull s.icon
then "NULL"
else "'${s.icon}'"
)
(
if isNull s.container
then "NULL"
else toString s.container
)
(toString s.position)
(
if isNull s.theme.type
then "NULL"
else "'${s.theme.type}'"
)
(
if isNull s.theme.colors
then "NULL"
else "'${toJSON (map (c: {
inherit (c) algorithm lightness position type;
c = [c.red c.green c.blue];
isCustom = c.custom;
isPrimary = c.primary;
})
s.theme.colors)}'"
)
(
if isNull s.theme.opacity
then "NULL"
else toString s.theme.opacity
)
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
(
if isNull s.theme.rotation
then "NULL"
else toString s.theme.rotation
)
(
if isNull s.theme.texture
then "NULL"
else toString s.theme.texture
)
"COALESCE((SELECT created_at FROM zen_workspaces WHERE uuid = '{${s.id}}'), strftime('%s', 'now'))"
"strftime('%s', 'now')"
]))
(map (row: concatStringsSep "," row))
(concatMapStringsSep "," (row: "(${row})"))
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
])
}" || exit 1
'';
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
deleteSpaces = ''
${sqlite3} "${placesFile}" "DELETE FROM zen_workspaces ${
if profile.spaces != {}
then "WHERE "
else ""
}${concatMapAttrsStringSep " AND " (_: s: "NOT uuid = '{${s.id}}'") profile.spaces}" || exit 1
'';
in
nameValuePair scriptFile {
source = getExe (pkgs.writeShellScriptBin "places_update_${profileName}" ''
# This file is generated by Zen browser Home Manager module, please to not change it since it
# will be overridden and executed on every rebuild of the home environment.
function update_spaces() {
${optionalString (profile.spaces != {}) insertSpaces}
${optionalString (profile.spacesForce) deleteSpaces}
}
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
error="$(update_spaces 2>&1 1>/dev/null)"
if [[ "$?" -ne 0 ]]; then
if [[ "$error" == *"database is locked"* ]]; then
echo "$error"
YELLOW="\033[1;33m"
NC="\033[0m"
echo -e "zen-update-places:''${YELLOW} Atempted to update the \"zen_workspaces\" table with values declared in \"programs.zen.profiles.\"${profileName}\".spaces\".''${NC}"
echo -e "zen-update-places:''${YELLOW} Failed to update \"${placesFile}\" due to a Zen browser instance for profile \"${profileName}\" being opened, please close''${NC}"
echo -e "zen-update-places:''${YELLOW} Zen browser and rebuild the home environment to rerun \"home-manager-${config.home.username}.service\" and update places.sqlite.''${NC}"
else
echo "$error"
fi
exit 1
else
exit 0
fi
'');
onChange = ''
${config.home.homeDirectory}/${scriptFile}
if [[ "$?" -ne 0 ]]; then
RED="\033[0;31m"
NC="\033[0m"
echo -e "zen-update-places:''${RED} Failed to update places.sqlite file for Zen browser \"${profileName}\" profile.''${NC}"
fi
'';
fix: run spaces script just on settings change (#96) * fix(hm-module,spaces): missing columns when Zen is opened before the spaces table is created Appearently, opening Zen before the spaces service runs could cause the table not having the theme columns. Because of this, the CREATE TABLE IF NOT EXISTS query would not run, but the columns would still not be present. This commit adds the column via a bash script plus an ALTER TABLE query, mimicking more what Zen does in it JavaScript code. * style(hm-module): run nix fmt on hm-module * refactor(hm-module,spaces): move bash scripts and sql queries directly to service executable This was made to reduce the amount of derivations being build to just one per-profile. Also, this helps make all the logic of the spaces activation be into a single executable for debugging and error handling. * feat(hm-module,spaces): error handling for locked database Provide a useful error message to the user if the service fails due to opened Zen browser instance. * feat(hm-module,spaces): implement places.sqlite updating via home.file.* script This fixed the problem of the systemd service being rerun on every home-manager rebuild. Now the places.sqlite updating script just runs when something needs to be updated on it. We use home.file.* to store the script on the home directory and take advantage of the home.file.*.onChange option to run it. * feat(hm-module,spaces)!: change type of colors values to integer between 0 and 255 * docs: change bold headers to markdown headers to add support #links * docs: [work]spaces options documentation and example
2025-08-22 17:06:40 -03:00
executable = true;
force = true;
}) (filterAttrs (_: profile: profile.spaces != {} || profile.spacesForce) cfg.profiles));
2025-04-02 20:18:24 +05:00
};
}