|
|
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)
|