#!/bin/sh
# Licence MIT
# author: prx <prx@ybad.name>
# creates a menu in $HOME/.fluxbox/automenu/auto.menu for fluxbox from .desktop files
# -i option enable icons
# file ~/.fluxbox/automenu.exclude with desktop files you want to
# ignore. Example :
# $ cat ~/.fluxbox/automenu.exclude
# compton.desktop
# display-im6.q16.desktop


ICONS=0
if [ "$1" = "-i" ]; then
    ICONS=1
fi

# vars
categories="utility
graphics
network
office
multimedia
game
development
settings
system
other"

desktopfilespath="$HOME/.local/share/applications /usr/local/share/applications /usr/share/applications"
menudir="$HOME/.fluxbox/automenu"
menufile="$menudir/auto.menu"
excludefile="$HOME/.fluxbox/automenu.exclude"

userlocale=$(echo $LANG | cut -b-2)
# funcs 
gettrad() {
    case $userlocale in
    fr )
        case $1 in
            graphics) echo "Graphisme" ;;
            development) echo "Développement" ;;
            settings) echo "Préférences" ;;
            system) echo "Système" ;;
            game) echo "Jeux" ;;
            network) echo "Réseau" ;;
            office) echo "Bureautique" ;;
            multimedia) echo "Multimédia" ;;
            utility) echo "Outils" ;;
            other) echo "Autres" ;;
        esac
    ;;
    * )
        case $1 in
            graphics) echo "Graphics" ;;
            development) echo "Development" ;;
            settings) echo "Settings" ;;
            system) echo "System" ;;
            game) echo "Games" ;;
            network) echo "Network" ;;
            office) echo "office" ;;
            multimedia) echo "Multimedia" ;;
            utility) echo "Utility" ;;
            other) echo "Other" ;;
        esac
    ;;
    esac
}

getappname() {
    name=""
    name="$(grep -m1 "^Name\[$userlocale\]" "${1}" | cut -d"=" -f2)"
    if [ -z "${name}" ]; then
        name="$(grep -m1 "^Name=" "${1}" | cut -d"=" -f2)"
    fi
    echo "${name}"
}

getappcmd() {
    cmd="$(grep -m1 "^Exec=" "${1}" | cut -d"=" -f2- | cut -d'%' -f1)"
    interm="$(grep -m1 "^Terminal=" "${1}" | cut -d"=" -f2-)"
    if [ "${interm}" = "true" ]; then
        cmd="xterm -geometry 120x40+10+10 -e ${cmd}"
    fi
    echo "${cmd}"
}

getappcateg() {
    grep "^Categories=" "${1}" | cut -d"=" -f2
}

getappicon() {
    iconname=$(grep "^Icon=" "${1}" | cut -d"=" -f2)
    if [ -n "${iconname}" ]; then
        case ${iconname} in
            /* ) icon="${iconname}" ;;
            * )
            # Tango preferred
            icon=$(find /usr/local/share/icons/Tango \
                /usr/local/share/icons/hicolor/ \
                /usr/local/share/icons/ \
                -name "${iconname}"*.png | \
                grep 16x16 |\
                head -n1)
            ;;
    esac
    echo ${icon}
    else
        echo ""
    fi
}
menuitem() {
    echo "[exec] (${1}) {${2}} <${3}>"
}

mkdir -p "${menudir}"

# check if updating menu is necessary
if [ -e ${menufile} ]; then
    test -z "$(find ${desktopfilespath} -newer ${menufile})" && exit
else
    rm "${menudir}"/*
fi

# store in tmp file all desktop files
tmpfile=$(mktemp)
find ${desktopfilespath}  -name "*.desktop" > ${tmpfile}

while read f
do
    desktopfile=$(basename "${f}")
    echo $desktopfile
    if [ -f "${excludefile}" ]; then
        grep -q "${desktopfile}" "${excludefile}"
        test $? -eq 0 && continue
    fi
    appname=$(getappname "${f}")
    appcmd=$(getappcmd "${f}")
    appcateg=$(getappcateg "${f}")
    if [ $ICONS -eq 1 ]; then
        appicon=$(getappicon "${f}")
    else
        appicon=""
    fi
    case "${appcateg}" in
        *Graphics*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/graphics.include ;;
        *Development*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/development.include ;;
        *Settings*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/settings.include ;;
        *System*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/system.include ;;
        *Utility*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/utility.include ;;
        *Game*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/game.include ;;
        *Network*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/network.include ;;
        *Office*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/office.include ;;
        *Audio*|*Video*)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/multimedia.include ;;
        *)
            menuitem "${appname}" "${appcmd}" "${appicon}" >> "${menudir}"/other.include ;;
    esac
done < ${tmpfile}
rm ${tmpfile}

# now generate submenus
for c in ${categories}; do
    echo "[submenu] ($(gettrad ${c}))" >> ${menufile}
    echo "[include] (${menudir}/${c}.include)" >> ${menufile}
    echo "[end]" >> ${menufile}
done

echo "menu generated"
echo "add the following line to your ~/.fluxbox/menu file :"
echo "[include] (~/.fluxbox/automenu/auto.menu)"
