home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import xdg.Menu as xdg
- import sys
- import os
- import pickle
- import glob
- from Util import *
- from gettext import gettext as _
-
- class CoreApplicationMenu(object):
- '''This class provides basic menu handling that is required to
- initialize the app-install cache'''
- debug = 0
-
- def __init__(self, datadir):
- self.menudir = datadir + '/desktop'
- self.desktopEntriesSeen = set()
- self.pkg_to_app = { }
- self.pickle = { }
- self.popcon_max = 10
-
-
- def createMenuCache(self, targetdir, fname = 'menu.p'):
- self.desktopEntriesSeen.clear()
- self.pkg_to_app.clear()
- for mpath in glob.glob(os.path.join(self.menudir, '*.menu')):
- menu = xdg.Menu.parse(mpath)
- self._populateFromEntry(menu)
-
- pickle.dump(self.pickle, open('%s/%s' % (targetdir, fname), 'w'), 2)
-
-
- def _populateFromEntry(self, node, parent = None, progress = None):
- for entry in node.getEntries(hidden = True):
- self._dbg(2, 'entry: %s' % entry)
- if isinstance(entry, xdg.Menu.Menu):
- name = xmlescape(entry.getName())
- self._dbg(1, 'we have a sub-menu %s ' % name)
- item = Category(self, name, entry.getIcon())
- self.pickle[item] = []
- self._populateFromEntry(entry, item, progress = progress)
- continue
- if isinstance(entry, xdg.Menu.MenuEntry):
- self._dbg(3, node.getPath() + '/\t' + entry.DesktopFileID + '\t' + entry.DesktopEntry.getFileName())
- name = xmlescape(entry.DesktopEntry.getName())
- self._dbg(1, 'we have a application %s (%s) ' % (name, entry.DesktopFileID))
- if name and entry.DesktopEntry.hasKey('X-AppInstall-Package'):
- self._dbg(2, 'parent is %s' % parent.name)
- if entry.DesktopFileID in self.desktopEntriesSeen:
- continue
-
- self.desktopEntriesSeen.add(entry.DesktopFileID)
- item = Application(name)
- item.desktop_entry = entry.DesktopEntry
- pkgname = entry.DesktopEntry.get('X-AppInstall-Package')
- item.pkgname = pkgname
- item.component = entry.DesktopEntry.get('X-AppInstall-Section')
- supported = entry.DesktopEntry.get('X-AppInstall-Supported')
- if supported != '':
- item.supported = bool(supported)
- elif item.component == 'main' or item.component == 'restricted':
- item.supported = True
-
- if item.component == 'main' or item.component == 'universe':
- item.free = True
- else:
- item.free = False
- item.channel = entry.DesktopEntry.get('X-AppInstall-Channel')
- item.isv = entry.DesktopEntry.get('X-AppInstall-ISV')
- thirdparty = entry.DesktopEntry.get('X-AppInstall-Proprietary')
- if thirdparty != '':
- item.thirdparty = bool(thirdparty)
- item.licenseUri = entry.DesktopEntry.get('X-AppInstall-LicenseUri')
-
- archs = entry.DesktopEntry.get('X-AppInstall-Architectures', list = True)
- if archs:
- item.architectures.extend(archs)
-
- replaces = entry.DesktopEntry.get('X-AppInstall-Replaces', list = True)
- if replaces:
- item.replaces = replaces
-
- if not entry.DesktopEntry.get('X-AppInstall-Icon', '') and entry.DesktopEntry.getIcon():
- pass
- item.iconname = 'applications-other'
- if item.iconname.endswith('.png') and item.iconname.endswith('.xpm') or item.iconname.endswith('.svg'):
- item.iconname = item.iconname[:-4]
-
- item.comment = entry.DesktopEntry.getComment()
- item.mime = entry.DesktopEntry.get('MimeType', list = True)
- item.codecs = entry.DesktopEntry.get('X-AppInstall-Codecs').split(';')
- item.patentBadness = entry.DesktopEntry.get('X-AppInstall-PatentBadness', type = 'boolean')
- item.onTop = entry.DesktopEntry.get('X-AppInstall-AlwaysOnTop', type = 'boolean')
- popcon_str = entry.DesktopEntry.get('X-AppInstall-Popcon')
- if popcon_str != '':
- popcon = int(popcon_str)
- item.popcon = popcon
- if popcon > self.popcon_max:
- self.popcon_max = popcon
-
-
- item.execCmd = entry.DesktopEntry.getExec()
- item.needsTerminal = entry.DesktopEntry.getTerminal()
- if 'Settings' not in entry.DesktopEntry.getCategories():
- item.menupath = [
- _('Applications'),
- parent.name]
- else:
- item.menupath = None
- self.pickle[parent].append(item)
- elif name:
-
- try:
- print 'Skipped %s: not associated with a package' % entry
- except UnicodeEncodeError:
- pass
- except:
- None<EXCEPTION MATCH>UnicodeEncodeError
-
-
- None<EXCEPTION MATCH>UnicodeEncodeError
-
- try:
- print 'Skipped %s: does not include a menu name' % entry
- except UnicodeEncodeError:
- pass
- except:
- None<EXCEPTION MATCH>UnicodeEncodeError
-
-
- None<EXCEPTION MATCH>UnicodeEncodeError
- if isinstance(entry, xdg.Menu.Header):
- print 'got header'
- continue
-
-
-
- def _dbg(self, level, msg):
- '''Write debugging output to sys.stderr.'''
- if level <= self.debug:
- print >>sys.stderr, msg
-
-
-
-
- class MenuItem(object):
- ''' base class for a object in the menu '''
-
- def __init__(self, name, iconname = 'applications-other'):
- self.name = name
- self.iconname = iconname
- self.icontheme = None
-
-
- def __repr__(self):
- return 'MenuItem: %s' % self.name
-
-
-
- class Category(MenuItem):
- ''' represents a category '''
-
- def __init__(self, parent, name, iconname = 'applications-other'):
- MenuItem.__init__(self, name, iconname)
-
-
-
- class Application(MenuItem):
- ''' this class represents a application '''
-
- def __init__(self, name, iconname = 'applications-other'):
- MenuItem.__init__(self, name, iconname)
- self.pkgname = None
- self.comment = ''
- self.mime = None
- self.execCmd = None
- self.needsTerminal = False
- self.component = None
- self.channel = None
- self.isv = None
- self.popcon = 1
- self.rank = 1
- self.onTop = False
- self.free = False
- self.licenseUri = None
- self.supported = False
- self.thirdparty = False
- self.architectures = []
- self.menupath = ''
- self.toInstall = None
-
-
-