2020-09-02 04:37:42 +02:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
|
|
|
|
cfg = config.programs.i3status-rust;
|
|
|
|
|
2023-05-07 13:42:55 +02:00
|
|
|
settingsFormat = pkgs.formats.toml { };
|
2020-09-02 04:37:42 +02:00
|
|
|
|
|
|
|
in {
|
2023-03-16 12:48:55 +01:00
|
|
|
meta.maintainers = with lib.maintainers; [ farlion thiagokokada ];
|
2020-09-02 04:37:42 +02:00
|
|
|
|
2023-06-06 07:03:31 +02:00
|
|
|
imports = [
|
|
|
|
(mkRenamedOptionModule [
|
|
|
|
"programs"
|
|
|
|
"i3status-rust"
|
|
|
|
"bars"
|
|
|
|
"<name>"
|
|
|
|
"icons"
|
|
|
|
] [ "programs" "i3status-rust" "bars" "<name>" "settings" "icons" "icons" ])
|
|
|
|
(mkRenamedOptionModule [
|
|
|
|
"programs"
|
|
|
|
"i3status-rust"
|
|
|
|
"bars"
|
|
|
|
"<name>"
|
|
|
|
"theme"
|
|
|
|
] [ "programs" "i3status-rust" "bars" "<name>" "settings" "theme" "theme" ])
|
|
|
|
];
|
|
|
|
|
2020-09-02 04:37:42 +02:00
|
|
|
options.programs.i3status-rust = {
|
|
|
|
enable = mkEnableOption "a replacement for i3-status written in Rust";
|
|
|
|
|
|
|
|
bars = mkOption {
|
|
|
|
type = types.attrsOf (types.submodule {
|
|
|
|
options = {
|
|
|
|
|
|
|
|
blocks = mkOption {
|
|
|
|
type = settingsFormat.type;
|
|
|
|
default = [
|
2023-03-16 12:48:55 +01:00
|
|
|
{ block = "cpu"; }
|
2020-09-02 04:37:42 +02:00
|
|
|
{
|
|
|
|
block = "disk_space";
|
|
|
|
path = "/";
|
|
|
|
info_type = "available";
|
2023-03-16 12:48:55 +01:00
|
|
|
interval = 20;
|
2020-09-02 04:37:42 +02:00
|
|
|
warning = 20.0;
|
|
|
|
alert = 10.0;
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $icon root: $available.eng(w:2) ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "memory";
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $icon $mem_total_used_percents.eng(w:2) ";
|
|
|
|
format_alt = " $icon_swap $swap_used_percents.eng(w:2) ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{
|
2023-03-16 12:48:55 +01:00
|
|
|
block = "sound";
|
|
|
|
click = [{
|
|
|
|
button = "left";
|
|
|
|
cmd = "pavucontrol";
|
|
|
|
}];
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "time";
|
2023-03-16 12:48:55 +01:00
|
|
|
interval = 5;
|
|
|
|
format = " $timestamp.datetime(f:'%a %d/%m %R') ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
];
|
|
|
|
description = ''
|
|
|
|
Configuration blocks to add to i3status-rust
|
|
|
|
<filename>config</filename>. See
|
|
|
|
<link xlink:href="https://github.com/greshake/i3status-rust/blob/master/blocks.md"/>
|
|
|
|
for block options.
|
|
|
|
'';
|
2021-10-09 11:14:08 +02:00
|
|
|
example = literalExpression ''
|
2020-09-02 04:37:42 +02:00
|
|
|
[
|
|
|
|
{
|
|
|
|
block = "disk_space";
|
|
|
|
path = "/";
|
|
|
|
info_type = "available";
|
|
|
|
interval = 60;
|
|
|
|
warning = 20.0;
|
|
|
|
alert = 10.0;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "sound";
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $icon $output_name {$volume.eng(w:2) |}";
|
|
|
|
click = [
|
|
|
|
{
|
|
|
|
button = "left";
|
|
|
|
cmd = "pavucontrol --tab=3";
|
|
|
|
}
|
|
|
|
];
|
2020-09-02 04:37:42 +02:00
|
|
|
mappings = {
|
2023-03-16 12:48:55 +01:00
|
|
|
"alsa_output.pci-0000_00_1f.3.analog-stereo" = "";
|
|
|
|
"bluez_sink.70_26_05_DA_27_A4.a2dp_sink" = "";
|
2020-09-02 04:37:42 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
];
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
settings = mkOption {
|
|
|
|
type = settingsFormat.type;
|
|
|
|
default = { };
|
|
|
|
description = ''
|
|
|
|
Any extra options to add to i3status-rust
|
|
|
|
<filename>config</filename>.
|
|
|
|
'';
|
2021-10-09 11:14:08 +02:00
|
|
|
example = literalExpression ''
|
2020-09-02 04:37:42 +02:00
|
|
|
{
|
|
|
|
theme = {
|
2023-03-16 12:48:55 +01:00
|
|
|
theme = "solarized-dark";
|
2020-09-02 04:37:42 +02:00
|
|
|
overrides = {
|
|
|
|
idle_bg = "#123456";
|
|
|
|
idle_fg = "#abcdef";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
default = {
|
|
|
|
default = {
|
|
|
|
blocks = [
|
|
|
|
{
|
|
|
|
block = "disk_space";
|
|
|
|
path = "/";
|
|
|
|
info_type = "available";
|
|
|
|
interval = 60;
|
|
|
|
warning = 20.0;
|
|
|
|
alert = 10.0;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "memory";
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $icon mem_used_percents ";
|
|
|
|
format_alt = " $icon $swap_used_percents ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "cpu";
|
|
|
|
interval = 1;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "load";
|
|
|
|
interval = 1;
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $icon $1m ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{ block = "sound"; }
|
|
|
|
{
|
|
|
|
block = "time";
|
|
|
|
interval = 60;
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $timestamp.datetime(f:'%a %d/%m %R') ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
description = ''
|
|
|
|
Attribute set of i3status-rust bars, each with their own configuration.
|
|
|
|
Each bar <varname>name</varname> generates a config file suffixed with
|
|
|
|
the bar's <varname>name</varname> from the attribute set, like so:
|
|
|
|
<filename>config-<replaceable>name</replaceable>.toml</filename>.
|
|
|
|
</para><para>
|
|
|
|
This way, multiple config files can be generated, such as for having a
|
|
|
|
top and a bottom bar.
|
|
|
|
</para><para>
|
|
|
|
See
|
|
|
|
<citerefentry>
|
|
|
|
<refentrytitle>i3status-rust</refentrytitle>
|
|
|
|
<manvolnum>1</manvolnum>
|
|
|
|
</citerefentry>
|
|
|
|
for options.
|
|
|
|
'';
|
2021-10-09 11:14:08 +02:00
|
|
|
example = literalExpression ''
|
2020-09-02 04:37:42 +02:00
|
|
|
bottom = {
|
|
|
|
blocks = [
|
|
|
|
{
|
|
|
|
block = "disk_space";
|
|
|
|
path = "/";
|
|
|
|
info_type = "available";
|
|
|
|
interval = 60;
|
|
|
|
warning = 20.0;
|
|
|
|
alert = 10.0;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "memory";
|
2023-03-16 12:48:55 +01:00
|
|
|
format_mem = " $icon $mem_used_percents ";
|
|
|
|
format_swap = " $icon $swap_used_percents ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "cpu";
|
|
|
|
interval = 1;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
block = "load";
|
|
|
|
interval = 1;
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $icon $1m ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
{ block = "sound"; }
|
|
|
|
{
|
|
|
|
block = "time";
|
|
|
|
interval = 60;
|
2023-03-16 12:48:55 +01:00
|
|
|
format = " $timestamp.datetime(f:'%a %d/%m %R') ";
|
2020-09-02 04:37:42 +02:00
|
|
|
}
|
|
|
|
];
|
|
|
|
settings = {
|
|
|
|
theme = {
|
2023-03-16 12:48:55 +01:00
|
|
|
theme = "solarized-dark";
|
2020-09-02 04:37:42 +02:00
|
|
|
overrides = {
|
|
|
|
idle_bg = "#123456";
|
|
|
|
idle_fg = "#abcdef";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
package = mkOption {
|
|
|
|
type = types.package;
|
|
|
|
default = pkgs.i3status-rust;
|
2021-10-09 11:14:08 +02:00
|
|
|
defaultText = literalExpression "pkgs.i3status-rust";
|
2020-09-02 04:37:42 +02:00
|
|
|
description = "Package providing i3status-rust";
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
2021-07-07 23:24:27 +02:00
|
|
|
assertions = [
|
|
|
|
(hm.assertions.assertPlatform "programs.i3status-rust" pkgs
|
|
|
|
platforms.linux)
|
2023-05-07 13:42:55 +02:00
|
|
|
{
|
|
|
|
assertion = lib.versionOlder cfg.package.version "0.31.0"
|
|
|
|
|| lib.versionAtLeast cfg.package.version "0.31.2";
|
|
|
|
message =
|
|
|
|
"Only i3status-rust <0.31.0 or ≥0.31.2 is supported due to a config format incompatibility.";
|
|
|
|
}
|
2021-07-07 23:24:27 +02:00
|
|
|
];
|
|
|
|
|
2020-09-02 04:37:42 +02:00
|
|
|
home.packages = [ cfg.package ];
|
|
|
|
|
2023-03-16 12:48:55 +01:00
|
|
|
xdg.configFile = mapAttrs' (cfgFileSuffix: cfgBar:
|
2023-06-06 07:03:31 +02:00
|
|
|
nameValuePair "i3status-rust/config-${cfgFileSuffix}.toml" ({
|
2021-08-01 00:54:47 +02:00
|
|
|
onChange = mkIf config.xsession.windowManager.i3.enable ''
|
|
|
|
i3Socket="''${XDG_RUNTIME_DIR:-/run/user/$UID}/i3/ipc-socket.*"
|
|
|
|
if [[ -S $i3Socket ]]; then
|
|
|
|
${config.xsession.windowManager.i3.package}/bin/i3-msg -s $i3Socket restart >/dev/null
|
|
|
|
fi
|
|
|
|
'';
|
2020-09-02 04:37:42 +02:00
|
|
|
|
2023-06-06 07:03:31 +02:00
|
|
|
source = settingsFormat.generate "config-${cfgFileSuffix}.toml"
|
|
|
|
({ block = cfgBar.blocks; } // cfgBar.settings);
|
2020-09-02 04:37:42 +02:00
|
|
|
})) cfg.bars;
|
|
|
|
};
|
|
|
|
}
|