diff --git a/pkgs/scripts/screenshot-area-scan-qr.nix b/pkgs/scripts/screenshot-area-scan-qr.nix index c79be67..5a4f158 100644 --- a/pkgs/scripts/screenshot-area-scan-qr.nix +++ b/pkgs/scripts/screenshot-area-scan-qr.nix @@ -1,16 +1,23 @@ { - lib, writeShellApplication, - flameshot, + grimblast, libnotify, - xclip, + tesseract, + wl-clipboard, yq, zbar, }: writeShellApplication { name = "screenshot-area-scan-qr"; + runtimeInputs = [ + grimblast + libnotify + tesseract + wl-clipboard + yq + zbar + ]; text = '' - set -euo pipefail umask 077 # Create in-memory tmpfile @@ -19,40 +26,31 @@ writeShellApplication { rm "$TMPFILE" # still open in-memory as /dev/fd/3 TMPFILE=/dev/fd/3 - date=$(date +"%Y-%m-%dT%H:%M:%S%:z") - - # Always use native scaling to ensure flameshot is fullscreen across monitors - export QT_AUTO_SCREEN_SCALE_FACTOR=0 - export QT_SCREEN_SCALE_FACTORS="" - - if ${lib.getExe flameshot} gui --raw \ - | ${zbar}/bin/zbarimg --xml - > "$TMPFILE"; then - N=$(${yq}/bin/xq -r '.barcodes.source.index.symbol | if type == "array" then length else 1 end' < "$TMPFILE") + if grimblast --freeze save area - \ + | zbarimg --xml - > "$TMPFILE"; then + N=$(xq -r '.barcodes.source.index.symbol | if type == "array" then length else 1 end' < "$TMPFILE") # Append codes Copy data separated by --- - DATA=$(${yq}/bin/xq -r '.barcodes.source.index.symbol | if type == "array" then .[0].data else .data end' < "$TMPFILE") + DATA=$(xq -r '.barcodes.source.index.symbol | if type == "array" then .[0].data else .data end' < "$TMPFILE") for ((i=1;i&1 1> >(${moreutils}/bin/sponge "$out") | grep -q "flameshot: info:.*aborted."; then - exit 1 - fi + declare -A NOTIFICATION_IDS + function notify_wait_action() { + id="$1" + shift 1 - ${xclip}/bin/xclip -selection clipboard -t image/png < "$out" - action=$(${libnotify}/bin/notify-send \ - "šŸ“· Screenshot captured" "šŸ“‹ copied to clipboard" \ - --hint="string:wired-tag:screenshot-$date" \ - --action=ocr=OCR) \ - || true - - if [[ "$action" == "ocr" ]]; then - ${libnotify}/bin/notify-send \ - "šŸ“· Screenshot captured" "ā³ Running OCR ..." \ - --hint="string:wired-tag:screenshot-$date" \ - || true - - if ${tesseract}/bin/tesseract "$out" - -l eng+deu | ${xclip}/bin/xclip -selection clipboard; then - ${libnotify}/bin/notify-send \ - "šŸ“· Screenshot captured" "šŸ”  OCR copied to clipboard" \ - --hint="string:wired-tag:screenshot-$date" \ - || true - else - ${libnotify}/bin/notify-send \ - "šŸ“· Screenshot captured" "āŒ Error while running OCR" \ - --hint="string:wired-tag:screenshot-$date" \ - || true + args=("--print-id") + if [[ -v "NOTIFICATION_IDS[$id]" ]]; then + args+=("--replace-id=''${NOTIFICATION_IDS[$id]}") fi - fi + args+=("$@") + + readarray -t __notify_output < <(notify-send "''${args[@]}" || true) + NOTIFICATION_IDS["$id"]="''${__notify_output[0]-}" + echo "''${__notify_output[1]-}" + } + + function notify_nowait() { + id="$1" + shift 1 + + args=("--print-id") + if [[ -v "NOTIFICATION_IDS[$id]" ]]; then + args+=("--replace-id=''${NOTIFICATION_IDS[$id]}") + fi + args+=("$@") + + readarray -t __notify_output < <(notify-send "''${args[@]}" || true) + NOTIFICATION_IDS["$id"]="''${__notify_output[0]-}" + unset __notify_output + } + + title="šŸ“· Screenshot captured" + body="šŸ“‹ image copied to clipboard" + while true; do + action=$(notify_wait_action main "$title" "$body" \ + --action=ocr="Run OCR" \ + --action=copy="Copy Image") + + case "$action" in + ocr) + notify_nowait main "$title" "ā³ Running OCR ..." + + if tesseract "$out" - -l eng+deu | wl-copy; then + body="šŸ”  OCR copied to clipboard" + else + body="āŒ Error while running OCR" + fi + ;; + + copy) + wl-copy -t image/png < "$out" + body="šŸ“‹ image copied to clipboard" + ;; + + *) exit 0 ;; + esac + done ''; } diff --git a/pkgs/scripts/screenshot-screen.nix b/pkgs/scripts/screenshot-screen.nix index bf1cec2..b8c2cc4 100644 --- a/pkgs/scripts/screenshot-screen.nix +++ b/pkgs/scripts/screenshot-screen.nix @@ -1,24 +1,23 @@ { - lib, writeShellApplication, - flameshot, + grimblast, libnotify, - moreutils, }: writeShellApplication { name = "screenshot-screen"; + runtimeInputs = [ + grimblast + libnotify + ]; text = '' - set -euo pipefail umask 077 date=$(date +"%Y-%m-%dT%H:%M:%S%:z") out="''${XDG_PICTURES_DIR-$HOME/Pictures}/screenshots/$date-fullscreen.png" mkdir -p "$(dirname "$out")" - if ${lib.getExe flameshot} full --raw 2>&1 1> >(${moreutils}/bin/sponge "$out") | grep -q "flameshot: info:.*aborted."; then - exit 1 - fi - ${libnotify}/bin/notify-send \ + grimblast --freeze save screen "$out" || exit 2 + notify-send \ "šŸ“· Screenshot captured" "šŸ’¾ Saved to $out" \ --hint="string:wired-tag:screenshot-$date" \ || true diff --git a/users/myuser/graphical/hyprland.nix b/users/myuser/graphical/hyprland.nix index 11457a5..ac4d691 100644 --- a/users/myuser/graphical/hyprland.nix +++ b/users/myuser/graphical/hyprland.nix @@ -1,6 +1,7 @@ # TODO: waybar qr scan button # TODO: waybar color picker button # TODO: notification center toggle +# TODO: screencast button with notification # TODO ai speech indicator / toggle { lib, @@ -13,6 +14,7 @@ concatMap elem flip + getExe mkIf mkMerge optionals @@ -58,10 +60,9 @@ in { "SUPER,b,exec,firefox" # Shortcuts & Actions - #"SUPER + SHIFT,s,exec ${getExe pkgs.scripts.screenshot-area}" - #"SUPER,F11,exec ${getExe pkgs.scripts.screenshot-area-scan-qr}" - #"SUPER,F12,exec ${getExe pkgs.scripts.screenshot-screen}" - #"SUPER,Print,exec ${getExe pkgs.flameshot} gui" + "SUPER + SHIFT,s,exec,${getExe pkgs.scripts.screenshot-area}" + "SUPER,F11,exec,${getExe pkgs.scripts.screenshot-area-scan-qr}" + "SUPER,F12,exec,${getExe pkgs.scripts.screenshot-screen}" # Per-window actions "SUPER,q,killactive," @@ -115,7 +116,6 @@ in { ]; }; - cursor.no_warps = true; decoration.rounding = 4; input = { diff --git a/users/myuser/graphical/rofi.nix b/users/myuser/graphical/rofi.nix index ae9785d..bcbcc30 100644 --- a/users/myuser/graphical/rofi.nix +++ b/users/myuser/graphical/rofi.nix @@ -3,7 +3,6 @@ enable = true; package = pkgs.rofi-wayland; extraConfig = { - matching = "fuzzy"; terminal = "kitty"; }; };