#!/bin/sh
# generate_menu for Fluxbox
# Copyright (c) 2001-2002 Henrik Kinnunen (fluxgen@linuxmail.org)
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.	 IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.

PATH=/bin:/usr/bin/:/usr/local/bin:/usr/X11R6/bin


# Functions
display_usage() {
    cat <<EOF

fluxbox-genrate_menu
Usage: fluxbox-generate_menu [-kg] [-o /path]
	 [-p /path] [-m menu-title]
Options:

    -t	Favourite terminal.
    -k	Insert a kde menu
    -g	Add a gnome menu
    -o	Outputfile; default is ~/.fluxbox/menu
    -m	Menu-title; default is "Fluxbox"

    -h	Display this help
    -a	Display the authors of this script

  only for packagers:
    -p	Package-datadir; default is /usr/local/share

EOF
}

display_help() {
    cat <<EOF

This program generates a menu-file for fluxbox.
Use fluxbox-generate_menu -h for brief usage instructions

EOF
}

display_authors() {
    cat <<EOF

fluxbox-generate_menu was brought to you by:
Henrik Kinnunnen:	Project leader.
Han Boetes:		Packaging, debugging and scripts.
Jeramy B. Smith:	Packaging assistance, gnome and kde menu system.
Xyrnix:			Mysterious guest developer who made find_it module.
filipe:			Italian locales and find_term module.
EOF
    echo -e `whoami`":		Innocent bystander.\n"
}

find_it() {
    which $1 > /dev/null 2> /dev/null && shift && $*
}

append() {
    echo "	$*" >> ${FILENAME}
}

append_menu() {
    echo "$*" >> ${FILENAME}
}

append_submenu() {
    echo >> ${FILENAME}
    append_menu "[submenu] ($1)"
}

append_menu_end() {
    append_menu "[end]"
    echo >> ${FILENAME}
}

menu_entry() {
    append "[exec] ("`grep -v GenericName $* | grep Name= | cut -d = -f 2`") \
	{"`grep -v TryExec $* | grep Exec= | cut -d = -f 2`"}"
}

menu_entry_dircheck() {
    if [ -d "$*" ]; then
	menu_entry_dir "$*"
    fi
}

menu_entry_dir() {
    for b in `ls "$*"/*.desktop 2>/dev/null `; do
	menu_entry "${b}"
    done
}

# Get options.
while getopts ":khagt:p:o:m:" COMMAND_LINE_ARGUMENT ; do
    case "${COMMAND_LINE_ARGUMENT}" in
	k) KDEMENU=yes ;;
	g) GNOMEMENU=yes ;;
	t) MY_TERM=${OPTARG};;
	o) FILENAME=${OPTARG} ;;
	p) PKGDATADIR=${OPTARG} ;;
	m) MENUTITLE=${OPTARG} ;;
	h) display_usage ; exit 0 ;;
	a) display_authors ; exit 0 ;;
	*) display_help ; exit 1 ;;
    esac
done


# Set Defaults

# menufile name and make a backup
if [ -z ${FILENAME} ]; then
    FILENAME=${HOME}/.fluxbox/menu
fi

if [ ! -z ${FILENAME} ]; then
    if [ -w ${FILENAME} ]; then
	cp -f ${FILENAME} ${FILENAME}.bak
    fi
fi

#packagedatadir
if [ -z "${PKGDATADIR}" ]; then
    PKGDATADIR=/usr/share
fi

# menutitle
if [ -z "${MENUTITLE}" ]; then
    MENUTITLE="Fluxbox"
fi

# find the default terminal
find_it $MY_TERM
if [ $? -ne 0 ];then
    [ -n "$MY_TERM" ] && echo "Warning: you choose an invalid term." > /dev/stderr
    #The precise order is up for debate.
    for term in Eterm aterm rxvt wterm xterm konsole gnome-terminal; do
	if find_it $term; then
	    DEFAULT_TERM=$term
	    break
	fi
    done
else
    DEFAULT_TERM=$MY_TERM
fi



# a unix system without any terms. that's odd
if [ -z "$DEFAULT_TERM" ];then
    cat <<EOF
Error: I can't find any terminal-emulators in your path.
Please specify your favourite terminal with the -t option.
EOF
    exit 1
