#!/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.

# Functions

display_usage () {
	echo
	echo "fluxbox-generate_menu"
	echo 'Usage: fluxbox-generate_menu [-kg] [-o /path]'
	echo '         [-p /path] [-m menu-title]'
	echo "Options:"
	echo "  -k  Insert a kde menu"
	echo "  -g  Add a gnome menu"
	echo "  -p  Package-datadir; default is /usr/local/share"
	echo "  -o  Outputfile; default is ~/.fluxbox/menu"
	echo '  -m  Menu-title; default is "Fluxbox"'
	echo "  -h  Display this help"
	echo "  -a  Display the authors of this script"
	echo
}
display_help () {
	echo
	echo "This program generates a menu-file for fluxbox."
	echo "Use fluxbox-generate_menu -h for brief usage instructions"
	echo
}

display_authors () {
	echo
	echo "This program was brought to you by:"
	echo
	echo "Henrik Kinnunnen:	Project leader."
	echo "Han Boetes:		Packaging, debugging and scripts."
	echo "Jeramy B. Smith:	Packaging assistance, gnome and kde menu system."
	echo "Xyrnix:			Mysterious guest developer who made find_it module."
	echo `whoami`":			Innocent bystander."
	echo
}

find_it() {
	_it="`which \"$1\" 2>/dev/null | grep \"^/.*$1\"`"
	if [ ! -z "$_it" ]; then
		if [ -x "$_it" ]; then
			shift
			$*
		else
			echo "$1 exists but it is not executable!  Check permissions."
		fi
	fi
}

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 ":khagp:o:m:" COMMAND_LINE_ARGUMENT ; do

	case "${COMMAND_LINE_ARGUMENT}" in

	k)
		KDEMENU=yes
	;;

	g)
		GNOMEMENU=yes
	;;

	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

# menu defaults (if translation forget to set one of them)
BROWSERMENU="Browsers"
EDITORMENU="Editors"
NETMENU="Net"
GRAPHICMENU="Graphics"
MUSICMENU="Music"
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="����"
		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"
		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"
		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"
		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="����"
		TERMINALMENU="�����ߥʥ�"
		MISCMENU="��������"
		XUTILSMENU="X�桼�ƥ���ƥ�"
		FBSETTINGSMENU="Fluxbox����"
		KDEMENUTEXT="KDE��˥塼"
		GNOMEMENUTEXT="Gnome��˥塼"
		RESTARTITEM="�Ƶ�ư"
		EXITITEM="��λ"
		CONFIGUREMENU="����"
		RELOADITEM="���ɤ߹���"
		STYLEMENU="��������"
		STYLEMENUTITLE="������������..."
		WORKSPACEMENU="������ڡ���"
	;;
	fr_FR) # french		
		BROWSERMENU="Navigateurs"
		EDITORMENU="Editeurs"
		NETMENU="Net"
		GRAPHICMENU="Graphisme"
		MUSICMENU="Musique"
		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"
	;;
	*)
	;;
esac

# Start of menu

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

find_it xterm           append "[exec]   (xterm) {xterm -fg white -bg black}"
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) {xterm -title links -fg white -bg black -e links fluxbox.sf.net}"
        find_it w3m         append "[exec]   (w3m) {xterm -title w3m -fg white -bg black -e w3m}"
	find_it lynx        append "[exec]   (lynx) {xterm -title lynx -fg white -bg black -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) {xterm -title mutt -fg white -bg black -e mutt}"
	
	find_it gftp        append "[exec]   (gftp) {gftp}"
	find_it xchat       append "[exec]   (xchat) {xchat}"
	find_it irssi       append "[exec]   (irssi) {xterm -title irssi -e irssi}"
	find_it BitchX      append "[exec]   (BitchX) {xterm -title BitchX -fg white -bg black -e BitchX -N}"
	find_it bitchx      append "[exec]   (BitchX) {xterm -title BitchX -fg white -bg black -e bitchx -N}"
	find_it ircii       append "[exec]   (ircii) {xterm -title ircii -fg white -bg black -e ircii -s}"
append_menu_end

append_submenu ${GRAPHICMENU}
	find_it gimp        append "[exec]   (gimp) {gimp}"
	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) {xterm -title cplay -fg white -bg black -e /usr/local/bin/cplay}"
	find_it grip        append "[exec]   (grip) {grip}"
append_menu_end

append_submenu ${TERMINALMENU}
	append "[exec] (xterm) {xterm -fg white -bg black}"
	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 xterm       append "[exec] (tail access_log) {xterm -fg white -bg black -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] (${PKGDATADIR}/fluxbox/styles)"
		append "[stylesdir] (${HOME}/.fluxbox/styles)"
	append_menu_end

	append "[config] (${CONFIGUREMENU})"
	append "[reconfig] (${RELOADITEM})"
	
	find_it fluxconf append "[exec] (Fluxconf) {fluxconf}"

append_menu_end

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

append_menu_end