2025-07-17 18:10:37 +02:00

113 lines
2.7 KiB
Nix

{ config, pkgs, lib, ... }:
let
cfg = config.nix-config.style;
powerMenu = pkgs.writeShellScriptBin "power-menu" ''
options=" Power Off\n Reboot\n Lock\n Suspend"
selected=$(echo -e "$options" | fuzzel --dmenu --prompt "Power Menu" --lines 4 --width 20)
case "$selected" in
" Power Off") systemctl poweroff ;;
" Reboot") systemctl reboot ;;
" Lock") hyprlock ;;
" Suspend") systemctl suspend ;;
*) exit 1 ;;
esac
'';
filePicker = pkgs.writeShellScriptBin "file-picker" ''
files=$(${lib.getExe pkgs.fd} . $HOME --type f)
filesShortened=$(echo "$files" | sed "s|$HOME|~|g" | awk -F/ '{print $(NF)" ("$0")"}')
selected=$(echo "$filesShortened" | fuzzel --dmenu --prompt "🔎 " --placeholder "File search" --index)
if [ -n "$selected" ]; then
# Since fuzzel was launched with the --index option the actual path is now files[selected]
selectedPlusOne=$((selected + 1))
file=$(echo "$files" | sed -n "''${selectedPlusOne}p")
xdg-open "$file"
# plus one
else
echo "No file selected"
exit 1
fi
'';
in
{
options.nix-config = {
powerMenu = lib.mkOption {
description = "Package to use as a power menu";
type = lib.types.package;
default = powerMenu;
};
launcher = lib.mkOption {
description = "Configuration for the launcher";
type = lib.types.package;
default = pkgs.fuzzel;
};
filePicker = lib.mkOption {
description = "Package to use as a file picker";
type = lib.types.package;
default = filePicker;
};
};
config = {
programs.fuzzel = {
enable = true;
settings = {
main = {
font = "monospace:size=${builtins.toString (cfg.fontSizes.applications - 1)}";
terminal = "${lib.getExe pkgs.kitty}";
layer = "overlay"; #or top?
use-bold = true;
dpi-aware = true;
icons-enabled = true;
match-mode = "fzf";
horizontal-pad = cfg.fontSizes.applications + 5;
vertical-pad = cfg.fontSizes.applications + 5;
inner-pad = cfg.fontSizes.applications;
show-actions = true;
lines = 12;
width = 50;
};
colors = {
background = "000000aa";
text = "ffffffaa";
# prompt
# placeholder
# input
match = "ffffffaa";
selection = "00000000";
selection-text = "ffffffbb";
selection-match = "ffffffaa";
};
border = {
width = 0;
radius = 15;
};
};
};
home.packages = with pkgs; [
powerMenu
filePicker
];
};
}