From 7f21b51143baf37b665d20a7222e72c25fba1b69 Mon Sep 17 00:00:00 2001 From: ChUrl Date: Thu, 25 May 2023 20:25:26 +0200 Subject: [PATCH] Further refactor hyprland keybindings + integrate with rofi --- config/hyprland/hyprland.conf | 36 ++--------------------- home/christoph/default.nix | 13 +++----- home/modules/hyprland/default.nix | 49 ++++++++++++++++--------------- home/modules/hyprland/options.nix | 13 ++------ home/modules/rofi/default.nix | 29 ++++++++++-------- lib/rofi.nix | 2 +- 6 files changed, 52 insertions(+), 90 deletions(-) diff --git a/config/hyprland/hyprland.conf b/config/hyprland/hyprland.conf index d36a8b7d..5b40d4a9 100644 --- a/config/hyprland/hyprland.conf +++ b/config/hyprland/hyprland.conf @@ -3,6 +3,7 @@ source = ~/.config/hypr/autostart.conf source = ~/.config/hypr/floatingrules.conf source = ~/.config/hypr/input.conf +source = ~/.config/hypr/keybindings.conf source = ~/.config/hypr/monitors.conf source = ~/.config/hypr/polkit.conf source = ~/.config/hypr/translucentrules.conf @@ -70,44 +71,13 @@ gestures { workspace_swipe = off } -$mainMod = SUPER - -# bind = $mainMod, M, exit -# bind = $mainMod, P, pseudo # dwindle -# bind = $mainMod, J, togglesplit # dwindle - -# General stuff -bind = $mainMod, Q, killactive -bind = $mainMod, V, togglefloating -bind = $mainMod, F, fullscreen -bind = $mainMod, C, exec, clipman pick --tool=rofi # TODO: Theme + Generate this in a include file from nixos, depending on the menu option - -# Rofi -bind = $mainMod, A, exec, rofi -show drun -# bind = $mainMod, R, exec, rofi -show run -# bind = $mainMod, B, exec, rofi -show filebrowser +# TODO: Rofi bind = $mainMod, D, exec, ~/NixFlake/config/rofi/menus/systemd-podman.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 -# Launch apps -bind = $mainMod, T, exec, kitty -bind = $mainMod, E, exec, kitty fish -c "nnncd -a -P p" -bind = $mainMod, P, exec, hyprpicker -a -bind = $mainMod, S, exec, grim -g "$(slurp)" -bind = $mainMod CTRL, S, exec, grim -g "$(slurp)" - | wl-copy - -# Move windows in/out of groups -bind = $mainMod, G, togglegroup -bind = ALT, tab, changegroupactive -# bind = $mainMod, N, changegroupactive -# bind = $mainMod CTRL, h, moveintogroup, l -# bind = $mainMod CTRL, l, moveintogroup, r -# bind = $mainMod CTRL, k, moveintogroup, u -# bind = $mainMod CTRL, j, moveintogroup, d -# bind = $mainMod CTRL, G, moveoutofgroup +# TODO: These should probably be generated depending on the NixOS workspace config? # Move focus with mainMod + arrow keys bind = $mainMod, h, movefocus, l diff --git a/home/christoph/default.nix b/home/christoph/default.nix index ae136219..7080eba9 100644 --- a/home/christoph/default.nix +++ b/home/christoph/default.nix @@ -92,16 +92,11 @@ rec { keybindings = { main-mod = "SUPER"; - mod-bindings = { - "Q" = ["killactive"]; - "V" = ["togglefloating"]; - }; - bindings = { - "CTRL ALT, R" = [ - "moveworkspacetomonitor, 1 HDMI-A-1" - "moveworkspacetomonitor, 2 HDMI-A-1" - ]; + "$mainMod, E" = ["exec, kitty fish -c \"nnncd -a -P p\""]; + "$mainMod, P" = ["exec, hyprpicker -a"]; + "$mainMod, S" = ["exec, grim -g \"$(slurp)\""]; + "$mainMod CTRL, S" = ["exec, grim -g \"$(slurp)\" - | wl-copy"]; }; }; diff --git a/home/modules/hyprland/default.nix b/home/modules/hyprland/default.nix index 15812379..4c090e8b 100644 --- a/home/modules/hyprland/default.nix +++ b/home/modules/hyprland/default.nix @@ -95,26 +95,27 @@ in { # Keybindings home.file.".config/hypr/keybindings.conf".text = let + always-bind = { + # Hyprland control + "$mainMod, Q" = ["killactive"]; + "$mainMod, V" = ["togglefloating"]; + "$mainMod, F" = ["fullscreen"]; + "$mainMod, C" = ["exec, clipman pick --tool=rofi"]; + "$mainMod, G" = ["togglegroup"]; + "$mainMod, T" = ["exec, kitty"]; + "ALT, tab" = ["changegroupactive"]; + }; + mkBind = key: action: "bind = ${key}, ${action}"; mkBinds = key: actions: builtins.map (mkBind key) actions; - binds = lib.pipe cfg.keybindings.bindings [ + binds = lib.pipe (lib.mergeAttrs cfg.keybindings.bindings always-bind) [ (builtins.mapAttrs mkBinds) builtins.attrValues builtins.concatLists (builtins.concatStringsSep "\n") ]; - - mkModBind = key: action: "bind = $mainMod, ${key}, ${action}"; - mkModBinds = key: actions: builtins.map (mkModBind key) actions; - mod-binds = lib.pipe cfg.keybindings.mod-bindings [ - (builtins.mapAttrs mkModBinds) - builtins.attrValues - builtins.concatLists - (builtins.concatStringsSep "\n") - ]; in '' $mainMod = ${cfg.keybindings.main-mod} - ${mod-binds} ${binds} ''; @@ -170,6 +171,19 @@ in { (builtins.concatStringsSep "\n") ]; + # Set wallpaper for each configured monitor + home.file.".config/hypr/hyprpaper.conf".text = let + mkWallpaper = monitor: "wallpaper = ${monitor}, ${config.home.homeDirectory}/NixFlake/wallpapers/${cfg.theme}.png"; + wallpapers = lib.pipe cfg.monitors [ + builtins.attrNames + (builtins.map mkWallpaper) + (builtins.concatStringsSep "\n") + ]; + in '' + preload = ~/NixFlake/wallpapers/${cfg.theme}.png + ${wallpapers} + ''; + # Keyboard layout home.file.".config/hypr/input.conf".text = '' input { @@ -189,19 +203,6 @@ in { } ''; - # Set wallpaper for each configured monitor - home.file.".config/hypr/hyprpaper.conf".text = let - mkWallpaper = monitor: "wallpaper = ${monitor}, ${config.home.homeDirectory}/NixFlake/wallpapers/${cfg.theme}.png"; - wallpapers = lib.pipe cfg.monitors [ - builtins.attrNames - (builtins.map mkWallpaper) - (builtins.concatStringsSep "\n") - ]; - in '' - preload = ~/NixFlake/wallpapers/${cfg.theme}.png - ${wallpapers} - ''; - home.activation = { # NOTE: Keep the hyprland config symlinked, to allow easy changes with hotreload # TODO: Don't symlink at all, why not just tell Hyprland where the config is? Much easier diff --git a/home/modules/hyprland/options.nix b/home/modules/hyprland/options.nix index 5bc0ede1..90d53560 100644 --- a/home/modules/hyprland/options.nix +++ b/home/modules/hyprland/options.nix @@ -110,22 +110,13 @@ with mylib.modules; { example = '' "SUPER" ''; - }; - - mod-bindings = mkOption { - type = types.attrs; - description = "Hyprland keyboard shortcuts using the modifier key"; - example = '' - { - "Q" = ["killactive"]; - "V" = ["togglefloating"]; - } - ''; + default = "SUPER"; }; bindings = mkOption { type = types.attrs; description = "Hyprland keyboard shortcuts"; + default = {}; example = '' { "CTRL ALT, R" = [ diff --git a/home/modules/rofi/default.nix b/home/modules/rofi/default.nix index 7d678401..36b9abb0 100644 --- a/home/modules/rofi/default.nix +++ b/home/modules/rofi/default.nix @@ -7,36 +7,41 @@ mylib, pkgs, ... -}: -with lib; -with mylib.modules; let +}: let cfg = config.modules.rofi; in { options.modules.rofi = import ./options.nix {inherit lib mylib;}; - config = mkIf cfg.enable { + config = lib.mkIf cfg.enable { home.packages = with pkgs; [ rofi-wayland + ]; - # Power Menu - (mylib.rofi.mkSimpleMenu + modules.hyprland.keybindings = let + power-menu = + mylib.rofi.mkSimpleMenu "power" { "Poweroff" = "poweroff"; "Reboot" = "reboot"; "Reload Hyprland" = "hyprctl reload"; "Exit Hyprland" = "hyprctl dispatch exit"; - }) - ]; + }; + in { + bindings = { + "$mainMod, A" = ["exec, rofi -show drun"]; + "$mainMod, escape" = ["exec, \"${power-menu}\""]; + }; + }; home.activation = { # NOTE: Keep the rofi config symlinked, to allow easy changes with hotreload linkRofiConfig = - hm.dag.entryAfter ["writeBoundary"] - (mkLink "~/NixFlake/config/rofi/rofi.rasi" "~/.config/rofi/config.rasi"); + lib.hm.dag.entryAfter ["writeBoundary"] + (mylib.modules.mkLink "~/NixFlake/config/rofi/rofi.rasi" "~/.config/rofi/config.rasi"); linkRofiColors = - hm.dag.entryAfter ["writeBoundary"] - (mkLink "~/NixFlake/config/rofi/colors/${cfg.theme}.rasi" "~/.config/rofi/colors.rasi"); + lib.hm.dag.entryAfter ["writeBoundary"] + (mylib.modules.mkLink "~/NixFlake/config/rofi/colors/${cfg.theme}.rasi" "~/.config/rofi/colors.rasi"); }; }; } diff --git a/lib/rofi.nix b/lib/rofi.nix index 316c76c6..3bf6b7a6 100644 --- a/lib/rofi.nix +++ b/lib/rofi.nix @@ -23,7 +23,7 @@ ]; in prompt: attrs: - pkgs.writeScriptBin "rofi-menu-${prompt}" '' + pkgs.writeScript "rofi-menu-${prompt}" '' #! ${pkgs.fish}/bin/fish # OPTIONS contains all possible values Rofi will display