fi


# menu defaults (if translation forget to set one of them)
BROWSERMENU="Browsers"
EDITORMENU="Editors"
NETMENU="Net"
GRAPHICMENU="Graphics"
MUSICMENU="Music"
DEFAULT_TERMINALMENU="Terminals"
MISCMENU="Misc"
XUTILSMENU="X-utils"
FBSETTINGSMENU="FB-Settings"
KDEMENUTEXT="KDE-menus"
GNOMEMENUTEXT="Gnome-menus"
RESTARTITEM="Restart"
EXITITEM="Exit"
CONFIGUREMENU="Configure"
RELOADITEM="Reload config"
STYLEMENU="Styles"
STYLEMENUTITLE="Choose a style..."
WORKSPACEMENU="Workspace List"

# Check translation
case ${LC_ALL} in
	ru_RU) #Russian locales
		BROWSERMENU="��������"
		EDITORMENU="���������"
		NETMENU="����"
		GRAPHICMENU="�������"
		MUSICMENU="����"
		DEFAULT_TERMINALMENU="���������"
		MISCMENU="������"
		XUTILSMENU="X-�������"
		FBSETTINGSMENU="FB-���������"
		KDEMENUTEXT="KDE-����"
		GNOMEMENUTEXT="Gnome-����"
		RESTARTITEM="�������������"
		EXITITEM="�����"
		CONFIGUREMENU="���������"
		RELOADITEM="�������������"
		STYLEMENU="�����"
		STYLEMENUTITLE="�������� �����"
		WORKSPACEMENU="������� ������������"
	;;
	sv_SE) #Swedish locales
		BROWSERMENU="Browsers"
		EDITORMENU="Editorer"
		NETMENU="Net"
		GRAPHICMENU="Grafik"
		MUSICMENU="Musik"
		DEFAULT_TERMINALMENU="Terminaler"
		MISCMENU="Blandat"
		XUTILSMENU="X-program"
		FBSETTINGSMENU="FB-inst�llningar"
		KDEMENUTEXT="KDE-menyer"
		GNOMEMENUTEXT="Gnome-menyer"
		RESTARTITEM="Starta om"
		EXITITEM="Exit"
		CONFIGUREMENU="Konfiguration"
		RELOADITEM="Ladda om konfig"
		STYLEMENU="Stiler"
		STYLEMENUTITLE="V�lj en stil"
		WORKSPACEMENU="Arbetsytor"
	;;
	nl_NL) #Nederlandse locales
		BROWSERMENU="Browsers"
		EDITORMENU="Editors"
		NETMENU="Net"
		GRAPHICMENU="Grafisch"
		MUSICMENU="Muziek"
		DEFAULT_TERMINALMENU="Terminals"
		MISCMENU="Onregelmatig"
		XUTILSMENU="X-utils"
		FBSETTINGSMENU="FB-Instellingen"
		KDEMENUTEXT="KDE-menu"
		GNOMEMENUTEXT="Gnome-menu"
		RESTARTITEM="Restart"
		EXITITEM="Einde"
		CONFIGUREMENU="Instellingen"
		RELOADITEM="Vernieuwen"
		STYLEMENU="Stylen"
		STYLEMENUTITLE="Kies een styl..."
		WORKSPACEMENU="Werkveld Lijst"
	;;
	fi_FI) #Finnish locales
		BROWSERMENU="Selaimet"
		EDITORMENU="Editorit"
		NETMENU="Verkko"
		GRAPHICMENU="Grafiikka"
		MUSICMENU="Musikki"
		DEFAULT_TERMINALMENU="Terminaalit"
		MISCMENU="Sekalaista"
		XUTILSMENU="X-Ohjelmat"
		FBSETTINGSMENU="FB:n Asetukset"
		KDEMENUTEXT="KDE:n valikot"
		GNOMEMENUTEXT="Gnomen valikot"
		RESTARTITEM="K�ynnist� uudelleen"
		EXITITEM="Lopeta"
		CONFIGUREMENU="Konfigurointi"
		RELOADITEM="P�ivit�"
		STYLEMENU="Tyylit"
		STYLEMENUTITLE="Valitse tyyli"
		WORKSPACEMENU="Ty�aluet"
	;;
	ja_JP) #Japanese locales
		BROWSERMENU="�֥饦��"
		EDITORMENU="���ǥ���"
		NETMENU="�ͥåȥ��"
		GRAPHICMENU="����"
		MUSICMENU="����"
		DEFAULT_TERMINALMENU="�����ߥʥ�"
		MISCMENU="��������"
		XUTILSMENU="X�桼�ƥ���ƥ�"
		FBSETTINGSMENU="Fluxbox����"
		KDEMENUTEXT="KDE��˥塼"
		GNOMEMENUTEXT="Gnome��˥塼"
		RESTARTITEM="�Ƶ�ư"
		EXITITEM="��λ"
		CONFIGUREMENU="����"
		RELOADITEM="���ɤ߹���"
		STYLEMENU="��������"
		STYLEMENUTITLE="������������..."
		WORKSPACEMENU="������ڡ���"
	;;
	fr_FR) # french	locales
		BROWSERMENU="Navigateurs"
		EDITORMENU="Editeurs"
		NETMENU="Net"
		GRAPHICMENU="Graphisme"
		MUSICMENU="Musique"
		DEFAULT_TERMINALMENU="Terminaux"
		MISCMENU="Misc"
		XUTILSMENU="X-utils"
		FBSETTINGSMENU="FB-Settings"
		KDEMENUTEXT="menus-KDE"
		GNOMEMENUTEXT="menus-Gnome"
		RESTARTITEM="Red�marrer"
		EXITITEM="Sortir"
		CONFIGUREMENU="Configurer"
		RELOADITEM="Recharger config"
		STYLEMENU="Styles"
		STYLEMENUTITLE="Choisir un style..."
		WORKSPACEMENU="Liste des bureaux"
	;;
	it_IT|it_IT@euro) # italian locales
		BROWSERMENU="Browsers"
		EDITORMENU="Editori"
		NETMENU="Internet"
		GRAPHICMENU="Grafica"
		MUSICMENU="Musica"
		DEFAULT_TERMINALMENU="Terminali"
		MISCMENU="Varie"
		XUTILSMENU="X-utils"
		FBSETTINGSMENU="Preferenze"
		KDEMENUTEXT="menu KDE"
		GNOMEMENUTEXT="menu Gnome"
		RESTARTITEM="Riavvia"
		EXITITEM="Esci"
		CONFIGUREMENU="Configurazione"
		RELOADITEM="Rileggi la configurazione"
		STYLEMENU="Scegli uno stile..."
		STYLEMENUTITLE="Scegli uno stile..."
		WORKSPACEMENU="Aree di lavoro"
	;;
	*)
	;;
