#!/bin/sh
# Author : dave@meyer.LA
# Date   : 01/01/2011
#
# LxMenuEditor
# Finally, a complete, straightforward, bulletproof menu editor for LXDE
#
# Dependencies: lxshortcut, zenity
#
# i18n - Internationalization - Internationalisierung
export TEXTDOMAIN=lxMenuEditor
export TEXTDOMAINDIR="/usr/share/locale"
#Trap to ensure we stay clean
clean_up(){
unset IFS
unset LANG2
cd "$HOME/.local/share/applications"
rm -f tmpfile*
}

trap 'clean_up' EXIT INT TERM QUIT SIGINT SIGQUIT SIGTERM

#Preliminaries:
clean_up
LANG2=`echo $LANG | tr '.' '\t' | awk '{ print $1 }'`
export LANG2

#Functions:
SanityCheck(){
echo 10
#Bar none, the most reliable method to overcome the problems associated with multiple files with spaces is to rename.
cd "$HOME/.local/share/applications"
IFS=$'\n'
for FILE in `ls *.desktop | grep " "` ; do mv "$FILE" `echo $FILE | tr ' ' '_'` ; done
unset IFS
echo 20
#Ensure there are Name= and Name[lang]= tags
cd "$HOME/.local/share/applications"
for FILE in `ls *.desktop`
do NAM=`cat "$FILE" | grep -x ^Name=.* | sed -e 's/.*=//g'`
NAML=`cat "$FILE" | grep -x ^Name.$LANG2.=.* | sed -e 's/.*=//g'`
	if [ "$NAM" ] || [ "$NAML" ]; then
		if [ "$NAM" ] && [ -z "$NAML" ]; then
#Copy Name= to Name[lang]=
		echo "Name[$LANG2]=${NAM}" >> "$FILE"
		fi
		if [ "$NAML" ] && [ -z "$NAM" ]; then
#Copy Name[lang]= to Name= 
		echo "Name=${NAML}" >> "$FILE"
		fi
	fi
	if [ -z "$NAML" ] && [ -z "$NAM" ]; then	#REM The return status of AND and OR lists is the exit status of the last command executed in the list : *    with command1 && command2, command2 is executed only if command1 returns an exit status of zero (true)    *    with command1 â”‚â”‚ command2, command2 is executed only if command1 returns a non-zero exit status (false)
		echo "Name=<empty>" >> "$FILE"
		echo "Name[$LANG2]=<empty>" >> "$FILE"
	fi
done
echo 30
for FILE in `ls *.desktop`
do COM=`cat "$FILE" | grep -x ^Comment=.* | sed -e 's/.*=//g'`
COML=`cat "$FILE" | grep -x ^Comment.$LANG2.=.* | sed -e 's/.*=//g'`
	if [ "$COM" ] || [ "$COML" ]; then
		if [ "$COM" ] && [ -z "$COML" ]; then
#Copy Name= to Name[lang]=
		echo "Comment[$LANG2]=${COM}" >> "$FILE"
		fi
		if [ "$COML" ] && [ -z "$COM" ]; then
#Copy Name[lang]= to Name= 
		echo "Comment=${COML}" >> "$FILE"
		fi
	fi
	if [ -z "$COML" ] && [ -z "$COM" ]; then
		echo "Comment=<empty>" >> "$FILE"
		echo "Comment[$LANG2]=<empty>" >> "$FILE"
	fi
done
echo 40
for ME in `grep -L ^Exec= *.desktop` ; do echo "Exec=<empty>" >> "$ME" ; done
for MCat in `grep -L ^Categories= *.desktop` ; do echo "Categories=<empty>" >> "$MCat" ; done
# All tagged not to show in LXDE get the NoDisplay=true for reliable filtering later
for OSI in `grep -H -E -l -x -e 'OnlyShowIn.*' *.desktop | xargs -L50 grep -L -e 'OnlyShowIn=.*LXDE *'`
do sed -e '/NoDisplay=.*/d' -e '/^$/ d' -i "$OSI"
echo "NoDisplay=true" >> "$OSI"
done
echo 50

#Dups
cd "$HOME/.local/share/applications"
#Remove duplicates
for FILE in *.desktop
do occ=`grep -c ^Name= "$FILE"`
#Non-integer trap.
echo "$occ" | grep "[^0-9]" > /dev/null 2>&1
echo $occ >tmpfile11 #found this to be req when debugging, go figure.
if [ "$?" -eq 1 ]; then
	return
else
	if [ "$occ" -gt 1 ]; then
		linetokeep=`grep -m 1 ^Name=.* "$FILE"`
		sed -e '/^Name=.*/d' -e '/^$/ d' -i "$FILE"
		echo "$linetokeep" >> "$FILE"
	fi
fi
done
echo 60
for FILE in *.desktop
do occ=`grep -c ^Exec= "$FILE"`
#Non-integer trap.
echo "$occ" | grep "[^0-9]" > /dev/null 2>&1
echo $occ >tmpfile11 #found this to be req when debugging, go figure.
if [ "$?" -eq 1 ]; then
	return
else
	if [ "$occ" -gt 1 ]; then
		linetokeep=`grep -m 1 ^Exec=.* "$FILE"`
		sed -e '/^Exec=.*/d' -e '/^$/ d' -i "$FILE"
		echo "$linetokeep" >> "$FILE"
	fi
fi
done
echo 70
for FILE in *.desktop
do occ=`grep -c ^Comment= "$FILE"`
#Non-integer trap.
echo "$occ" | grep "[^0-9]" > /dev/null 2>&1
echo $occ >tmpfile11 #found this to be req when debugging, go figure.
if [ "$?" -eq 1 ]; then
	return
else
	if [ "$occ" -gt 1 ]; then
		linetokeep=`grep -m 1 ^Comment=.* "$FILE"`
		sed -e '/^Comment=.*/d' -e '/^$/ d' -i "$FILE"
		echo "$linetokeep" >> "$FILE"
	fi
fi
done
echo 80
for FILE in *.desktop
do occ=`grep -c ^Categories= "$FILE"`
#Non-integer trap.
echo "$occ" | grep "[^0-9]" > /dev/null 2>&1
echo $occ >tmpfile11 #found this to be req when debugging, go figure.
if [ "$?" -eq 1 ]; then
	return
else
	if [ "$occ" -gt 1 ]; then
		linetokeep=`grep -m 1 ^Categories=.* "$FILE"`
		sed -e '/^Categories=.*/d' -e '/^$/ d' -i "$FILE"
		echo "$linetokeep" >> "$FILE"
	fi
fi
done
echo 90
for FILE in *.desktop
do occ=`grep -c ^Name.$LANG2.= "$FILE"`
#Non-integer trap.
echo "$occ" | grep "[^0-9]" > /dev/null 2>&1
echo $occ >tmpfile11 #found this to be req when debugging, go figure.
if [ "$?" -eq 1 ]; then
	return
else
	if [ "$occ" -gt 1 ]; then
		linetokeep=`grep -m 1 ^Name.$LANG2.=.* "$FILE"`
		sed -e '/Name\['"$LANG2"'\]=.*/d' -e '/^$/ d' -i "$FILE"
		echo "$linetokeep" >> "$FILE"
	fi
fi
done
echo 95
for FILE in *.desktop
do occ=`grep -c ^Comment.$LANG2.= "$FILE"`
#Non-integer trap.
echo "$occ" | grep "[^0-9]" > /dev/null 2>&1
echo $occ >tmpfile11 #found this to be req when debugging, go figure.
if [ "$?" -eq 1 ]; then
	return
else
	if [ "$occ" -gt 1 ]; then
		linetokeep=`grep -m 1 ^Comment.$LANG2.=.* "$FILE"`
		sed -e '/Comment\['"$LANG2"'\]=.*/d' -e '/^$/ d' -i "$FILE"
		echo "$linetokeep" >> "$FILE"
	fi
fi
done
echo 101
}

