diff --git a/src/xdgmenumaker b/src/xdgmenumaker index 3dba344..8001d61 100755 --- a/src/xdgmenumaker +++ b/src/xdgmenumaker @@ -19,14 +19,16 @@ pygtkcompat.enable() pygtkcompat.enable_gtk(version='3.0') import gtk -seticon = False -iconsize = 16 -nosvg = False -desktop = False -submenu = True -pekwmdynamic = False -twmtitles = False -max_icon_size = False +xopts = { + 'seticon': False, + 'iconsize': 16, + 'nosvg': False, + 'desktop': False, + 'submenu': True, + 'pekwmdynamic': False, + 'twmtitles': False, + 'max_icon_size': False +} # the following line gets changed by the Makefile. If it is set to # 'not_set' it looks in the currect directory tree for the .directory @@ -154,14 +156,7 @@ if not terminal_app: def main(argv): - global desktop - global seticon - global iconsize - global nosvg - global submenu - global pekwmdynamic - global twmtitles - global max_icon_size + global xopts try: opts, args = getopt.getopt(argv, "hins:f:", ["help", "icons", "no-submenu", @@ -179,19 +174,19 @@ def main(argv): usage() sys.exit(0) elif opt in ("-i", "--icons"): - seticon = True + xopts['seticon'] = True elif opt in ("-s", "--size"): try: - iconsize = int(arg) + xopts['iconsize'] = int(arg) except ValueError: usage() sys.exit('ERROR: size must be a number') elif opt in ("-n", "--no-submenu"): - submenu = False + xopts['submenu'] = False elif opt in ("--pekwm-dynamic",): - pekwmdynamic = True + xopts['pekwmdynamic'] = True elif opt in ("--twm-titles",): - twmtitles = True + xopts['twmtitles'] = True elif opt in ("--max-icon-size",): try: # Pillow is optional and loaded only if we want to restrict the @@ -202,38 +197,38 @@ def main(argv): # slows down when it is actually needed. global Image from PIL import Image - max_icon_size = True + xopts['max_icon_size'] = True except ImportError: usage() sys.exit('ERROR: --max-icon-size requires Pillow') elif opt == "--no-svg": - nosvg = True + xopts['nosvg'] = True elif opt in ("-f", "--format"): - desktop = arg - if not desktop: + xopts['desktop'] = arg + if not xopts['desktop']: usage() sys.exit('ERROR: You must specify the output format with -f') - elif desktop == "blackbox": + elif xopts['desktop'] == "blackbox": blackbox() - elif desktop == "fluxbox": + elif xopts['desktop'] == "fluxbox": fluxbox() - elif desktop == "fvwm": + elif xopts['desktop'] == "fvwm": fvwm() - elif desktop == "windowmaker": - seticon = False + elif xopts['desktop'] == "windowmaker": + xopts['seticon'] = False windowmaker() - elif desktop == "icewm": + elif xopts['desktop'] == "icewm": icewm() - elif desktop == "pekwm": + elif xopts['desktop'] == "pekwm": pekwmmenu() - elif desktop == "jwm": + elif xopts['desktop'] == "jwm": jwm() - elif desktop == "compizboxmenu": + elif xopts['desktop'] == "compizboxmenu": compizboxmenu() - elif desktop == "twm": + elif xopts['desktop'] == "twm": twm() - elif desktop == "amiwm": - seticon = False + elif xopts['desktop'] == "amiwm": + xopts['seticon'] = False amiwm() else: usage() @@ -283,7 +278,7 @@ def icon_max_size(icon): except: # if there is any error reading the icon, just discard it return None - if img.size[0] <= iconsize: + if img.size[0] <= xopts['iconsize']: return icon return None @@ -296,11 +291,11 @@ def icon_full_path(icon): if os.path.exists(icon): if ext == ".svg" or ext == ".svgz": # only jwm and icewm support svg icons - if (desktop == "jwm" or desktop == "icewm") and not nosvg: + if (xopts['desktop'] == "jwm" or xopts['desktop'] == "icewm") and not xopts['nosvg']: return icon else: # icon is not svg - if max_icon_size: + if xopts['max_icon_size']: return icon_max_size(icon) else: return icon @@ -309,17 +304,17 @@ def icon_full_path(icon): icon_theme = gtk.icon_theme_get_default() try: # JWM and IceWM support svg icons - if (desktop == "jwm" or desktop == "icewm") and not nosvg: - icon = icon_theme.lookup_icon(icon, iconsize, gtk.ICON_LOOKUP_FORCE_SVG) + if (xopts['desktop'] == "jwm" or xopts['desktop'] == "icewm") and not xopts['nosvg']: + icon = icon_theme.lookup_icon(icon, xopts['iconsize'], gtk.ICON_LOOKUP_FORCE_SVG) # but none of the other WMs does else: - icon = icon_theme.lookup_icon(icon, iconsize, gtk.ICON_LOOKUP_NO_SVG) + icon = icon_theme.lookup_icon(icon, xopts['iconsize'], gtk.ICON_LOOKUP_NO_SVG) except AttributeError: sys.exit('ERROR: You need to run xdgmenumaker inside an X session.') if icon: icon = icon.get_filename() # icon size only matters for non-SVG icons - if icon and max_icon_size and (ext != ".svg" or ext != ".svgz"): + if icon and xopts['max_icon_size'] and (ext != ".svg" or ext != ".svgz"): icon = icon_max_size(icon) return icon @@ -395,14 +390,14 @@ def get_entry_info(desktopfile, ico_paths=True): # none of the freedesktop registered environments are supported by # OnlyShowIn but it might be worth using some extra logic here. # http://standards.freedesktop.org/menu-spec/latest/apb.html - if (onlyshowin != [] and not (desktop.lower() in (name.lower() for name in onlyshowin))) \ - or (desktop.lower() in (name.lower() for name in notshowin)) \ + if (onlyshowin != [] and not (xopts['desktop'].lower() in (name.lower() for name in onlyshowin))) \ + or (xopts['desktop'].lower() in (name.lower() for name in notshowin)) \ or hidden or nodisplay: return None name = de.getName().encode('utf-8') - if seticon: + if xopts['seticon']: icon = de.getIcon() if ico_paths: icon = icon_full_path(icon) @@ -525,15 +520,15 @@ def category_icon(category): def blackbox(): # Blackbox menus are the same as Fluxbox menus. They just don't support # icons. - global seticon - seticon = False + global xopts + xopts['seticon'] = False fluxbox() def fluxbox(): - if submenu: + if xopts['submenu']: spacing = ' ' - if seticon: + if xopts['seticon']: app_icon = icon_full_path(applications_icon) if app_icon is None: @@ -547,7 +542,7 @@ def fluxbox(): for menu_category in menu(): category = menu_category.category cat_name = category.decode() - if seticon: + if xopts['seticon']: cat_icon = category_icon(category) cat_icon = icon_full_path(cat_icon) if cat_icon: @@ -575,15 +570,15 @@ def fluxbox(): c=command, i=icon)) print('{s}[end] # ({c})'.format(s=spacing, c=cat_name)) - if submenu: + if xopts['submenu']: print('[end] # ({})'.format(apps_name)) def fvwm(): - if submenu: + if xopts['submenu']: print('DestroyMenu "xdgmenu"') print('AddToMenu "xdgmenu"') - if seticon: + if xopts['seticon']: app_icon = icon_full_path(applications_icon) if app_icon: print('+ "{a}%{i}% " Title'.format(a=apps_name, i=app_icon)) @@ -611,7 +606,7 @@ def fvwm(): cat_name = category.decode() print('DestroyMenu "{}"'.format(cat_name)) print('AddToMenu "{c}"'.format(c=cat_name)) - if seticon: + if xopts['seticon']: cat_icon = category_icon(category) cat_icon = icon_full_path(cat_icon) if cat_icon: @@ -651,9 +646,9 @@ def windowmaker(): def icewm(): - if submenu: + if xopts['submenu']: spacing = ' ' - if seticon: + if xopts['seticon']: app_icon = icon_full_path(applications_icon) if app_icon is None: app_icon = "_none_" @@ -667,7 +662,7 @@ def icewm(): cat_name = category.decode() cat_icon = category_icon(category) cat_icon = icon_full_path(cat_icon) - if seticon and cat_icon is not None: + if xopts['seticon'] and cat_icon is not None: print('{s}menu "{c}" {i} {{'.format(s=spacing, c=cat_name, i=cat_icon)) else: @@ -676,26 +671,26 @@ def icewm(): name = app.name.decode() icon = app.icon command = app.command - if seticon and icon is not None: + if xopts['seticon'] and icon is not None: print('{s} prog "{n}" {i} {c}'.format(s=spacing, n=name, i=icon, c=command)) else: print('{s} prog "{n}" _none_ {c}'.format(s=spacing, n=name, c=command)) print('{}}}'.format(spacing)) - if submenu: + if xopts['submenu']: print('}') def pekwmmenu(): - if pekwmdynamic: + if xopts['pekwmdynamic']: print("Dynamic {") dspacing = ' ' else: dspacing = '' - if submenu: + if xopts['submenu']: spacing = ' ' - if seticon: + if xopts['seticon']: app_icon = icon_full_path(applications_icon) print('{s}Submenu = "{a}" {{ Icon = "{i}"'.format(s=dspacing, a=apps_name, @@ -709,7 +704,7 @@ def pekwmmenu(): cat_name = category.decode() cat_icon = category_icon(category) cat_icon = icon_full_path(cat_icon) - if seticon and cat_icon is not None: + if xopts['seticon'] and cat_icon is not None: print('{d}{s}Submenu = "{c}" {{ Icon = "{i}"'.format(d=dspacing, s=spacing, c=cat_name, @@ -731,7 +726,7 @@ def pekwmmenu(): # with "&&" and "||", so we'll launch the command even if the # path does not exist command = 'cd {p} && {c} || {c}'.format(p=path, c=command) - if seticon and icon is not None: + if xopts['seticon'] and icon is not None: print('{d}{s} Entry = "{n}" {{ Icon = "{i}"; Actions = "Exec {c} &" }}' .format(d=dspacing, s=spacing, n=name, i=icon, c=command)) @@ -739,18 +734,18 @@ def pekwmmenu(): print('{d}{s} Entry = "{n}" {{ Actions = "Exec {c} &" }}' .format(d=dspacing, s=spacing, n=name, c=command)) print('{d}{s}}}'.format(d=dspacing, s=spacing)) - if submenu: + if xopts['submenu']: print('{}}}'.format(dspacing)) - if pekwmdynamic: + if xopts['pekwmdynamic']: print("}") def jwm(): print('') print('') - if submenu: + if xopts['submenu']: spacing = ' ' - if seticon: + if xopts['seticon']: app_icon = icon_full_path(applications_icon) if app_icon is None: print(''.format(apps_name)) @@ -766,7 +761,7 @@ def jwm(): cat_name = category.decode() cat_icon = category_icon(category) cat_icon = icon_full_path(cat_icon) - if seticon and cat_icon is not None: + if xopts['seticon'] and cat_icon is not None: print('{s}'.format(s=spacing, i=cat_icon, c=cat_name)) @@ -779,22 +774,22 @@ def jwm(): path = app.path if path is not None: command = 'cd {p} ; {c}'.format(p=path, c=command) - if seticon and icon is not None: + if xopts['seticon'] and icon is not None: print('{s} {c}' .format(s=spacing, i=icon, n=name, c=command)) else: print('{s} {c}' .format(s=spacing, n=name, c=command)) print('{}'.format(spacing)) - if submenu: + if xopts['submenu']: print('') print('') def compizboxmenu(): - if submenu: + if xopts['submenu']: spacing = ' ' - if seticon: + if xopts['seticon']: app_icon = icon_strip(applications_icon) print(''.format(i=app_icon, a=apps_name)) @@ -806,7 +801,7 @@ def compizboxmenu(): category = menu_category.category cat_name = category.decode() cat_icon = category_icon(category) - if seticon and cat_icon is not None: + if xopts['seticon'] and cat_icon is not None: print('{s}'.format( s=spacing, i=cat_icon, c=cat_name)) else: @@ -819,7 +814,7 @@ def compizboxmenu(): if path is not None: path = path.replace("'", "'\\''") command = 'sh -c \'cd "{p}" ;{c}\''.format(p=path, c=command) - if seticon and icon is not None: + if xopts['seticon'] and icon is not None: print(('{s} {n}' '{i}' '{c}').format(s=spacing, @@ -831,14 +826,14 @@ def compizboxmenu(): n=name, c=command)) print('{}'.format(spacing)) - if submenu: + if xopts['submenu']: print('') def twm(): - if submenu: + if xopts['submenu']: print('menu "xdgmenu"') print("{") - if twmtitles: + if xopts['twmtitles']: print(' "{a}" f.title'.format(a=apps_name)) for menu_category in menu(): category = menu_category.category @@ -850,7 +845,7 @@ def twm(): cat_name = category.decode() print('menu "{}"'.format(cat_name)) print("{") - if twmtitles: + if xopts['twmtitles']: print(' "{c}" f.title'.format(c=cat_name)) for app in menu_category.applist: name = app.name.decode()