Add QR code capture (#6705)

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>
This commit is contained in:
David Heinemeier Hansson
2026-08-11 13:56:09 +02:00
committed by GitHub
co-authored by Hlib Kanunnikov Claude Opus 5
parent 3b08a85ad1
commit 4d0531f351
4 changed files with 41 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
#!/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"
+1
View File
@@ -53,6 +53,7 @@
"trigger.capture.screenrecord.stop": {"icon":"","label":"Stop Screenrecording","when":"pgrep -f '^gpu-screen-recorder'","action":"omarchy-capture-screenrecording --stop-recording"},
"trigger.capture.screenrecord": {"icon":"","label":"Screenrecord"},
"trigger.capture.text": {"icon":"󰴑","label":"Text","action":"omarchy-capture-text"},
"trigger.capture.qr": {"icon":"󰐲","label":"QR Code","action":"omarchy-capture-qr"},
"trigger.capture.color": {"icon":"󰃉","label":"Color","action":"pkill hyprpicker || hyprpicker -a"},
"trigger.capture.screenrecord.no-audio": {"icon":"","label":"With no audio","action":"omarchy-capture-screenrecording"},
"trigger.capture.screenrecord.desktop-audio": {"icon":"","label":"With desktop audio","action":"omarchy-capture-screenrecording --with-desktop-audio"},
+1
View File
@@ -146,4 +146,5 @@ xournalpp
yaru-icon-theme
yay
yt-dlp
zbar
zoxide
+3
View File
@@ -0,0 +1,3 @@
echo "Install QR code scanning support"
omarchy-pkg-add zbar