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:
co-authored by
Hlib Kanunnikov
Claude Opus 5
parent
3b08a85ad1
commit
4d0531f351
Executable
+36
@@ -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"
|
||||
@@ -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"},
|
||||
|
||||
@@ -146,4 +146,5 @@ xournalpp
|
||||
yaru-icon-theme
|
||||
yay
|
||||
yt-dlp
|
||||
zbar
|
||||
zoxide
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
echo "Install QR code scanning support"
|
||||
|
||||
omarchy-pkg-add zbar
|
||||
Reference in New Issue
Block a user