flake/modules/home/desktop/i3.nix
2025-08-02 23:55:23 +00:00

148 lines
4.7 KiB
Nix

{ pkgs, lib, config, osConfig, ... }:
let
fsss = with pkgs;
writeShellApplication {
name = "fsss";
runtimeInputs = [ flameshot curl xsel ];
text = ''
flameshot gui -r -s > /tmp/ss.png;if [ ! -s /tmp/ss.png ]; then
exit 1
fi
AUTH=$(cat ${config.sops.secrets.zipline-auth.path})
curl -H "authorization: $AUTH" https://share.muon.host/api/upload -F file=@/tmp/ss.png -H "Content-Type: multipart/form-data" -H "Format: date" -H "Image-Compression-Percent: 90" -H "No-JSON: true" | tr -d '\n' | xsel -ib;
'';
};
in with lib; {
options.mods.i3.enable = mkEnableOption "enables i3";
options.mods.battery.enable = mkEnableOption "enables battery";
config = mkIf config.mods.i3.enable {
services.unclutter.enable = true;
programs.rofi.enable = true;
programs.i3status-rust = {
enable = true;
bars.default = lib.mkMerge [
{
blocks = lib.mkBefore [
{
block = "privacy";
driver = [ { name = "v4l"; } { name = "pipewire"; } ];
}
{
block = "net";
format = " $icon ";
inactive_format = " $icon ";
}
];
}
(lib.mkIf config.mods.battery.enable {
blocks = [{
block = "battery";
format = " $icon $percentage ";
# format_alt =
# " $icon $percentage {$time_remaining.dur(hms:true, min_unit:m) |}";
}];
})
{
settings.theme.overrides = lib.mkMerge [
{ separator = ""; }
config.lib.stylix.i3status-rust.bar
];
icons = "awesome5";
blocks = lib.mkAfter [
{
block = "sound";
format = " $icon {$volume |} ";
click = [{
button = "left";
cmd = "${lib.getExe pkgs.pavucontrol}";
}];
}
{
block = "time";
format = "$icon $timestamp.datetime(f:'%Y-%m-%d %a %H:%M:%S') ";
# format_alt = "$icon $timestamp.datetime(f:'%Y-%m-%d %H:%M') ";
interval = 1;
}
];
}
];
};
xsession.windowManager.i3 = let
modifier = "Mod4";
wsAmount = 10;
genSpaces = f: map builtins.toString (builtins.genList f wsAmount);
workspaces = genSpaces (x: x + 1);
in {
enable = true;
config = {
modifier = modifier;
terminal = "alacritty";
menu = "rofi -show drun";
window = {
titlebar = false;
hideEdgeBorders = "smart";
};
defaultWorkspace = "workspace number 1";
workspaceAutoBackAndForth = true;
focus.wrapping = "yes";
# startup = [ ] ++ lib.optionals config.mods.social.enable [{
# command = "exec vesktop";
# }];
assigns = {
"2" = [{ class = "Vesktop"; }];
"3" = [{ class = "^Steam$"; }];
};
keybindings = let
# modKeyComb: string -> valueAction: string
# -> keys: [string] -> values: [string]
# -> keybindings: attrSet { string -> string }
zipBinds = comb: action: keys: values:
(builtins.listToAttrs (zipListsWith (k: v: {
name = "${modifier}${comb}${k}";
value = "${action} ${v}";
}) keys values));
moveKeys = [ "h" "j" "k" "l" ];
moveDirs = [ "left" "down" "up" "right" ];
workspKeys = genSpaces (x: mod (x + 1) wsAmount);
in mkOptionDefault ((zipBinds "+" "focus" moveKeys moveDirs)
// (zipBinds "+Shift+" "move" moveKeys moveDirs)
// (zipBinds "+" "workspace number" workspKeys workspaces)
// (zipBinds "+Shift+" "move container to workspace number" workspKeys
workspaces) // {
"XF86AudioRaiseVolume" =
"exec --no-startup-id pactl set-sink-volume 0 +2%";
"XF86AudioLowerVolume" =
"exec --no-startup-id pactl set-sink-volume 0 -2%";
"Print" = "exec ${getExe fsss}";
});
bars = let
status_conf =
"${config.xdg.configHome}/i3status-rust/config-default.toml";
stylix_bar = {
mode = "dock";
hiddenState = "hide";
position = "bottom";
statusCommand = "${getExe pkgs.i3status-rust} ${status_conf}";
command = "${pkgs.i3}/bin/i3bar";
workspaceButtons = true;
workspaceNumbers = true;
trayOutput = "primary";
} // config.lib.stylix.i3.bar;
in [ stylix_bar ];
};
};
};
}