mirror of
https://github.com/zhenyan121/dotfiles.git
synced 2026-04-10 14:34:09 +08:00
134 lines
4.0 KiB
Bash
Executable File
134 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# =================语言=================
|
||
if env | grep -q "zh_CN"; then
|
||
STR_NEXT="📸 截取下一张 (仅需定高度)"
|
||
STR_FINISH="💾 完成并处理"
|
||
STR_ABORT="❌ 放弃"
|
||
STR_ERR="错误"
|
||
STR_SAVED="已保存"
|
||
else
|
||
STR_NEXT="📸 Capture Next (Height only)"
|
||
STR_FINISH="💾 Finish"
|
||
STR_ABORT="❌ Abort"
|
||
STR_ERR="Error"
|
||
STR_SAVED="Saved"
|
||
fi
|
||
|
||
# =================配置=================
|
||
CONFIG_DIR="$HOME/.cache/longshot-sh"
|
||
CONFIG_FILE="$CONFIG_DIR/mode"
|
||
SAVE_DIR="$HOME/Pictures/Screenshots/longshots"
|
||
|
||
TMP_DIR="/tmp/longshot_grim_$(date +%s)"
|
||
FILENAME="longshot_$(date +%Y%m%d_%H%M%S).png"
|
||
RESULT_PATH="$SAVE_DIR/$FILENAME"
|
||
TMP_STITCHED="$TMP_DIR/stitched.png"
|
||
|
||
mkdir -p "$SAVE_DIR" "$TMP_DIR"
|
||
cleanup() { rm -rf "$TMP_DIR"; }
|
||
trap cleanup EXIT SIGINT SIGTERM
|
||
|
||
# 菜单工具
|
||
# [修改]: 将 fuzzel 宽度从 45 调整为 30,使其更紧凑
|
||
CMD_FUZZEL="fuzzel -d --anchor=top --y-margin=20 --lines=3 --width=30"
|
||
CMD_WOFI="wofi --dmenu --lines 3"
|
||
CMD_ROFI="rofi -dmenu -l 3"
|
||
|
||
if command -v fuzzel &> /dev/null; then MENU_CMD="$CMD_FUZZEL"
|
||
elif command -v wofi &> /dev/null; then MENU_CMD="$CMD_WOFI"
|
||
elif command -v rofi &> /dev/null; then MENU_CMD="$CMD_ROFI"
|
||
else exit 1; fi
|
||
|
||
# [新增]: 动态计算宽度函数 (主要针对 wofi)
|
||
function get_dynamic_width() {
|
||
local text="$1"
|
||
# 获取最长行的长度
|
||
local max_len=$(echo -e "$text" | wc -L)
|
||
# 计算: 字符数 * 28px + 60px 边距 (可根据屏幕分辨率微调)
|
||
echo $(( max_len * 28 + 60 ))
|
||
}
|
||
|
||
# [修改]: 增加对 wofi 的动态宽度支持
|
||
function show_menu() {
|
||
local content="$1"
|
||
|
||
if [[ "$MENU_CMD" == *"wofi"* ]]; then
|
||
# 如果是 wofi,计算宽度并附加参数
|
||
local width=$(get_dynamic_width "$content")
|
||
echo -e "$content" | $MENU_CMD --width "$width"
|
||
else
|
||
# 其他工具 (fuzzel/rofi) 保持原样
|
||
echo -e "$content" | $MENU_CMD
|
||
fi
|
||
}
|
||
|
||
# ======================================
|
||
# Step 1: 第一张截图 (直接开始,不询问)
|
||
# ======================================
|
||
# 用户在主菜单点击了 "选择区域",所以这里直接 Slurp
|
||
GEO_1=$(slurp)
|
||
if [ -z "$GEO_1" ]; then exit 0; fi
|
||
|
||
IFS=', x' read -r FIX_X FIX_Y FIX_W FIX_H <<< "$GEO_1"
|
||
grim -g "$GEO_1" "$TMP_DIR/001.png"
|
||
|
||
# ======================================
|
||
# Step 2: 循环截图
|
||
# ======================================
|
||
INDEX=2
|
||
DO_SAVE=false
|
||
|
||
while true; do
|
||
# 菜单提示下一张 (show_menu 会自动处理宽度)
|
||
ACTION=$(show_menu "$STR_NEXT\n$STR_FINISH\n$STR_ABORT")
|
||
|
||
case "$ACTION" in
|
||
*"📸"*)
|
||
sleep 0.2
|
||
GEO_NEXT=$(slurp)
|
||
if [ -z "$GEO_NEXT" ]; then continue; fi
|
||
|
||
# 锁定宽度和X轴,只取新高度
|
||
IFS=', x' read -r _TX NEW_Y _TW NEW_H <<< "$GEO_NEXT"
|
||
FINAL_GEO="${FIX_X},${NEW_Y} ${FIX_W}x${NEW_H}"
|
||
|
||
IMG_NAME="$(printf "%03d" $INDEX).png"
|
||
grim -g "$FINAL_GEO" "$TMP_DIR/$IMG_NAME"
|
||
((INDEX++))
|
||
;;
|
||
*"💾"*) DO_SAVE=true; break ;;
|
||
*"❌"*) exit 0 ;;
|
||
*) break ;; # 意外退出
|
||
esac
|
||
done
|
||
|
||
# ======================================
|
||
# Step 3: 处理与自动动作
|
||
# ======================================
|
||
COUNT=$(ls "$TMP_DIR"/*.png 2>/dev/null | wc -l)
|
||
|
||
if [ "$COUNT" -gt 0 ] && [ "$DO_SAVE" = true ]; then
|
||
# 拼接
|
||
magick "$TMP_DIR"/*.png -append "$TMP_STITCHED"
|
||
mv "$TMP_STITCHED" "$RESULT_PATH"
|
||
|
||
# 复制到剪贴板
|
||
if command -v wl-copy &> /dev/null; then wl-copy < "$RESULT_PATH"; fi
|
||
|
||
# 读取配置执行动作
|
||
FINAL_MODE=$(cat "$CONFIG_FILE" 2>/dev/null || echo "PREVIEW")
|
||
|
||
case "$FINAL_MODE" in
|
||
"PREVIEW")
|
||
imv "$RESULT_PATH"
|
||
;;
|
||
"EDIT")
|
||
if command -v satty &> /dev/null; then satty -f "$RESULT_PATH"
|
||
else imv "$RESULT_PATH"; fi
|
||
;;
|
||
"SAVE")
|
||
notify-send -i "$RESULT_PATH" "Longshot" "$STR_SAVED: $(basename "$RESULT_PATH")"
|
||
;;
|
||
esac
|
||
fi |