=== added directory '.pc/50-xdg-menu-prefix.patch'
=== added directory '.pc/50-xdg-menu-prefix.patch/Alacarte'
=== added file '.pc/50-xdg-menu-prefix.patch/Alacarte/MenuEditor.py'
--- .pc/50-xdg-menu-prefix.patch/Alacarte/MenuEditor.py 1970-01-01 00:00:00 +0000
+++ .pc/50-xdg-menu-prefix.patch/Alacarte/MenuEditor.py 2012-11-08 11:14:24 +0000
@@ -0,0 +1,570 @@
+# -*- coding: utf-8 -*-
+# Alacarte Menu Editor - Simple fd.o Compliant Menu Editor
+# Copyright (C) 2006 Travis Watkins, Heinrich Wendel
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Library General Public
+# License as published by the Free Software Foundation; either
+# version 2 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Library General Public License for more details.
+#
+# You should have received a copy of the GNU Library General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+import os
+import xml.dom.minidom
+import xml.parsers.expat
+from gi.repository import GMenu, GLib
+from Alacarte import util
+
+class MenuEditor(object):
+ def __init__(self, name=os.environ['XDG_MENU_PREFIX'] + 'applications.menu'):
+ self.name = name
+
+ self.tree = GMenu.Tree.new(name, GMenu.TreeFlags.SHOW_EMPTY|GMenu.TreeFlags.INCLUDE_EXCLUDED|GMenu.TreeFlags.INCLUDE_NODISPLAY|GMenu.TreeFlags.SHOW_ALL_SEPARATORS|GMenu.TreeFlags.SORT_DISPLAY_NAME)
+ self.tree.connect('changed', self.menuChanged)
+ self.load()
+
+ self.path = os.path.join(util.getUserMenuPath(), self.tree.props.menu_basename)
+ self.loadDOM()
+
+ def loadDOM(self):
+ try:
+ self.dom = xml.dom.minidom.parse(self.path)
+ except (IOError, xml.parsers.expat.ExpatError), e:
+ self.dom = xml.dom.minidom.parseString(util.getUserMenuXml(self.tree))
+ util.removeWhitespaceNodes(self.dom)
+
+ def load(self):
+ if not self.tree.load_sync():
+ raise ValueError("can not load menu tree %r" % (self.name,))
+
+ def menuChanged(self, *a):
+ self.load()
+
+ def save(self):
+ fd = open(self.path, 'w')
+ fd.write(self.dom.toprettyxml())
+ fd.close()
+
+ def restoreToSystem(self):
+ self.restoreTree(self.tree.get_root_directory())
+ path = os.path.join(util.getUserMenuPath(), os.path.basename(self.tree.get_canonical_menu_path()))
+ try:
+ os.unlink(path)
+ except OSError:
+ pass
+
+ self.loadDOM()
+ self.save()
+
+ def restoreTree(self, menu):
+ item_iter = menu.iter()
+ item_type = item_iter.next()
+ while item_type != GMenu.TreeItemType.INVALID:
+ if item_type == GMenu.TreeItemType.DIRECTORY:
+ item = item_iter.get_directory()
+ self.restoreTree(item)
+ elif item_type == GMenu.TreeItemType.ENTRY:
+ item = item_iter.get_entry()
+ self.restoreItem(item)
+ item_type = item_iter.next()
+ self.restoreMenu(menu)
+
+ def restoreItem(self, item):
+ if not self.canRevert(item):
+ return
+ try:
+ os.remove(item.get_desktop_file_path())
+ except OSError:
+ pass
+ self.save()
+
+ def restoreMenu(self, menu):
+ if not self.canRevert(menu):
+ return
+ #wtf happened here? oh well, just bail
+ if not menu.get_desktop_file_path():
+ return
+ file_id = os.path.split(menu.get_desktop_file_path())[1]
+ path = os.path.join(util.getUserDirectoryPath(), file_id)
+ try:
+ os.remove(path)
+ except OSError:
+ pass
+ self.save()
+
+ def getMenus(self, parent):
+ if parent is None:
+ yield (self.tree.get_root_directory(), True)
+ return
+
+ item_iter = parent.iter()
+ item_type = item_iter.next()
+ while item_type != GMenu.TreeItemType.INVALID:
+ if item_type == GMenu.TreeItemType.DIRECTORY:
+ item = item_iter.get_directory()
+ yield (item, self.isVisible(item))
+ item_type = item_iter.next()
+
+ def getContents(self, item):
+ contents = []
+ item_iter = item.iter()
+ item_type = item_iter.next()
+
+ while item_type != GMenu.TreeItemType.INVALID:
+ item = None
+ if item_type == GMenu.TreeItemType.DIRECTORY:
+ item = item_iter.get_directory()
+ elif item_type == GMenu.TreeItemType.ENTRY:
+ item = item_iter.get_entry()
+ elif item_type == GMenu.TreeItemType.HEADER:
+ item = item_iter.get_header()
+ elif item_type == GMenu.TreeItemType.ALIAS:
+ item = item_iter.get_alias()
+ elif item_type == GMenu.TreeItemType.SEPARATOR:
+ item = item_iter.get_separator()
+ if item:
+ contents.append(item)
+ item_type = item_iter.next()
+ return contents
+
+ def getItems(self, menu):
+ item_iter = menu.iter()
+ item_type = item_iter.next()
+ while item_type != GMenu.TreeItemType.INVALID:
+ item = None
+ if item_type == GMenu.TreeItemType.ENTRY:
+ item = item_iter.get_entry()
+ elif item_type == GMenu.TreeItemType.DIRECTORY:
+ item = item_iter.get_directory()
+ elif item_type == GMenu.TreeItemType.HEADER:
+ item = item_iter.get_header()
+ elif item_type == GMenu.TreeItemType.ALIAS:
+ item = item_iter.get_alias()
+ elif item_type == GMenu.TreeItemType.SEPARATOR:
+ item = item_iter.get_separator()
+ yield (item, self.isVisible(item))
+ item_type = item_iter.next()
+
+ def canRevert(self, item):
+ if isinstance(item, GMenu.TreeEntry):
+ if util.getItemPath(item.get_desktop_file_id()) is not None:
+ path = util.getUserItemPath()
+ if os.path.isfile(os.path.join(path, item.get_desktop_file_id())):
+ return True
+ elif isinstance(item, GMenu.TreeDirectory):
+ if item.get_desktop_file_path():
+ file_id = os.path.split(item.get_desktop_file_path())[1]
+ else:
+ file_id = item.get_menu_id() + '.directory'
+ if util.getDirectoryPath(file_id) is not None:
+ path = util.getUserDirectoryPath()
+ if os.path.isfile(os.path.join(path, file_id)):
+ return True
+ return False
+
+ def setVisible(self, item, visible):
+ dom = self.dom
+ if isinstance(item, GMenu.TreeEntry):
+ menu_xml = self.getXmlMenu(self.getPath(item.get_parent()), dom.documentElement, dom)
+ if visible:
+ self.addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Include')
+ self.writeItem(item, NoDisplay=False)
+ else:
+ self.addXmlFilename(menu_xml, dom, item.get_desktop_file_id(), 'Exclude')
+ self.addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
+ elif isinstance(item, GMenu.TreeDirectory):
+ item_iter = item.iter()
+ first_child_type = item_iter.next()
+ #don't mess with it if it's empty
+ if first_child_type == GMenu.TreeItemType.INVALID:
+ return
+ menu_xml = self.getXmlMenu(self.getPath(item), dom.documentElement, dom)
+ for node in self.getXmlNodesByName(['Deleted', 'NotDeleted'], menu_xml):
+ node.parentNode.removeChild(node)
+ self.writeMenu(item, NoDisplay=not visible)
+ self.addXmlTextElement(menu_xml, 'DirectoryDir', util.getUserDirectoryPath(), dom)
+ self.save()
+
+ def createItem(self, parent, before, after, **kwargs):
+ file_id = self.writeItem(None, **kwargs)
+ self.insertExternalItem(file_id, parent.get_menu_id(), before, after)
+
+ def insertExternalItem(self, file_id, parent_id, before=None, after=None):
+ parent = self.findMenu(parent_id)
+ dom = self.dom
+ self.addItem(parent, file_id, dom)
+ self.positionItem(parent, ('Item', file_id), before, after)
+ self.save()
+
+ def insertExternalMenu(self, file_id, parent_id, before=None, after=None):
+ menu_id = file_id.rsplit('.', 1)[0]
+ parent = self.findMenu(parent_id)
+ dom = self.dom
+ self.addXmlDefaultLayout(self.getXmlMenu(self.getPath(parent), dom.documentElement, dom) , dom)
+ menu_xml = self.getXmlMenu(self.getPath(parent) + [menu_id], dom.documentElement, dom)
+ self.addXmlTextElement(menu_xml, 'Directory', file_id, dom)
+ self.positionItem(parent, ('Menu', menu_id), before, after)
+ self.save()
+
+ def createSeparator(self, parent, before=None, after=None):
+ self.positionItem(parent, ('Separator',), before, after)
+ self.save()
+
+ def editItem(self, item, icon, name, comment, command, use_term, parent=None, final=True):
+ #if nothing changed don't make a user copy
+ app_info = item.get_app_info()
+ if icon == app_info.get_icon() and name == app_info.get_display_name() and comment == item.get_comment() and command == item.get_exec() and use_term == item.get_launch_in_terminal():
+ return
+ #hack, item.get_parent() seems to fail a lot
+ if not parent:
+ parent = item.get_parent()
+ self.writeItem(item, Icon=icon, Name=name, Comment=comment, Exec=command, Terminal=use_term)
+ if final:
+ dom = self.dom
+ menu_xml = self.getXmlMenu(self.getPath(parent), dom.documentElement, dom)
+ self.addXmlTextElement(menu_xml, 'AppDir', util.getUserItemPath(), dom)
+ self.save()
+
+ def editMenu(self, menu, icon, name, comment, final=True):
+ #if nothing changed don't make a user copy
+ if icon == menu.get_icon() and name == menu.get_name() and comment == menu.get_comment():
+ return
+ #we don't use this, we just need to make sure the