SanityCheck | zenity --progress --auto-close --auto-kill --width=500 --title=$"Applying sanity checks and auto-corrections" --text=$"This essential step ensures LXDE operates error-free. \n\nIt speeds up .desktop file processing and menu access. \n\nPlease, it's worth the wait..."
EXIT=$?
	if [ $EXIT -ne 0 ] ; then
		exit 0
	fi

TurnOn(){
cd "$HOME/.local/share/applications"
#To show comment out:
#"NotShowIn" lines that include "LXDE" with a single "#"
#"OnlyShowIn" lines that do not include "LXDE" with a single "#"
#"Hidden=true" with a single "#"
#rm NoDisplay=true
for FILE in `echo "$ToTurnOn"` ; do sed '
							s/NotShowIn.*LXDE/#&/g
							/^##/s/#//1
							/LXDE/!s/OnlyShowIn/#&/g
							/^##/s/#//1
							s/Hidden=true/#&/g
							/^##/s/#//1
							/NoDisplay=.*/d 
							/^$/ d' -i "$HOME/.local/share/applications"/"$FILE" ; done
#This may generate a minor error like "Output line too long" . Barnette @ http://www.grymoire.com/Unix/Sed.html#uh-41 considers this a bug, and has reported it to Sun.
}

TurnOff(){
cd "$HOME/.local/share/applications"
#To hide: 
#rm "NoDisplay=" and prevent duplicates
#add "NoDisplay=true"
for FILE in `echo "$ToTurnOff"` ; do sed -e '/NoDisplay=.*/d' -e '/^$/ d' -i "$HOME/.local/share/applications"/"$FILE" ; done
for FILE in `echo "$ToTurnOff"` ; do echo "NoDisplay=true" >> "$HOME/.local/share/applications"/"$FILE" ; done
}

