Select a screen region and decode the QR code in it to the clipboard, so an otpauth:// setup code shown on screen no longer needs a phone. The decoded value is only ever placed on the clipboard, and marked sensitive so clipboard history skips it. Decoding is restricted to QR so a stray barcode elsewhere on screen can't take the clipboard instead. Co-authored-by: Hlib Kanunnikov <hlibwondertan@gmail.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
37 lines
1.3 KiB
Bash
Executable File
37 lines
1.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# omarchy:summary=Decode a QR code from a screenshot region
|
|
# omarchy:group=capture
|
|
# omarchy:examples=omarchy capture qr
|
|
|
|
# Keep hyprpicker alive until after grim captures so the screenshot sees the
|
|
# frozen overlay rather than live content shifting during teardown.
|
|
cleanup_freeze() {
|
|
[[ -n $PID ]] && kill $PID 2>/dev/null
|
|
}
|
|
trap cleanup_freeze EXIT
|
|
|
|
hyprpicker -r -z >/dev/null 2>&1 &
|
|
PID=$!
|
|
sleep .1
|
|
SELECTION=$(slurp 2>/dev/null)
|
|
|
|
[[ -z $SELECTION ]] && exit 0
|
|
|
|
# Decode QR codes only. Leaving the other symbologies enabled lets dense screen
|
|
# content false-positive as an EAN or Code 39 barcode and take over the clipboard.
|
|
RESULT=$(grim -g "$SELECTION" - | zbarimg -q --raw -Sdisable -Sqrcode.enable - 2>/dev/null)
|
|
|
|
if [[ -z $RESULT ]]; then
|
|
omarchy-notification-send -g -u critical "No QR code found" "Select a region containing a QR code"
|
|
exit 1
|
|
fi
|
|
|
|
# QR codes routinely carry secrets, like the otpauth:// URIs behind 2FA setup
|
|
# codes, so the decoded value goes to the clipboard and nowhere else. Printing it
|
|
# or putting it in the notification would leak it to the session journal and to
|
|
# the notification history, and an unmarked copy would be retained by clipboard
|
|
# history. Pasting still works; only the recorded copy is given up.
|
|
printf '%s' "$RESULT" | wl-copy --sensitive
|
|
omarchy-notification-send -g "QR code copied to clipboard"
|