diff --git a/hosts/common/configs/user/gui/clipbook/copy.sh b/hosts/common/configs/user/gui/clipbook/copy.sh new file mode 100755 index 0000000..e77268d --- /dev/null +++ b/hosts/common/configs/user/gui/clipbook/copy.sh @@ -0,0 +1,23 @@ +list() { + echo -en "\0keep-selection\x1ftrue\n" + jq -r 'keys[]' "$BOOKMARKS" +} + +handle() { + key="$1" + data=$(jq -r --arg key "$key" '.[$key]' "$BOOKMARKS") + + type=$(echo "$data" | jq -r '.type') + content=$(echo "$data" | jq -r '.content') + + if [[ "$type" == "file" ]]; then + wl-copy < "$content" + elif [[ "$type" == "text" ]]; then + echo -n "$content" | wl-copy + fi +} + +case ${ROFI_RETV} in + 0) list ;; + 1) handle "$@" ;; +esac diff --git a/hosts/common/configs/user/gui/clipbook/default.nix b/hosts/common/configs/user/gui/clipbook/default.nix new file mode 100644 index 0000000..b896b58 --- /dev/null +++ b/hosts/common/configs/user/gui/clipbook/default.nix @@ -0,0 +1,28 @@ +{ + user ? throw "user argument is required", + home ? throw "home argument is required", +}: +{ + config, + lib, + pkgs, + ... +}: +let + hmConfig = config.home-manager.users.${user}; +in +{ + home-manager.users.${user} = { + imports = [ ./options.nix ]; + + programs.clipbook.enable = true; + + wayland.windowManager.hyprland.settings.bind = + let + clipbook-rofi = lib.meta.getExe hmConfig.programs.clipbook.finalPackage; + in + [ + "$mod, c, exec, ${clipbook-rofi}" + ]; + }; +} diff --git a/hosts/common/configs/user/gui/clipbook/options.nix b/hosts/common/configs/user/gui/clipbook/options.nix new file mode 100644 index 0000000..6f68bca --- /dev/null +++ b/hosts/common/configs/user/gui/clipbook/options.nix @@ -0,0 +1,69 @@ +{ + config, + lib, + pkgs, + ... +}: +let + cfg = config.programs.clipbook; +in +{ + options.programs.clipbook = + with lib; + with types; + { + enable = mkEnableOption "Clipbook"; + + bookmarks = + let + bookmarksOptions = + { config, ... }: + { + options = { + source = mkOption { + type = nullOr str; + description = "Path to the file to copy."; + default = null; + }; + + text = mkOption { + type = nullOr str; + description = "Text to copy."; + default = null; + }; + }; + }; + in + mkOption { + type = attrsOf (submodule bookmarksOptions); + description = "Clipboard Bookmarks."; + default = { }; + }; + + finalPackage = mkOption { + type = package; + description = "The clipbook rofi package."; + default = pkgs.callPackage ./rofi.nix { + rofi = config.programs.rofi.finalPackage; + bookmarks = builtins.mapAttrs (_: bookmark: { + type = if bookmark.source != null then "file" else "text"; + content = if bookmark.source != null then bookmark.source else bookmark.text; + }) cfg.bookmarks; + }; + readOnly = true; + }; + }; + + config = { + assertions = [ + { + assertion = builtins.all ( + bookmark: + (bookmark.source == null || bookmark.text == null) + && (bookmark.source != null || bookmark.text != null) + ) (builtins.attrValues cfg.bookmarks); + message = "Each bookmark must have one of 'source' or 'text' set."; + } + ]; + }; +} diff --git a/hosts/common/configs/user/gui/clipbook/rofi.nix b/hosts/common/configs/user/gui/clipbook/rofi.nix new file mode 100644 index 0000000..416660d --- /dev/null +++ b/hosts/common/configs/user/gui/clipbook/rofi.nix @@ -0,0 +1,25 @@ +{ + rofi ? throw "rofi package is required", + bookmarks ? throw "bookmarks argument is required", + lib, + pkgs, + ... +}: +let + copy = lib.meta.getExe ( + pkgs.writeShellApplication { + name = "copy"; + runtimeInputs = with pkgs; [ + jq + wl-clipboard + ]; + runtimeEnv.BOOKMARKS = (pkgs.formats.json { }).generate "bookmarks.json" bookmarks; + text = builtins.readFile ./copy.sh; + } + ); +in +pkgs.writeShellApplication { + name = "clipbook-rofi"; + runtimeInputs = [ rofi ]; + text = "rofi -modi \"copy:${copy}\" -show copy"; +} diff --git a/hosts/common/configs/user/gui/cliphist/default.nix b/hosts/common/configs/user/gui/cliphist/default.nix index cab9b3b..f09c871 100644 --- a/hosts/common/configs/user/gui/cliphist/default.nix +++ b/hosts/common/configs/user/gui/cliphist/default.nix @@ -15,10 +15,7 @@ in environment.persistence."/cache"."${home}/.cache/cliphist" = { }; home-manager.users.${user} = { - home.packages = with pkgs; [ - wl-clipboard - cliphist - ]; + home.packages = with pkgs; [ cliphist ]; systemd.user.services = { cliphist = { diff --git a/hosts/common/configs/user/gui/obsidian/options.nix b/hosts/common/configs/user/gui/obsidian/options.nix index 7c3889b..848ea1b 100644 --- a/hosts/common/configs/user/gui/obsidian/options.nix +++ b/hosts/common/configs/user/gui/obsidian/options.nix @@ -496,18 +496,21 @@ in { assertion = builtins.all ( vault: - builtins.all (snippet: snippet.source == null || snippet.text == null) vault.settings.cssSnippets + builtins.all ( + snippet: + (snippet.source == null || snippet.text == null) && (snippet.source != null || snippet.text != null) + ) vault.settings.cssSnippets ) (builtins.attrValues cfg.vaults); - message = "Only one of `source` and `text` must be set"; + message = "Each CSS snippet must have one of 'source' or 'text' set"; } { assertion = builtins.all ( vault: - builtins.all (file: file.source == null || file.text == null) ( - builtins.attrValues vault.settings.extraFiles - ) + builtins.all ( + file: (file.source == null || file.text == null) && (file.source != null || file.text != null) + ) (builtins.attrValues vault.settings.extraFiles) ) (builtins.attrValues cfg.vaults); - message = "Only one of `source` and `text` must be set"; + message = "Each extra file must have one of 'source' or 'text' set"; } ]; }; diff --git a/hosts/common/configs/user/gui/vscode/default.nix b/hosts/common/configs/user/gui/vscode/default.nix index f16e2f4..cec8f5c 100644 --- a/hosts/common/configs/user/gui/vscode/default.nix +++ b/hosts/common/configs/user/gui/vscode/default.nix @@ -113,6 +113,6 @@ in password-store = "basic"; }; - wayland.windowManager.hyprland.settings.bind = [ "$mod, c, exec, ${lib.meta.getExe pkgs.vscode}" ]; + wayland.windowManager.hyprland.settings.bind = [ "$mod, e, exec, ${lib.meta.getExe pkgs.vscode}" ]; }; } diff --git a/hosts/common/configs/user/gui/wl-clipboard/default.nix b/hosts/common/configs/user/gui/wl-clipboard/default.nix new file mode 100644 index 0000000..81ec902 --- /dev/null +++ b/hosts/common/configs/user/gui/wl-clipboard/default.nix @@ -0,0 +1,8 @@ +{ + user ? throw "user argument is required", + home ? throw "home argument is required", +}: +{ pkgs, ... }: +{ + home-manager.users.${user}.home.packages = with pkgs; [ wl-clipboard ]; +} diff --git a/hosts/common/configs/user/options.nix b/hosts/common/configs/user/options.nix index b2582a1..af3be5e 100644 --- a/hosts/common/configs/user/options.nix +++ b/hosts/common/configs/user/options.nix @@ -1,28 +1,27 @@ { lib, ... }: -let - userOptions = - with lib; - with types; - { config, ... }: - { - options = { - email = mkOption { - type = nullOr str; - description = "Email address of the user."; - }; - - fullName = mkOption { - type = nullOr str; - description = "Full name of the user."; - }; - }; - }; -in { options = with lib; with types; { - users.users = mkOption { type = attrsOf (submodule userOptions); }; + users.users = + let + userOptions = + { config, ... }: + { + options = { + email = mkOption { + type = nullOr str; + description = "Email address of the user."; + }; + + fullName = mkOption { + type = nullOr str; + description = "Full name of the user."; + }; + }; + }; + in + mkOption { type = attrsOf (submodule userOptions); }; }; } diff --git a/hosts/eirene/users/nick/default.nix b/hosts/eirene/users/nick/default.nix index e56998f..21d748d 100644 --- a/hosts/eirene/users/nick/default.nix +++ b/hosts/eirene/users/nick/default.nix @@ -4,6 +4,8 @@ let # FIXME: https://github.com/NixOS/nixpkgs/issues/305643 user = "nick"; home = "/home/nick"; + + hmConfig = config.home-manager.users.${user}; in { imports = [ @@ -49,6 +51,7 @@ in (import ../../../common/configs/user/gui/brightnessctl { inherit user home; }) (import ../../../common/configs/user/gui/btop { inherit user home; }) (import ../../../common/configs/user/gui/chromium { inherit user home; }) + (import ../../../common/configs/user/gui/clipbook { inherit user home; }) (import ../../../common/configs/user/gui/cliphist { inherit user home; }) (import ../../../common/configs/user/gui/darktable { inherit user home; }) (import ../../../common/configs/user/gui/discord { inherit user home; }) @@ -73,6 +76,7 @@ in (import ../../../common/configs/user/gui/transmission { inherit user home; }) (import ../../../common/configs/user/gui/vscode { inherit user home; }) (import ../../../common/configs/user/gui/wev { inherit user home; }) + (import ../../../common/configs/user/gui/wl-clipboard { inherit user home; }) (import ../../../common/configs/user/gui/x11 { inherit user home; }) (import ../../../common/configs/user/gui/xdg { inherit user home; }) @@ -123,6 +127,11 @@ in "gpg/pass".sopsFile = ../../../../secrets/personal/secrets.yaml; }; + programs.clipbook.bookmarks = { + "SSH Key Passphrase".source = hmConfig.sops.secrets."ssh/personal/pass".path; + "GPG Passphrase".source = hmConfig.sops.secrets."gpg/personal/pass".path; + }; + theme.wallpaper = ../../../../static/wallpapers/clouds.png; }; } diff --git a/hosts/elara/users/nikara/default.nix b/hosts/elara/users/nikara/default.nix index 484302d..a16702b 100644 --- a/hosts/elara/users/nikara/default.nix +++ b/hosts/elara/users/nikara/default.nix @@ -4,6 +4,8 @@ let # FIXME: https://github.com/NixOS/nixpkgs/issues/305643 user = "nikara"; home = "/home/nikara"; + + hmConfig = config.home-manager.users.${user}; in { imports = [ @@ -45,6 +47,7 @@ in (import ../../../common/configs/user/gui/brightnessctl { inherit user home; }) (import ../../../common/configs/user/gui/btop { inherit user home; }) (import ../../../common/configs/user/gui/chromium { inherit user home; }) + (import ../../../common/configs/user/gui/clipbook { inherit user home; }) (import ../../../common/configs/user/gui/cliphist { inherit user home; }) (import ../../../common/configs/user/gui/emoji { inherit user home; }) (import ../../../common/configs/user/gui/firefox { inherit user home; }) @@ -65,6 +68,7 @@ in (import ../../../common/configs/user/gui/theme { inherit user home; }) (import ../../../common/configs/user/gui/vscode { inherit user home; }) (import ../../../common/configs/user/gui/wev { inherit user home; }) + (import ../../../common/configs/user/gui/wl-clipboard { inherit user home; }) (import ../../../common/configs/user/gui/x11 { inherit user home; }) (import ../../../common/configs/user/gui/xdg { inherit user home; }) @@ -159,6 +163,13 @@ in }; }; + programs.clipbook.bookmarks = { + "Personal SSH Key Passphrase".source = hmConfig.sops.secrets."ssh/personal/pass".path; + "Personal GPG Passphrase".source = hmConfig.sops.secrets."gpg/personal/pass".path; + "SAS SSH Key Passphrase".source = hmConfig.sops.secrets."ssh/sas/pass".path; + "SAS GPG Passphrase".source = hmConfig.sops.secrets."gpg/sas/pass".path; + }; + theme.wallpaper = ../../../../static/wallpapers/snow.jpg; }; }