esac

# Start of menu

echo "[begin] (${MENUTITLE})" > ${FILENAME}

append "[exec]	  (${DEFAULT_TERM}) {${DEFAULT_TERM}}"
find_it nedit		append "[exec]	 (nedit) {nedit}"


append_submenu ${BROWSERMENU}
	find_it netscape    append "[exec]   (netscape) {netscape}"
	find_it opera	    append "[exec]   (opera) {env QT_XFT=true opera}"
	find_it galeon	    append "[exec]   (galeon) {galeon}"
	find_it mozilla	    append "[exec]   (mozilla) {mozilla}"
	find_it konqueror   append "[exec]   (konqueror) {konqueror}"
	find_it links	    append "[exec]   (links) {${DEFAULT_TERM} -title links -e links fluxbox.sf.net}"
	find_it w3m	    append "[exec]   (w3m) {${DEFAULT_TERM} -title w3m -e w3m}"
	find_it lynx	    append "[exec]   (lynx) {${DEFAULT_TERM} -title lynx -e lynx}"
	find_it dillo	    append "[exec]   (dillo) {dillo}"
append_menu_end

append_submenu ${EDITORMENU}
	find_it nedit	    append "[exec]   (nedit) {nedit}"
	find_it vim	    append "[exec]   (vim) {vim -g}"
	find_it xemacs	    append "[exec]   (xemacs) {xemacs}"
	find_it emacs	    append "[exec]   (emacs) {emacs}"
	find_it gedit	    append "[exec]   (gedit) {gedit}"
	find_it xedit	    append "[exec]   (xedit) {xedit}"
	find_it kword	    append "[exec]   (kword) {kword}"
	find_it kwrite	    append "[exec]   (kwrite) {kwrite}"
	find_it kate	    append "[exec]   (kate) {kate}"