MainMenuLoop(){
while :
do

#Choices choices choices...
chose=`zenity --list --height="260" --width="250" --title="LXDE Menu Editor" --text=$"What do you want to do? \n\nClick <b>CANCEL</b> to <b>EXIT</b>." --column="" $"Create a launcher" $"Edit a launcher" $"Show or Hide launcher(s)" $"Delete existing launcher(s)" $"Override system-wide launchers"`
#Clicking CANCEL or empty OK exits the script
	EXIT=$?
	if [ $EXIT -ne 0 ] ; then
		exit 0
	fi
if [ -z "$chose" ]; then
		exit 0
fi

if [ "$chose" = $"Create a launcher" ]; then
DefineName(){
	itemname=`zenity --entry --text=$"Enter a name (example: lxterminal) \n\nNote that capital letters are filed before lower case letters. \n\n(This name is only for the *.desktop file.)"`
#Clicking CANCEL loops back, OK asks again
		EXIT=$?
		if [ $EXIT -ne 0 ] ; then
			MainMenuLoop
		else
			FileExists
		fi
}

FileExists(){
	cd "$HOME/.local/share/applications"
	if [ -e "$itemname".desktop ]; then
		zenity --question --title=$"Warning" --width="200" --text=$"${itemname}.desktop already exists. \n\n<b>Overwrite?</b>"
#Clicking CANCEL loops back, OK continues
		EXIT=$?
		if [ $EXIT -ne 0 ] ; then
			DefineName
		else
			Create
		fi
	else
		Create
	fi
}

Create(){ 			
		if [ "$itemname" ]; then
			cd "$HOME/.local/share/applications"
			lxshortcut -o "$itemname".desktop
#Sanity check: test if the new launcher is more than an empty file
			SANCHK=`du -b "$itemname".desktop | awk '{ print $1 }'`
#If no then rm and notify of cancelation before returning to main menu
			if [ "$SANCHK" -lt 110 ]; then
				rm "$HOME/.local/share/applications"/"$itemname".desktop
				zenity --info --title=$"Warning" --width="200" --text=$"${itemname}.desktop was empty and was therefore DISCARDED. \n\n\nPlease try again."
			else
				select=`zenity --list --height="330" --width="400" --text=$"Choose the LXMenu Section(s) to file ${itemname}.desktop under." --checklist --multiple --separator=";" --hide-column=2 --print-column=2 --column="" --column=$"Returned Output" --column=$"Category" FALSE Utility Accessories FALSE Graphics Graphics FALSE Network Internet FALSE Office Office TRUE Other Other FALSE AudioVideo $"Sound & Video" FALSE System $"System Tools" FALSE Accessibility $"Universal Access" FALSE Settings $"System -> Preferences" FALSE SystemSetup $"System -> Administration"`
#Failure to select at least one checkmark results in the Categories tag being set to Other
				if `grep -qw "^Categories=;" "$itemname".desktop` ; then
					sed -e '/^Categories=.*/d' -e '/^$/ d' -i "$itemname".desktop
					echo "Categories=Other;" >> "$HOME/.local/share/applications"/"$itemname".desktop
					zenity --info --title=$"Note" --width="200" --text=$"${itemname}.desktop filed under <i>Other</i> by default."
				else
				echo "Categories=${select};" >> "$HOME/.local/share/applications"/"$itemname".desktop
				fi
#Sanity Check: test if the new launcher is more than an empty file
				SANCHK=`du -b "$itemname".desktop | awk '{ print $1 }'`
#If no then delete and notify of cancelation before returning to main menu
					if [ "$SANCHK" -lt 123 ]; then
					rm "$HOME/.local/share/applications"/"$itemname".desktop
					zenity --info --title=$"Warning" --width="200" --text=$"${itemname}.desktop was empty and was therefore DISCARDED. \n\n\nPlease try again."
					fi
			fi
#Failure to select a file yet clicking OK
		elif [ !"$itemname" ]; then
			zenity --question --title=$"Note" --width="200" --text=$"Please enter a name."
			EXIT=$?
			if [ $EXIT -ne 0 ] ; then
				MainMenuLoop
			else
				DefineName
			fi
		fi
}

DefineName
#rm spaces in new name.
cd "$HOME/.local/share/applications"
IFS=$'\n'
for FILE in `ls *.desktop | grep " "` ; do mv "$FILE" `echo $FILE | tr ' ' '_'` ; done
unset IFS
fi
# Loop back to the main menu to continue

if [ "$chose" = $"Edit a launcher" ]; then
#Rescan to reflect changes since the last operation
	scan_OFF=`grep -H -E -l -x -e 'NoDisplay=true' -e 'Hidden=true' -e 'NotShowIn.*LXDE.*' *.desktop`
	scan_ON=`ls *.desktop | grep -v "$scan_OFF"`
	scan_ON_displayname=`echo "$scan_ON" | xargs grep -x ^Name.$LANG2.=.* | sed -e 's/.*=//g'`
	scan_ON_command=`echo "$scan_ON" | xargs grep -x ^Exec=.* | sed -e 's/.*=//g'`
	scan_ON_comment=`echo "$scan_ON" | xargs grep -x ^Comment.$LANG2.=.* | sed -e 's/.*=//g'`
	scan_ON_categories=`echo "$scan_ON" | xargs grep -x ^Categories=.* | sed -e 's/.*=//g'`
#Format to suit zenity's rigidly anal --list input requirements
	echo "${scan_ON_displayname}" | sed -e 's/^$/<empty>/g' > tmpfile1
	echo "${scan_ON}" > tmpfile2
	echo "${scan_ON_command}" | sed 's/^$/<empty>/g' > tmpfile3
	echo "${scan_ON_comment}" | sed 's/^$/<empty>/g' > tmpfile4
	echo "${scan_ON_categories}" | sed 's/^$/<empty>/g' > tmpfile5
	zlist=`pr -m -t -s"|" tmpfile1 tmpfile2 tmpfile3 tmpfile4 tmpfile5 | awk '{print $0}' | sed -e 's/|/\n/g'`

IFS=$'\n'
selected=`zenity --list --height="700" --width="1300" --title=$"Launchers currently showing" --text=$"Select the launcher to <b>EDIT</b>" --print-column=2 --column=$"Display Name" --column=Filename --column=Command --column=$"Tooltip Comment" --column=Categories $zlist`
unset IFS
#Clicking CANCEL loops back to main menu
	EXIT=$?
	if [ $EXIT -ne 0 ] ; then
		MainMenuLoop
	fi
	if [ $selected ]; then
#Test if Categories exist, if not asign to Other
	NOCAT=`grep -L ^Categories= $selected`	
		if [ "$NOCAT" = $selected ]; then
			echo "Categories=Other;" >> "$HOME/.local/share/applications"/$selected
		fi
	lxshortcut -i $selected
#ensure default tags correspond to language-set tags for Comment= tags
	TAG1=`grep "^Name.$LANG2.=.*" "$HOME/.local/share/applications"/"$selected" | sed 's/^Name.*=//'`
	if [ "$TAG1" ]; then
		#rm Name= line
		sed -e '/^Name=/d' -e '/^$/ d' -i "$HOME/.local/share/applications"/"$selected"
		#copy Name[en_US]= tag to Name= tag
		echo "Name=${TAG1}" >> "$HOME/.local/share/applications"/"$selected"
	fi
	TAG2=`grep "^Comment.$LANG2.=.*" "$HOME/.local/share/applications"/"$selected" | sed 's/^Comment.*=//'`
	if [ "$TAG2" ]; then
		#rm Comment= line
		sed -e '/^Comment=/d' -e '/^$/ d' -i "$HOME/.local/share/applications"/"$selected"
		#copy Comment[en_US]= tag to Comment= tag
		echo "Comment=${TAG2}" >> "$HOME/.local/share/applications"/"$selected"
	fi
		BEFORE=`grep Categories $selected`
		if `grep Categories $selected | grep -qw Utility` ; then a1=TRUE ; else a1=FALSE ; fi
		if `grep Categories $selected | grep -qw Graphics` ; then b1=TRUE ; else b1=FALSE ; fi
		if `grep Categories $selected | grep -qw Network` ; then c1=TRUE ; else c1=FALSE ; fi
		if `grep Categories $selected | grep -qw Office` ; then d1=TRUE ; else d1=FALSE ; fi
		if `grep Categories $selected | grep -qw Other` ; then e1=TRUE ; else e1=FALSE ; fi
		if `grep Categories $selected | grep -qw AudioVideo` ; then f1=TRUE ; else f1=FALSE ; fi
		if `grep Categories $selected | grep -qw System` ; then g1=TRUE ; else g1=FALSE ; fi
		if `grep Categories $selected | grep -qw Accessibility` ; then h1=TRUE ; else h1=FALSE ; fi
		if `grep Categories $selected | grep -qw Settings` ; then i1=TRUE ; else i1=FALSE ; fi
		if `grep Categories $selected | grep -qw SystemSetup` ; then j1=TRUE ; else j1=FALSE ; fi
		select=`zenity --list --height="330" --width="400" --text=$"Choose the LXMenu Section(s) to file $selected under." --checklist --multiple --separator=";" --hide-column=2 --print-column=2 --column="" --column=$"Returned Output" --column=$"Category" $a1 Utility Accessories $b1 Graphics Graphics $c1 Network Internet $d1 Office Office $e1 Other Other $f1 AudioVideo $"Sound & Video" $g1 System $"System Tools" $h1 Accessibility $"Universal Access" $i1 Settings $"System -> Preferences" $j1 SystemSetup $"System -> Administration"`
			EXIT=$?
			if [ $EXIT -ne 0 ] ; then
				AFTER="$BEFORE"
			else 
				AFTER=`echo "Categories=${select};"`
			fi
			if [ "$BEFORE" != "$AFTER" ]; then
				sed -e '/^Categories=.*/d' -i $selected
				echo "Categories=${select};" >> "$HOME/.local/share/applications"/$selected
			fi
#Failure to select at least one checkmark results in the Categories tag being set to Other
		if `grep -qw "^Categories=;" $selected` ; then
			sed -e '/^Categories=.*/d' -i $selected
			echo "Categories=Other;" >> "$HOME/.local/share/applications"/$selected
			zenity --info --title=$"Note" --width="200" --text=$"$selected filed under <i>Other</i> by default."
		fi
#Failure to select a file yet clicking OK
	elif [ !"$selected" ]; then
		zenity --info --title=$"Note" --width="200" --text=$"No launcher selected to edit."
	fi
fi
#Loop back to the main menu to continue

if [ "$chose" = $"Show or Hide launcher(s)" ]; then
#Rescan to reflect changes since the last operation
	scan_OFF=`grep -H -E -l -x -e 'NoDisplay=true' -e 'Hidden=true' -e 'NotShowIn.*LXDE.*' *.desktop`
	scan_ON=`ls *.desktop | grep -v "$scan_OFF"`
	scan_ON_displayname=`echo "$scan_ON" | xargs grep -x ^Name.$LANG2.=.* | sed -e 's/.*=//g'`
	scan_ON_command=`echo "$scan_ON" | xargs grep -x ^Exec=.* | sed -e 's/.*=//g'`
	scan_ON_comment=`echo "$scan_ON" | xargs grep -x ^Comment.$LANG2.=.* | sed -e 's/.*=//g'`
#Format to suit zenity's rigidly anal --list input requirements
	echo "${scan_ON_displayname}" | sed -e 's/^$/<empty>/g' -e 's/^/TRUE|/g' > tmpfile1
	echo "${scan_ON}" > tmpfile2
	echo "${scan_ON_command}" | sed 's/^$/<empty>/g' > tmpfile3
	echo "${scan_ON_comment}" | sed 's/^$/<empty>/g' > tmpfile4

	scan_OFF_displayname=`echo "$scan_OFF" | xargs grep -x ^Name.$LANG2.=.* | sed -e 's/.*=//g'`
	scan_OFF_command=`echo "$scan_OFF" | xargs grep -x ^Exec=.* | sed -e 's/.*=//g'`
	scan_OFF_comment=`echo "$scan_OFF" | xargs grep -x ^Comment.$LANG2.=.* | sed -e 's/.*=//g'`
#Format to suit zenity's rigidly anal --list input requirements
	echo "${scan_OFF_displayname}" | sed -e 's/^$/<empty>/g' -e 's/^/FALSE|/g' > tmpfile5
	echo "${scan_OFF}" > tmpfile6
	echo "${scan_OFF_command}" | sed 's/^$/<empty>/g' > tmpfile7
	echo "${scan_OFF_comment}" | sed 's/^$/<empty>/g' > tmpfile8
	zlist1=`pr -m -t -s"|" tmpfile1 tmpfile2 tmpfile3 tmpfile4 | awk '{print $0}' | sed -e 's/|/\n/g'`
	zlist2=`pr -m -t -s"|" tmpfile5 tmpfile6 tmpfile7 tmpfile8 | awk '{print $0}' | sed -e 's/|/\n/g'`

	IFS=$'\n'
	selected2=`zenity --list --checklist --height="700" --width="1300" --title=$"All launchers" --text=$"Select the launcher(s) to <b>SHOW</b>" --print-column=3 --column=$"Sort" --column=$"Display Name" --column=Filename --column=Command --column=$"Tooltip Comment" $zlist1 $zlist2`
	unset IFS
#Clicking Cancel or selecting nothing yet clicking OK loops the script back to the main menu
	EXIT=$?
	if [ $EXIT -eq 0 -a "$selected2" ] ; then
		echo "$selected2" | sed 's/|/\n/g' > tmpfile9
		ToTurnOn=`diff -T tmpfile2 tmpfile9 | grep ">".* | awk '{print $2}'`
		ToTurnOff=`diff -T tmpfile2 tmpfile9 | grep "<".* | awk '{print $2}'` 
			if [ "$ToTurnOn" ]; then
				TurnOn
			fi
			if [ "$ToTurnOff" ]; then
				TurnOff
			fi
	else
		MainMenuLoop	
	fi
fi
#Loop back to the main menu to continue

if [ "$chose" = $"Delete existing launcher(s)" ]; then
	scan_ALL=`ls "$HOME/.local/share/applications" | grep .desktop | grep -v wine-extension | grep -v userapp` #exclude userapp and wine-extension
  	selected3=`zenity --list --height="600" --width="400" --text=$"Select launcher(s) to <b>DELETE</b> \n-->Use ctrl+ or shift+click for multiple selection" --multiple --separator=$'\n' --print-column=ALL --column=$"All launchers" $scan_ALL`
#Clicking Cancel loops the script back to the main menu
	EXIT=$?
	if [ $EXIT -ne 0 ] ; then
		MainMenuLoop
	fi
	if [ "$selected3" ]; then
		zenity --question --title=$"Warning" --text=$"You are about to permanently <b>REMOVE</b>: \n\n$selected3. \n\nDo you want to proceed? \n\nIf you're unsure: hide DON'T remove."
		CONF=$?
			if [ $CONF -eq 0 ] ; then
				cd "$HOME/.local/share/applications"
				rm $selected3
				zenity --info --title=$"Info" --text=$"$selected3 \n\n...permanently REMOVED"
			fi
#Failure to select a file yet clicking OK
	elif [ !"$selected3" ]; then
		zenity --info --title=$"Note" --width="200" --text=$"Nothing was deleted. \n\nPlease select at least one launcher and press OK."
	fi
fi
#Loop back to the main menu to continue

if [ "$chose" = $"Override system-wide launchers" ]; then
	zenity --question --width=580 --title=$"Warning" --text=$"This will import root launchers so they can be configured for this user. \n\nAs a nice side-effect, it will also speed up rendering of the menu in lxpanel. \n\nIt is recommended to <b>DO THIS ONCE</b>. \n\nImporting will NOT overwrite user-configured launchers. \n\nDo you want to proceed?"
	CONF2=$?
	if [ $CONF2 -eq 0 ] ; then
		cd "$HOME/.local/share/applications"
		zenity --info --width=580 --title=$"Note" --text=$'Find the directory that contains the *.desktop files you wish to gain control of. Sub-directories will NOT be imported. \n\nKDE users BEWARE: You must checkmark -Only Show In KDE- using the KDE menu editor (ie: kmenuedit) or your menus will show duplicates. \n\nThis operation is much quicker and easier through the CLI.\nOpen a terminal in the KDE directory containing the .desktop files and usually found in /usr/share/applications. As root issue the following: \n\n(Use Copy-Paste but replace your-kde-directory.)\n\nfor FILE in `grep -L ^OnlyShowIn= *.desktop` ; do echo "OnlyShowIn=KDE;" >> /usr/share/applications/your-kde-directory/"$FILE" ; done'
		rootDIR=`zenity --file-selection --title=$"Confirmation request" --directory --filename=/usr/share/applications/`
echo $rootDIR
			EXIT=$?
			if [ $EXIT -ne 0 ] ; then
				MainMenuLoop
			fi
			if [ "$rootDIR" ]; then
				cd $rootDIR
				for launcher in `ls *.desktop` ; do cp -n $rootDIR/"$launcher" "$HOME/.local/share/applications/"; done
#add any default changes to set after ";" and before "done" ie: echo "OnlyShowIn=LXDE;" >> "/$HOME/.local/share/applications/$launcher;
				cd "$HOME/.local/share/applications" 
			fi
	fi
SanityCheck | zenity --progress --auto-close --auto-kill --width=500 --title=$"Applying sanity checks and auto-corrections" --text="This essential step ensures LXDE operates error-free. \n\nIt speeds up .desktop file processing and menu access. \n\nPlease, it's worth the wait..."
EXIT=$?
	if [ $EXIT -ne 0 ] ; then
		exit 0
	fi
fi
done
}
MainMenuLoop
clean_up
exit 0
