Index: xpra/platform/xposix/xdg_helper.py =================================================================== --- xpra/platform/xposix/xdg_helper.py (revision 21875) +++ xpra/platform/xposix/xdg_helper.py (working copy) @@ -11,7 +11,7 @@ import os from xpra.util import envbool -from xpra.os_util import load_binary_file, BytesIOClass, PYTHON3 +from xpra.os_util import load_binary_file, BytesIOClass, OSEnvContext, PYTHON3 from xpra.log import Logger log = Logger("exec", "menu") @@ -207,29 +207,43 @@ def load_xdg_menu_data(): global xdg_menu_data if not xdg_menu_data: + xdg_menu_data = do_load_xdg_menu_data() + return xdg_menu_data + +def do_load_xdg_menu_data(): + try: + from xdg.Menu import parse, Menu, ParsingError + except ImportError: + log("load_xdg_menu_data()", exc_info=True) + log.warn("Warning: no xdg module, cannot use application menu data") + return None + menu = None + if "XDG_MENU_PREFIX" in os.environ: + #try without the menu prefix first: + with OSEnvContext(): + del os.environ["XDG_MENU_PREFIX"] + try: + menu = parse() + except ParsingError: + menu = None + if menu is None: try: - from xdg.Menu import parse, Menu - except ImportError: + menu = parse() + except Exception as e: log("load_xdg_menu_data()", exc_info=True) - log.warn("Warning: no xdg module, cannot use application menu data") - else: - xdg_menu_data = {} + log.error("Error parsing xdg menu data:") + log.error(" %s", e) + log.error(" this is either a bug in python-xdg,") + log.error(" or an invalid system menu configuration") + return None + menu_data = {} + for submenu in menu.getEntries(): + if isinstance(submenu, Menu) and submenu.Visible: + name = submenu.getName() try: - menu = parse() + menu_data[name] = load_xdg_menu(submenu) except Exception as e: log("load_xdg_menu_data()", exc_info=True) - log.error("Error parsing xdg menu data:") + log.error("Error loading submenu '%s':", name) log.error(" %s", e) - log.error(" this is either a bug in python-xdg,") - log.error(" or an invalid system menu configuration") - else: - for submenu in menu.getEntries(): - if isinstance(submenu, Menu) and submenu.Visible: - name = submenu.getName() - try: - xdg_menu_data[name] = load_xdg_menu(submenu) - except Exception as e: - log("load_xdg_menu_data()", exc_info=True) - log.error("Error loading submenu '%s':", name) - log.error(" %s", e) - return xdg_menu_data + return menu_data