37c03db
#!/usr/bin/python
37c03db
"""
37c03db
This script generates FreeDesktop application menu for IceWM window manager.
37c03db
37c03db
Written by Konstantin Korikov <lostclus@ua.fm>, put in the public domain
37c03db
37c03db
Requires pyxdg http://cvs.freedesktop.org/cgi-bin/viewcvs.cgi/pyxdg/
37c03db
37c03db
USAGE EXAMPLE
37c03db
37c03db
Add to $HOME/.icewm/menu this line:
37c03db
37c03db
	menuprog Applications - icewm-xdg-menu
37c03db
37c03db
and restart IceWM.
37c03db
"""
37c03db
37c03db
import sys
37c03db
import locale
37c03db
import getopt
37c03db
import re
37c03db
import xdg.Menu
37c03db
import xdg.DesktopEntry
37c03db
import xdg.IconTheme
37c03db
import xdg.Config
37c03db
37c03db
version = "0.3"
37c03db
37c03db
def print_usage(exit_code = 1):
37c03db
  print """Usage: %s [options]
37c03db
Options:
37c03db
  --locale=locale               set output languege and encoding
37c03db
  --root-folder folder          folder to generate (for example: /Games)
37c03db
  --terminal command            set terminal emulator command (default: xterm -e %%s)
37c03db
  --default-folder-icon icon    icon for folders that not provide Icon option
37c03db
  --default-entry-icon icon     icon for entries that not provide Icon option
37c03db
  --with-theme-paths            convert icon base names to icon absolute paths
37c03db
                                using icon theme
37c03db
  --entire-menu                 print entire menu
37c03db
  --icon-size                   set default icon size
37c03db
  --theme theme                 set icon theme
37c03db
  --help                        print this help and exit
37c03db
  --version                     print version and exit
37c03db
""" % sys.argv[0]
37c03db
  sys.exit(exit_code)
37c03db
  
37c03db
def print_version():
37c03db
  print "%s version %s" % (
37c03db
    os.path.basename(sys.argv[0]), version)
37c03db
  sys.exit(0)
37c03db
37c03db
root_folder = ""
37c03db
terminal = "xterm -e %s"
37c03db
default_folder_icon = "folder"
37c03db
default_entry_icon = "-"
37c03db
entire_menu = False
37c03db
with_theme_paths = False
37c03db
icon_size = 16
37c03db
37c03db
exec_clean1_re = re.compile(r'%[a-zA-Z]')
37c03db
exec_clean2_re = re.compile(r'%%')
37c03db
encoding = None
37c03db
locale_str = None
37c03db
37c03db
def find_icon(entry):
37c03db
  icon = entry.getIcon()
37c03db
  if icon and with_theme_paths:
37c03db
    icon = xdg.IconTheme.getIconPath(icon, icon_size) or icon
37c03db
  return icon
37c03db
37c03db
def process_menu(menu):
37c03db
  for entry in menu.getEntries():
37c03db
    if isinstance(entry, xdg.Menu.Menu):
37c03db
      name = entry.getName() or entry.DesktopFileID
37c03db
      icon = find_icon(entry) or default_folder_icon
37c03db
37c03db
      if entire_menu:
37c03db
        print ("menu \"%s\" \"%s\" {" % (name, icon)).encode(encoding)
37c03db
        process_menu(entry)
37c03db
        print "}".encode(encoding)
37c03db
      else:
37c03db
        print (("menuprog \"%s\" \"%s\" %s" % (name, icon, sys.argv[0])) +
37c03db
            (" --root-folder \"%s\"" % entry.getPath(org=True)) +
37c03db
            (" --terminal \"%s\"" % terminal) +
37c03db
            (" --default-folder-icon \"%s\"" % default_folder_icon) +
37c03db
            (" --default-entry-icon \"%s\"" % default_entry_icon) +
37c03db
            (" --theme \"%s\"" % xdg.Config.icon_theme) +
37c03db
            (" --icon-size \"%d\"" % icon_size) +
37c03db
            (with_theme_paths and " --with-theme-paths" or "")).encode(encoding),
37c03db
        if locale_str:
37c03db
          print (" --locale \"%s\"" % locale_str).encode(encoding),
37c03db
        print
37c03db
    elif isinstance(entry, xdg.Menu.MenuEntry):
37c03db
      de = entry.DesktopEntry
37c03db
      name = de.getName() or entry.DesktopFileID
37c03db
      icon = find_icon(de) or default_entry_icon
37c03db
      execute = exec_clean2_re.sub('%', exec_clean1_re.sub('', de.getExec()))
37c03db
      if de.getTerminal(): execute = terminal % execute      
37c03db
      print ("prog \"%s\" \"%s\" %s" % (name, icon, execute)).encode(encoding)
37c03db
37c03db
try: opts, args = getopt.getopt(sys.argv[1:], "", 
37c03db
  ("help", "version", "locale=",
37c03db
   "root-folder=", "terminal=", "default-folder-icon=", 
37c03db
   "default-entry-icon=", "entire-menu", "theme=", "with-theme-paths",
37c03db
   "icon-size="))
37c03db
except getopt.GetoptError: print_usage()
37c03db
37c03db
locale.setlocale(locale.LC_ALL, "")
37c03db
37c03db
for o, v in opts:
37c03db
  if o == "--locale":
37c03db
    locale_str = v
37c03db
    locale.setlocale(locale.LC_ALL, locale_str)
37c03db
  if o == "--root-folder": root_folder = v
37c03db
  elif o == "--terminal": terminal = v
37c03db
  elif o == "--default-folder-icon": default_folder_icon = v
37c03db
  elif o == "--default-entry-icon": default_entry_icon = v
37c03db
  elif o == "--entire-menu" : entire_menu = True
37c03db
  elif o == "--with-theme-paths" : with_theme_paths = True
37c03db
  elif o == "--icon-size": icon_size = int(v)
37c03db
  elif o == "--theme" : xdg.Config.setIconTheme(v)
37c03db
  elif o in ("-h", "-?", "--help"): print_usage(0)
37c03db
  elif o in ("-v", "--version"): print_version()
37c03db
37c03db
encoding = locale.getlocale()[1] or 'UTF-8'
37c03db
menu = xdg.Menu.parse()
37c03db
if root_folder: menu = menu.getMenu(root_folder)
37c03db
process_menu(menu)