From 51dc5e80c4184eed83b214c4f6856c8a781b9f59 Mon Sep 17 00:00:00 2001 From: Nils Pukropp Date: Wed, 16 Sep 2026 15:53:19 +0200 Subject: [PATCH] feat(menu) added launcher, bt menu, clipboard --- fish/completions/enqs-guard.fish | 46 ++++++++++++ fish/completions/enqs-jail.fish | 70 +++++++++++++++++++ hypr/hyprpaper.conf | 2 +- hypr/lua/rules/windows.lua | 6 +- mimeapps.list | 2 +- .../headroom-private.service | 1 + .../headroom-work.service | 1 + systemd/user/headroom-private.service | 13 ++++ systemd/user/headroom-work.service | 13 ++++ 9 files changed, 151 insertions(+), 3 deletions(-) create mode 100644 fish/completions/enqs-guard.fish create mode 100644 fish/completions/enqs-jail.fish create mode 120000 systemd/user/default.target.wants/headroom-private.service create mode 120000 systemd/user/default.target.wants/headroom-work.service create mode 100644 systemd/user/headroom-private.service create mode 100644 systemd/user/headroom-work.service diff --git a/fish/completions/enqs-guard.fish b/fish/completions/enqs-guard.fish new file mode 100644 index 0000000..0a843cc --- /dev/null +++ b/fish/completions/enqs-guard.fish @@ -0,0 +1,46 @@ +# Print an optspec for argparse to handle cmd's options that are independent of any subcommand. +function __fish_enqs_guard_global_optspecs + string join \n h/help V/version +end + +function __fish_enqs_guard_needs_command + # Figure out if the current invocation already has a command. + set -l cmd (commandline -opc) + set -e cmd[1] + argparse -s (__fish_enqs_guard_global_optspecs) -- $cmd 2>/dev/null + or return + if set -q argv[1] + # Also print the command, so this can be used to figure out what it is. + echo $argv[1] + return 1 + end + return 0 +end + +function __fish_enqs_guard_using_subcommand + set -l cmd (__fish_enqs_guard_needs_command) + test -z "$cmd" + and return 1 + contains -- $cmd[1] $argv +end + +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -s V -l version -d 'Print version' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "hook" -d 'Answer as a PreToolUse hook; reads the event from stdin (Claude Code)' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "session-start" -d 'Answer as a SessionStart hook (Claude Code)' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "status" -d 'Show the current guard state' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "init" -d 'Create a configuration template' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "mode" -d 'Set what the guard does' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "add" -d 'Put a project on one of the lists' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "remove" -d 'Take a project off one of the lists' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "check" -d 'Check whether a path is blocked' +complete -c enqs-guard -n "__fish_enqs_guard_needs_command" -f -a "completions" -d 'Print a tab completion script for a shell' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand hook" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand session-start" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand status" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand init" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand mode" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand add" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand remove" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand check" -s h -l help -d 'Print help' +complete -c enqs-guard -n "__fish_enqs_guard_using_subcommand completions" -s h -l help -d 'Print help' diff --git a/fish/completions/enqs-jail.fish b/fish/completions/enqs-jail.fish new file mode 100644 index 0000000..dfd01e4 --- /dev/null +++ b/fish/completions/enqs-jail.fish @@ -0,0 +1,70 @@ +# Print an optspec for argparse to handle cmd's options that are independent of any subcommand. +function __fish_enqs_jail_global_optspecs + string join \n h/help V/version +end + +function __fish_enqs_jail_needs_command + # Figure out if the current invocation already has a command. + set -l cmd (commandline -opc) + set -e cmd[1] + argparse -s (__fish_enqs_jail_global_optspecs) -- $cmd 2>/dev/null + or return + if set -q argv[1] + # Also print the command, so this can be used to figure out what it is. + echo $argv[1] + return 1 + end + return 0 +end + +function __fish_enqs_jail_using_subcommand + set -l cmd (__fish_enqs_jail_needs_command) + test -z "$cmd" + and return 1 + contains -- $cmd[1] $argv +end + +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -s h -l help -d 'Print help (see more with \'--help\')' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -s V -l version -d 'Print version' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "register" -d 'Register a directory as a jail' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "unregister" -d 'Remove a registration' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "list" -d 'Show the registered jails' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "show" -d 'Show the settings a jail would run under' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "check" -d 'Check the prerequisites' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "allow" -d 'Re-open one path inside a jail' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "escape" -d 'Let one command run outside the sandbox, leaving the jail' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "revoke" -d 'Take a grant back' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "grants" -d 'Show the exceptions in force for a jail' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "completions" -d 'Print a tab completion script for a shell' +complete -c enqs-jail -n "__fish_enqs_jail_needs_command" -f -a "run" -d 'Start a session in a registered jail' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l name -d 'The name of the jail; the directory name by default' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l toolchain -d 'Toolchain whose caches stay readable; detected from the project when not given' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l deny-read -d 'Path hidden inside the jail; replaces the default list' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l allow-read -d 'Path that stays readable inside the jail (repeatable)' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l allow-write -d 'Path that stays writable inside the jail (repeatable)' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l add-dir -d 'Additional working directory inside the jail (repeatable)' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l claude-config-dir -d 'Claude profile the session runs under, e.g. ~/.claude-work' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l no-git -d 'Do not release the git configuration' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l no-default-deny -d 'Do not use the default deny list' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -l force -d 'Overwrite an existing registration of this name' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand register" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand unregister" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand list" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand show" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand check" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand allow" -l for -d 'How long it should last, e.g. 30m, 2h, 7d' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand allow" -l reason -d 'Why it was needed, kept with the grant' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand allow" -l jail -d 'The jail; the current directory when left out' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand allow" -l write -d 'Make it writable as well as readable' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand allow" -l once -d 'Only for the next session' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand allow" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand escape" -l for -d 'How long it should last, e.g. 30m, 2h, 7d' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand escape" -l reason -d 'Why it was needed, kept with the grant' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand escape" -l jail -d 'The jail; the current directory when left out' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand escape" -l once -d 'Only for the next session' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand escape" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand revoke" -l jail -d 'The jail; the current directory when left out' -r +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand revoke" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand grants" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand completions" -s h -l help -d 'Print help' +complete -c enqs-jail -n "__fish_enqs_jail_using_subcommand run" -s h -l help -d 'Print help' diff --git a/hypr/hyprpaper.conf b/hypr/hyprpaper.conf index 7428142..9dc1d66 100644 --- a/hypr/hyprpaper.conf +++ b/hypr/hyprpaper.conf @@ -1,6 +1,6 @@ wallpaper { monitor = - path = ~/.wallpapers/takemi_1.jpg + path = ~/.wallpapers/takemi_3.jpg fit_mode = cover } diff --git a/hypr/lua/rules/windows.lua b/hypr/lua/rules/windows.lua index c580800..5064ff6 100644 --- a/hypr/lua/rules/windows.lua +++ b/hypr/lua/rules/windows.lua @@ -8,7 +8,11 @@ -- ========================================== -- Dialogs and utility apps that should float in the center local DIALOG_TITLES = "^(Open Form|Open File|Select a File|Choose a file|Open Workspace|Choose Directory.*|Save As.*|Save File.*|branchdialog|pinentry-gtk-2|Confirm to replace files|File Operation Progress|Open Files.*|Anmelden.*|File Upload.*|TRuDI-Export laden)$" -local DIALOG_CLASSES = "^(pavucontrol|blueman-manager|nm-connection-editor|org.pulseaudio.pavucontrol|io.narl.proton-drive-linux-prompt)$" +-- pdfs-prompt is the Proton Drive search: io.narl.* is its GTK window, plain +-- pdfs-prompt the terminal `pdfs-prompt --fzf` spawns for itself. Every +-- terminal it knows how to start sets that same class, so this one rule holds +-- whichever is installed. +local DIALOG_CLASSES = "^(pavucontrol|blueman-manager|nm-connection-editor|org.pulseaudio.pavucontrol|io.narl.proton-drive-linux-prompt|pdfs-prompt)$" local STEAM = "^(steam)$" local GAMESCOPE = "^(gamescope)$" diff --git a/mimeapps.list b/mimeapps.list index a03724f..797c433 100644 --- a/mimeapps.list +++ b/mimeapps.list @@ -21,7 +21,7 @@ x-scheme-handler/claude-cli=claude-code-url-handler.desktop x-scheme-handler/msteams=teams-for-linux.desktop x-scheme-handler/slack=slack.desktop audio/flac=mpv.desktop -x-scheme-handler/codex=ChatGPT.desktop +x-scheme-handler/codex=chatgpt.desktop [Added Associations] application/pdf=org.pwmt.zathura-pdf-poppler.desktop; diff --git a/systemd/user/default.target.wants/headroom-private.service b/systemd/user/default.target.wants/headroom-private.service new file mode 120000 index 0000000..088ebb0 --- /dev/null +++ b/systemd/user/default.target.wants/headroom-private.service @@ -0,0 +1 @@ +/home/narl/.config/systemd/user/headroom-private.service \ No newline at end of file diff --git a/systemd/user/default.target.wants/headroom-work.service b/systemd/user/default.target.wants/headroom-work.service new file mode 120000 index 0000000..d9c1774 --- /dev/null +++ b/systemd/user/default.target.wants/headroom-work.service @@ -0,0 +1 @@ +/home/narl/.config/systemd/user/headroom-work.service \ No newline at end of file diff --git a/systemd/user/headroom-private.service b/systemd/user/headroom-private.service new file mode 100644 index 0000000..3105eaf --- /dev/null +++ b/systemd/user/headroom-private.service @@ -0,0 +1,13 @@ +[Unit] +Description=Headroom proxy (private Claude profile) +After=network-online.target + +[Service] +Environment=HEADROOM_WORKSPACE_DIR=%h/.headroom +Environment=HEADROOM_TELEMETRY=off +ExecStart=%h/.local/share/headroom-venv/bin/headroom proxy --host 127.0.0.1 --port 8787 --mode cache --no-telemetry +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=default.target diff --git a/systemd/user/headroom-work.service b/systemd/user/headroom-work.service new file mode 100644 index 0000000..d54ae3a --- /dev/null +++ b/systemd/user/headroom-work.service @@ -0,0 +1,13 @@ +[Unit] +Description=Headroom proxy (work Claude profile) +After=network-online.target + +[Service] +Environment=HEADROOM_WORKSPACE_DIR=%h/.headroom-work +Environment=HEADROOM_TELEMETRY=off +ExecStart=%h/.local/share/headroom-venv/bin/headroom proxy --host 127.0.0.1 --port 8788 --mode cache --no-telemetry +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=default.target