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:
parent
3a0cec46f3
commit
3b602b322a
5 changed files with 97 additions and 72 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
declare -A NOTIFICATION_IDS
|
||||
function notify_wait_action() {
|
||||
id="$1"
|
||||
shift 1
|
||||
|
||||
args=("--print-id")
|
||||
if [[ -v "NOTIFICATION_IDS[$id]" ]]; then
|
||||
args+=("--replace-id=''${NOTIFICATION_IDS[$id]}")
|
||||
fi
|
||||
args+=("$@")
|
||||
|
||||
${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
|
||||
readarray -t __notify_output < <(notify-send "''${args[@]}" || true)
|
||||
NOTIFICATION_IDS["$id"]="''${__notify_output[0]-}"
|
||||
echo "''${__notify_output[1]-}"
|
||||
}
|
||||
|
||||
if [[ "$action" == "ocr" ]]; then
|
||||
${libnotify}/bin/notify-send \
|
||||
"📷 Screenshot captured" "⏳ Running OCR ..." \
|
||||
--hint="string:wired-tag:screenshot-$date" \
|
||||
|| true
|
||||
function notify_nowait() {
|
||||
id="$1"
|
||||
shift 1
|
||||
|
||||
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
|
||||
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
|
||||
${libnotify}/bin/notify-send \
|
||||
"📷 Screenshot captured" "❌ Error while running OCR" \
|
||||
--hint="string:wired-tag:screenshot-$date" \
|
||||
|| true
|
||||
fi
|
||||
body="❌ Error while running OCR"
|
||||
fi
|
||||
;;
|
||||
|
||||
copy)
|
||||
wl-copy -t image/png < "$out"
|
||||
body="📋 image copied to clipboard"
|
||||
;;
|
||||
|
||||
*) exit 0 ;;
|
||||
esac
|
||||
done
|
||||
'';
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 = {
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
enable = true;
|
||||
package = pkgs.rofi-wayland;
|
||||
extraConfig = {
|
||||
matching = "fuzzy";
|
||||
terminal = "kitty";
|
||||
};
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue