From f5d41c655f055a9ca53342c30ab51818bf1dd19c Mon Sep 17 00:00:00 2001 From: ChUrl Date: Thu, 25 May 2023 19:58:23 +0200 Subject: [PATCH] Introduce rofi lib func for simple chooser-action menu --- config/hyprland/hyprland.conf | 2 +- config/rofi/menus/power.fish | 24 ------------- home/modules/rofi/default.nix | 15 +++++--- lib/rofi.nix | 65 +++++++++++++++++++++++++++++++---- 4 files changed, 70 insertions(+), 36 deletions(-) delete mode 100755 config/rofi/menus/power.fish diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index 3ec52ba3..d36a8b7d 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -87,7 +87,7 @@ bind = $mainMod, A, exec, rofi -show drun # bind = $mainMod, R, exec, rofi -show run # bind = $mainMod, B, exec, rofi -show filebrowser bind = $mainMod, D, exec, ~/NixFlake/config/rofi/menus/systemd-podman.fish -bind = $mainMod, escape, exec, ~/NixFlake/config/rofi/menus/power.fish +bind = $mainMod, escape, exec, rofi-menu-power bind = $mainMod, O, exec, ~/NixFlake/config/rofi/menus/lectures.fish bind = $mainMod, M, exec, ~/NixFlake/config/rofi/menus/keybinds.fish bind = $mainMod, U, exec, ~/NixFlake/config/rofi/menus/vpn.fish diff --git a/config/rofi/menus/power.fish b/config/rofi/menus/power.fish deleted file mode 100755 index 51d5b1dd..00000000 --- a/config/rofi/menus/power.fish +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env fish - -# User chooses option -set OPTIONS "Poweroff" "Reboot" "Reload Hyprland" "Exit Hyprland" -set OPTION (echo -e (string join "\n" $OPTIONS) | rofi -dmenu -p " power " -i) -if not contains $OPTION $OPTIONS - exit -end - -# Set command -if test "Poweroff" = $OPTION - set ACTION "poweroff" -else if test "Reboot" = $OPTION - set ACTION "reboot" -else if test "Reload Hyprland" = $OPTION - set ACTION "hyprctl reload" -else if test "Exit Hyprland" = $OPTION - set ACTION "hyprctl dispatch exit" -else - exit -end - -# Execute command -eval $ACTION \ No newline at end of file diff --git a/home/modules/rofi/default.nix b/home/modules/rofi/default.nix index 11c0bcdf..7d678401 100644 --- a/home/modules/rofi/default.nix +++ b/home/modules/rofi/default.nix @@ -17,12 +17,17 @@ in { config = mkIf cfg.enable { home.packages = with pkgs; [ rofi-wayland - ]; - home.file.".config/rofi/menu-power.fish".text = mylib.rofi.mkSimpleMenu { - "Poweroff" = "poweroff"; - "Reload Hyprland" = "hyprctl reload"; - }; + # Power Menu + (mylib.rofi.mkSimpleMenu + "power" + { + "Poweroff" = "poweroff"; + "Reboot" = "reboot"; + "Reload Hyprland" = "hyprctl reload"; + "Exit Hyprland" = "hyprctl dispatch exit"; + }) + ]; home.activation = { # NOTE: Keep the rofi config symlinked, to allow easy changes with hotreload diff --git a/lib/rofi.nix b/lib/rofi.nix index dc99359a..316c76c6 100644 --- a/lib/rofi.nix +++ b/lib/rofi.nix @@ -11,11 +11,64 @@ # } mkSimpleMenu = let # Makes a string like ''"Poweroff" "Reload Hyprland"'' - unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" builtins.attrNames attrs}\""; - in - prompt: attrs: '' - #! ${pkgs.fish}/bin/fish + unpack-options = attrs: "\"${lib.concatStringsSep "\" \"" (builtins.attrNames attrs)}\""; - set OPTIONS ${unpack-options attrs} - ''; + mkCase = option: action: "else if test \"${option}\" = $OPTION\n set ACTION \"${action}\""; + + cases = attrs: + lib.pipe attrs [ + (builtins.mapAttrs mkCase) + builtins.attrValues + (builtins.concatStringsSep "\n") + ]; + in + prompt: attrs: + pkgs.writeScriptBin "rofi-menu-${prompt}" '' + #! ${pkgs.fish}/bin/fish + + # OPTIONS contains all possible values Rofi will display + set OPTIONS ${unpack-options attrs} + + # We choose a single OPTION using Rofi + set OPTION (echo -e (string join "\n" $OPTIONS) | rofi -dmenu -p " ${prompt} " -i) + + # Check if the chosen OPTION is a valid choice from OPTIONS + if not contains $OPTION $OPTIONS + exit + end + + # Set a command to execute based on the chosen OPTION + if false + exit # Easier to generate with this + ${cases attrs} + else + exit + end + + # Execute the command + eval $ACTION + ''; + + # Receives attrs like: + # { + # optionA = "exa -1 -D ~/Notes/TU"; + # optionB = "exa -1 -D ~/Notes/TU/$OPTIONA/Lecture | grep \".pdf\""; + # commandB = "xdg-open ~/Notes/TU/$OPTIONA/Lecture/$OPTIONB"; + # } + # + # Keys: + # - optionA, optionB # Command that generates Rofi options: + # exa -1 -D ~/Notes/TU + # cat /etc/rofi-vpns + # - commandA, commandB # Action to execute after sth. was chosen (mutually excl. with command) + # - actionsA, actionsB # Configure actions by lookup (mutually excl. with command): + # actionsB = {"status" = "systemctl status..."} + # - colorA, colorB # Configure highlighting conditions: + # colorA = {"red" = "systemctl ... | grep ..."}; + # + # Use $OPTIONA and $OPTIONB to use the options chosen by option-command and rofi + # Use $EVALA and $EVALB to use the outputs generated by command + mkMenu = let + in + prompt: attrs: ""; }