#!/bin/bash
# =============================================
#  輸入提速.command
#  鍵盤 / 語音輸入遲鈍的一鍵急救
#  根因：記憶體滿載（swap 深載）＋背景程序卡死
# =============================================

R='\033[0;31m'; G='\033[0;32m'; Y='\033[1;33m'; C='\033[0;36m'; N='\033[0m'

clear
echo -e "${C}=============================================${N}"
echo -e "${C}   ⌨️  輸入提速 — 鍵盤/語音遲鈍急救${N}"
echo -e "${C}=============================================${N}"
echo ""

snap() {
  top -l 1 | grep -E "Load Avg|PhysMem"
  sysctl -n vm.swapusage
}

echo -e "${Y}【處理前】${N}"
snap
echo ""
echo "CPU 大戶（前 5）："
ps aux | awk 'NR>1' | sort -k3 -rn | head -5 | awk '{printf "  %5.1f%%CPU %6.0fMB  %s\n",$3,$6/1024,substr($0,index($0,$11),60)}'

echo ""
echo -e "${Y}1. 檢查卡死的背景程序…${N}"
CPID=$(pgrep -f ContinuityCaptureAgent 2>/dev/null | head -1)
if [ -n "$CPID" ]; then
  CCPU=$(ps -o %cpu= -p "$CPID" | tr -d ' ')
  CCPU_INT=${CCPU%%.*}
  if [ -n "$CCPU_INT" ] && [ "$CCPU_INT" -ge 15 ] 2>/dev/null; then
    kill "$CPID" 2>/dev/null && echo -e "  ${G}✓${N} 已重置 ContinuityCaptureAgent（卡在 ${CCPU}% CPU，會自動重開）"
  else
    echo "  - ContinuityCaptureAgent 正常（${CCPU}%）"
  fi
else
  echo "  - 沒有在跑"
fi

echo ""
echo -e "${Y}2. 清除非活躍記憶體與系統快取…${N}"
if [ -t 0 ]; then
  echo "  ※ 接著會跳出密碼視窗，請輸入 Mac 登入密碼"
  if sudo purge; then
    echo -e "  ${G}✓${N} 已清除（purge）"
  else
    echo -e "  ${Y}!${N} 取消清除（不影響後續步驟）"
  fi
else
  if sudo -n purge 2>/dev/null; then
    echo -e "  ${G}✓${N} 已清除（purge）"
  else
    echo -e "  ${Y}!${N} 略過（無終端機密碼）— 雙擊執行本檔並輸入密碼，效果最好"
  fi
fi

echo ""
echo -e "${Y}3. 顯示負擔減輕選項（選答，按 Enter = 跳過）…${N}"
RT=$(defaults read com.apple.universalaccess reduceTransparency 2>/dev/null || echo 0)
if [ "$RT" != "1" ]; then
  if [ -t 0 ]; then read -p "  減少視窗透明特效以減輕 WindowServer 負擔？(y/N) " ans; else ans=""; fi
  if [[ "$ans" == [yY] ]]; then
    defaults write com.apple.universalaccess reduceTransparency -bool true
    echo -e "  ${G}✓${N} 已開啟「減少透明度」（部分視窗需重開才生效）"
  else
    echo "  - 跳過"
  fi
else
  echo "  - 已是「減少透明度」狀態"
fi

echo ""
echo -e "${Y}【處理後】${N}"
snap
echo ""
SWUSED=$(sysctl -n vm.swapusage | sed -E 's/.*used = ([0-9]+)M.*/\1/')
if [ "$SWUSED" -ge 4096 ] 2>/dev/null; then
  echo -e "  ${R}▲ swap 仍用 ${SWUSED}MB — 關掉多餘分頁/App；若沒改善，重開機是最徹底解法${N}"
elif [ "$SWUSED" -ge 2048 ] 2>/dev/null; then
  echo -e "  ${Y}△ swap ${SWUSED}MB 偏高 — 關掉吃記憶體的程式會明顯改善${N}"
else
  echo -e "  ${G}✓ swap 壓力已下降${N}"
fi
echo ""
echo "記憶體前 5 大："
ps -A -o rss,comm | awk 'NR>1' | sort -rn | head -5 | awk '{cmd=$2; for(i=3;i<=NF;i++) cmd=cmd" "$i; printf "  %6.0fMB  %s\n",$1/1024,cmd}'

echo ""
echo -e "${G}完成！${N} 語音輸入（連按 Fn）前先跑一次本工具，會明顯較順。"
echo "  提醒：這台 8GB 機器 swap 滿載時一定卡，長期解法是關 Chrome 多餘分頁或重開機。"
echo ""
if [ -t 0 ]; then read -p "按 Enter 鍵關閉視窗…" key; fi
