cbagger01
Group: Members
Posts: 4264
Joined: Oct. 2003 |
|
Posted: May 23 2005,04:19 |
|
One of the things that I always liked about Debian and specifically Knoppix is this:
If you added a new program via apt-get, dpkg -i, or Synaptic, a new entry was added for this program in the KDE "start" menu if appropriate. And if you removed the program via apt-get remove, the menu entry would disappear automatically.
I did a little bit of research and learned about the Debian /usr/lib/menu/ files and their syntax. This knowledge enabled me to write a short script that will create a new submenu titled "Debian" inside the main fluxbox menu, immediately above the "Apps" submenu.
If you install or remove programs via apt-get, if you run the script again, it will dynamically rebuild the Debian menu and add or remove entries as appropriate.
It is my hope that a "Regenerate Debian Menu" item will eventually be added to DSL and this script would also be run at the end of the "Start Synaptic" script.
Anyways, here is how to use it.
1) Make a backup copy of your fluxbox menu, just in case you have a problem and need to restore your original menu: cp /home/dsl/.fluxbox/menu /home/dsl/.fluxbox/menu.backup
2) Then use Firefox to highlight the script below and then open Beaver and paste it into a new, blank text file. You can paste highlighted text by pushing the middle mouse button, or scrollwheel button.
3) Save the file as build_debmenu.sh
4) Open an xterminal and type this to make it an executable script: chmod 755 build_debmenu.sh
5) Run the script by typing: ./build_debmenu.sh
Let me know how it works (or doesn't work) for you. All feedback is welcome.
Thanks.
-CB
Code Sample | #!/bin/bash # # build_debmenu.sh - Creates a Fluxbox Debian submenu with menu items for # all Debian packages that add an entry into the # /usr/lib/menu directory # Rev 0 5/21/05 # by cbagger01 from the DSL forums
# Copy the existing fluxbox menu file and strip out # the old debmenu submenu entries and save to a temp file cat $HOME/.fluxbox/menu | grep -v debmenu > /tmp/oldmenu
# Find the line number directly above the (Apps) submenu linenum=`awk '/\(Apps\)/ { print NR }' /tmp/oldmenu` let "prevnum = linenum - 1"
# Create the first part of the new menu file sed -n '1,'$prevnum'p' /tmp/oldmenu > /tmp/newmenu
# Create the Debian fluxbox submenu entry echo " [submenu] (Debian) {} # debmenu" >> /tmp/newmenu
# Collect the Debian Menu titles # Our Debian friends do not use a consistent delimiter method for the # title value. If the title contains spaces, it is enclosed in quotes and # the delimiters are START: title=" and END: " but if the title doesn't # contain spaces, then no quotes are used and the delimiters # are START: title= and END: blankspace # This sed script will parse out the title values properly regardless # of the method used inside each menu file cat /usr/lib/menu/* 2> /dev/null | \ sed -e 's/.*title=\([^"]*\) .*/title=\1/g' \ -e 's/.*title="\([^"]*\)".*/title=\1/g' \ -n -e 's/title=//p' > /tmp/titles
# Collect the Debian Menu commands # The same issue exists with the command value because some command strings # will contain spaces, for example "/bin/ls -al" cat /usr/lib/menu/* 2> /dev/null | \ sed -e 's/.*command=\([^"]*\) .*/command=\1/g' \ -e 's/.*command="\([^"]*\)".*/command=\1/g' \ -n -e 's/command=//p' > /tmp/commands
# Loop through each title / command pair and build a menu entry i=1 total=`awk 'END { print NR }' /tmp/titles` while [ "$i" -le $total ];do title=`sed -n "$i"p /tmp/titles` command=`sed -n "$i"p /tmp/commands` # Create the new fluxbox menu entry echo " [exec] ($title) {$command} # debmenu" >> /tmp/newmenu let "i+=1" done
# Close out the Debian fluxbox submenu echo " [end] # debmenu" >> /tmp/newmenu
# Add the rest of the old menu to the end of our new menu sed -n $linenum',$p' /tmp/oldmenu >> /tmp/newmenu
# This script may be running effective as root under sudo # If so, figure out the real user name realuser= if [ -z "$SUDO_USER" ]; then realuser=$USER else realuser=$SUDO_USER fi
# Change the menu file permissions if real user is not root if [ "$realuser" != "root" ]; then chown $realuser:staff /tmp/newmenu fi
# Replace the fluxbox menu file with our newly built file mv /tmp/newmenu $HOME/.fluxbox/menu
# Clean up old temp files rm -rf /tmp/oldmenu rm -rf /tmp/titles rm -rf /tmp/commands
exit
|
|