append_menu_end

append_submenu ${NETMENU}
	find_it realplay    append "[exec]   (realplayer) {realplay}"
	find_it licq	    append "[exec]   (licq) {env QT_XFT=true licq}"
	find_it gaim	    append "[exec]   (gaim) {gaim}"
	find_it sylpheed    append "[exec]   (sylpheed) {sylpheed}"
	find_it kmail		append "[exec]	 (kmail) {kmail}"
	find_it gnomemeeting	append "[exec]	 (gnomemeeting) {gnomemeeting}"
	find_it evolution   append "[exec]   (evolution) {evolution}"
	find_it mutt	    append "[exec]   (mutt) {${DEFAULT_TERM} -title mutt -e mutt}"

	find_it gftp	    append "[exec]   (gftp) {gftp}"
	find_it pan	    append "[exec]   (pan)  {pan}"
	find_it xchat	    append "[exec]   (xchat) {xchat}"
	find_it irssi	    append "[exec]   (irssi) {${DEFAULT_TERM} -title irssi -e irssi}"
	find_it BitchX	    append "[exec]   (BitchX) {${DEFAULT_TERM} -title BitchX -e BitchX -N}"
	find_it bitchx	    append "[exec]   (BitchX) {${DEFAULT_TERM} -title BitchX -e bitchx -N}"
	find_it ircii	    append "[exec]   (ircii) {${DEFAULT_TERM} -title ircii -e ircii -s}"
append_menu_end

append_submenu ${GRAPHICMENU}
	find_it gimp	    append "[exec]   (gimp) {gimp}"
	find_it gimp-1.3    append "[exec]   (gimp 1.3) {gimp-1.3}"
	find_it xv	    append "[exec]   (xv) {xv}"
	find_it gqview	    append "[exec]   (gqview) {gqview}"
	find_it xpaint	    append "[exec]   (xpaint) {xpaint}"
	find_it kpaint	    append "[exec]   (kpaint) {kpaint}"
	find_it kiconedit   append "[exec]   (kiconedit) {kiconedit}"
	find_it xscreensaver-demo  append "[exec]   (xscreensaver-demo) {xscreensaver-demo}"
append_menu_end

append_submenu ${MUSICMENU}
	find_it xmms	    append "[exec]   (xmms) {xmms}"
	find_it gqmpeg	    append "[exec]   (gqmpeg) {gqmpeg}"
	find_it xmixer	    append "[exec]   (xmixer) {xmixer}"
	find_it gmix	    append "[exec]   (gmix) {gmix}"
	find_it kmix	    append "[exec]   (kmix) {kmix}"
	find_it grecord	    append "[exec]   (grecord) {grecord}"
	find_it kmidi	    append "[exec]   (kmidi) {kmidi}"
	find_it xplaycd	    append "[exec]   (xplaycd) {xplaycd}"
	find_it soundtracker append "[exec]   (soundtracker) {soundtracker}"
	find_it cplay	    append "[exec]   (cplay) {${DEFAULT_TERM} -title cplay -e /usr/local/bin/cplay}"
	find_it grip	    append "[exec]   (grip) {grip}"
append_menu_end

append_submenu ${DEFAULT_TERMINALMENU}
	find_it xterm	    append "[exec] (xterm) {xterm}"
	find_it gnome-terminal append "[exec] (gnome-terminal) {gnome-terminal}"
	find_it Eterm	    append "[exec] (Eterm) {Eterm}"
	find_it konsole	    append "[exec] (konsole) {konsole}"
	find_it aterm	    append "[exec] (aterm) {aterm}"
	find_it rxvt	    append "[exec] (rxvt) {rxvt}"
append_menu_end

