1
1
Fork 1
mirror of https://github.com/oddlama/nix-config.git synced 2025-10-10 23:00:39 +02:00

feat: convert screenshot scripts to wayland

This commit is contained in:
oddlama 2024-06-12 01:32:27 +02:00
parent 3a0cec46f3
commit 3b602b322a
No known key found for this signature in database
GPG key ID: 14EFE510775FE39A
5 changed files with 97 additions and 72 deletions

View file

@ -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<N;++i)); do
DATA="$DATA"$'\n'"---"$'\n'"$(${yq}/bin/xq -r ".barcodes.source.index.symbol[$i].data" < "$TMPFILE")"
DATA="$DATA"$'\n'"---"$'\n'"$(xq -r ".barcodes.source.index.symbol[$i].data" < "$TMPFILE")"
done
${xclip}/bin/xclip -selection clipboard <<< "$DATA"
${libnotify}/bin/notify-send \
wl-copy <<< "$DATA"
notify-send \
"🔍 QR Code scan" " $N codes detected\n📋 copied ''${#DATA} bytes" \
--hint="string:image-path:"${./assets}/qr-scan.png \
--hint="string:wired-tag:screenshot-$date" \
|| true
else
case "$?" in
"4")
${libnotify}/bin/notify-send \
notify-send \
"🔍 QR Code scan" " 0 codes detected" \
--hint="string:image-path:"${./assets}/qr-scan.png \
--hint="string:wired-tag:screenshot-$date" \
|| true
;;
*)
${libnotify}/bin/notify-send \
notify-send \
"🔍 QR Code scan" " Error while processing image: zbarimg exited with code $?" \
--hint="string:image-path:"${./assets}/qr-scan.png \
--hint="string:wired-tag:screenshot-$date" \
|| true
;;
esac

View file

@ -1,55 +1,84 @@
{
lib,
writeShellApplication,
flameshot,
grimblast,
libnotify,
moreutils,
tesseract,
xclip,
wl-clipboard,
}:
writeShellApplication {
name = "screenshot-area";
runtimeInputs = [
grimblast
libnotify
tesseract
wl-clipboard
];
text = ''
set -euo pipefail
umask 077
date=$(date +"%Y-%m-%dT%H:%M:%S%:z")
out="''${XDG_PICTURES_DIR-$HOME/Pictures}/screenshots/$date-selection.png"
mkdir -p "$(dirname "$out")"
# Always use native scaling to ensure flameshot is fullscreen across monitors
export QT_AUTO_SCREEN_SCALE_FACTOR=0
export QT_SCREEN_SCALE_FACTORS=""
grimblast --freeze save area "$out" || exit 2
wl-copy -t image/png < "$out"
# Use sponge to create the file on success only
if ${lib.getExe flameshot} gui --raw 2>&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
'';
}

View file

@ -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

View file

@ -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 = {

View file

@ -3,7 +3,6 @@
enable = true;
package = pkgs.rofi-wayland;
extraConfig = {
matching = "fuzzy";
terminal = "kitty";
};
};