#!/bin/sh -x

MAP_DIR="${XDG_DATA_HOME}/xkb/compiled"

rotate() {
    current="$(readlink keymap)"
    for f in *; do
        [ "$f" = "keymap" ] && continue
        [ -z "$first" ] && first=$f
        [ -n "$found" ] && break
        [ "$f" = "$current" ] && found=1
        f=
    done
    [ "$f" = "keymap" ] || [ -z "$f" ] && f=$first
    ln -sf "$f" keymap
}

setmap() {
    current=${1:-$(readlink keymap)}
    xkbcomp "$current" "$DISPLAY" >/dev/null 2>&1 || return 1
    xset r rate 300 50
    xset -q | grep -q "Caps Lock:\s*on" && xdotool key Caps_Lock
    killall xcape 2>/dev/null
    xcape -e 'Super_L=Escape'
    $notifier -h string:x-dunst-stack-tag:"remaps" \
        "󰌌 Keymap set" "Layout: $current"
}

cd "$MAP_DIR" || return 1
notifier="notify-send"

while getopts "rqdls:" opt; do
    case $opt in
        d)
            setmap
            exit
            ;;
        q) notifier=":" ;;
        s)
            setmap "$OPTARG"
            exit
            ;;
        l)
            find . -type f -printf "%f\n"
            exit
            ;;
        *) ;;
    esac
done

rotate
setmap