23
hosts/common/configs/user/gui/clipbook/copy.sh
Executable file
23
hosts/common/configs/user/gui/clipbook/copy.sh
Executable file
@@ -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
|
28
hosts/common/configs/user/gui/clipbook/default.nix
Normal file
28
hosts/common/configs/user/gui/clipbook/default.nix
Normal file
@@ -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}"
|
||||
];
|
||||
};
|
||||
}
|
69
hosts/common/configs/user/gui/clipbook/options.nix
Normal file
69
hosts/common/configs/user/gui/clipbook/options.nix
Normal file
@@ -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.";
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
25
hosts/common/configs/user/gui/clipbook/rofi.nix
Normal file
25
hosts/common/configs/user/gui/clipbook/rofi.nix
Normal file
@@ -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";
|
||||
}
|
Reference in New Issue
Block a user