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