append_submenu ${MISCMENU}
	find_it acroread    append "[exec] (acroread) {acroread}"
	find_it xpdf	    append "[exec] (xpdf) {xpdf}"
	find_it xine	    append "[exec] (xine) {xine}"
	find_it aviplay	    append "[exec] (aviplay) {aviplay}"
	find_it gtv	    append "[exec] (gtv) {gtv}"
	find_it xmovie	    append "[exec] (xmovie) {xmovie}"
	find_it xcdroast    append "[exec] (xcdroast) {xcdroast}"
	find_it gcalc	    append "[exec] (gcalc) {gcalc}"
	find_it kcalc	    append "[exec] (kcalc) {kcalc}"
	find_it kpackage    append "[exec] (kpackage) {kpackage}"
	find_it xgdb	    append "[exec] (xgdb) {xgdb}"
	find_it ddd	    append "[exec] (ddd) {ddd}"
	find_it ${DEFAULT_TERM}	     append "[exec] (tail access_log) {${DEFAULT_TERM} -title access_log -e tail -f /var/log/access_log}"
append_menu_end


append_submenu ${XUTILSMENU}
	find_it xpenguins   append "[exec] (xpenguins) {xpenguins}"
	find_it xcalc	    append "[exec] (xcalc) {xcalc}"
	find_it xfontsel    append "[exec] (xfontsel) {xfontsel}"
	find_it xman	    append "[exec] (xman) {xman}"
	find_it xload	    append "[exec] (xload) {xload}"
	find_it xfig	    append "[exec] (xfig) {xfig}"
	find_it xbiff	    append "[exec] (xbiff) {xbiff}"
	find_it editres	    append "[exec] (editres) {editres}"
	find_it viewres	    append "[exec] (viewres) {viewres}"
	find_it xsnow	    append "[exec] (xsnow) {xsnow}"
	find_it xclock	    append "[exec] (xclock) {xclock}"
append_menu_end

# gnome menu
if [ -d ${PKGDATADIR}/gnome/apps -a "${GNOMEMENU}" ]; then
    append_submenu ${GNOMEMENUTEXT}
    for a in `ls ${PKGDATADIR}/gnome/apps`; do
	if [ -d ${PKGDATADIR}/gnome/apps/"${a}" ] ; then
	    append_submenu "${a}"
	    menu_entry_dir "${PKGDATADIR}/gnome/apps/"${a}""
	    menu_entry_dircheck "/etc/X11/applnk/"${a}""
	    append_menu_end
	fi
    done
    append_menu_end
fi

# kde submenu
if [ -d ${PKGDATADIR}/applnk/ -a "${KDEMENU}" ]; then
    append_submenu ${KDEMENUTEXT}
    for a in `ls ${PKGDATADIR}/applnk/`; do
	if [ -d ${PKGDATADIR}/applnk/"${a}" ]; then
	    append_submenu "${a}"
	    for x in `ls ${PKGDATADIR}/applnk/"${a}"`; do
		if [ -d ${PKGDATADIR}/applnk/"${a}"/"${x}" ]; then
		    append_submenu "${x}"
		    menu_entry_dir ${PKGDATADIR}/applnk/"${a}"/"${x}"
		    append_menu_end
		fi
	    done
	    menu_entry_dir ${PKGDATADIR}/applnk/"${a}"
	    append_menu_end
	fi
    done
    menu_entry_dir ${PKGDATADIR}/applnk/
    append_menu_end
fi


append_submenu ${FBSETTINGSMENU}
	append "[workspaces]   (${WORKSPACEMENU})"

	append_menu "[submenu] (${STYLEMENU}) {${STYLEMENUTITLE}}"
		append "[stylesdir] (~/.fluxbox/styles)"
		append "[stylesdir] (${PKGDATADIR}/fluxbox/styles)"
	append_menu_end

	append "[config] (${CONFIGUREMENU})"
	append "[reconfig] (${RELOADITEM})"

	find_it fluxconf append "[exec] (Fluxconf) {fluxconf}"

	# if gxmessage exitst use it; else use xmessage
	find_it gxmessage append "[exec] (Windowname) {xprop|grep WM_CLASS|cut -d \\\" -f 2|gxmessage -file - -center}"
	[ $? -ne 0 ] && \
	find_it xmessage append "[exec] (Windowname) {xprop|grep WM_CLASS|cut -d \\\" -f 2|xmessage -file - -center}"

append_menu_end

	append "[restart] (${RESTARTITEM})"
	append "[exit] (${EXITITEM})"

append_menu_end