#!/bin/sh
# 快捷键速查 - 动态从 hyprctl binds 读取

modmask_to_str() {
    local mask=$1
    local mods=""
    # bit 0: SHIFT (1), bit 2: CTRL (4), bit 3: ALT (8), bit 6: SUPER (64)
    [ $((mask & 64)) -ne 0 ] && mods="${mods}Super+"
    [ $((mask & 1))  -ne 0 ] && mods="${mods}Shift+"
    [ $((mask & 4))  -ne 0 ] && mods="${mods}Ctrl+"
    [ $((mask & 8))  -ne 0 ] && mods="${mods}Alt+"
    [ $((mask & 16)) -ne 0 ] && mods="${mods}Mod2+"
    [ $((mask & 32)) -ne 0 ] && mods="${mods}Mod3+"
    [ $((mask & 128)) -ne 0 ] && mods="${mods}Mod5+"
    echo "${mods%+}"
}

hyprctl binds 2>/dev/null | awk -v RS='' -F'\n' '
/^bindd/ {
    key=""; desc=""; mask=""; submap=""
    for (i=2; i<=NF; i++) {
        split($i, kv, ": ")
        if (kv[1] ~ /^[[:space:]]*modmask$/) mask=kv[2]
        if (kv[1] ~ /^[[:space:]]*key$/) key=kv[2]
        if (kv[1] ~ /^[[:space:]]*description$/) desc=kv[2]
        if (kv[1] ~ /^[[:space:]]*submap$/) submap=kv[2]
    }
    # 跳过鼠标绑定和无描述的
    if (key ~ /^mouse/ || desc == "") next
    if (submap != "") next
    print mask "\t" key "\t" desc
}
' | while IFS=$'\t' read -r mask key desc; do
    mod_str=$(modmask_to_str "$mask")
    if [ -n "$mod_str" ]; then
        printf "  %-28s %s\n" "${mod_str}+${key}" "${desc}"
    else
        printf "  %-28s %s\n" "${key}" "${desc}"
    fi
done | fzf --prompt "  快捷键速查 > " --reverse --no-sort --bind 'esc:abort'
