def main(): desktops = [] # init empty list # List of the categories we are interested in categories = ['Network' , 'Office', 'System', 'Development', 'Game', 'AudioVideo', 'Graphics', 'Settings'] categories.sort() path = '/usr/share/applications/' files = os.listdir(path) # Init our config object for file in files: if fnmatch(file, '*.desktop'): entry = DesktopEntry(os.path.join(path, file)) desktops.append(entry) for category in categories: print('my' + category + ' = { ') for entry in desktops: if category in entry.getCategories(): if getIconPath(entry.getIcon()) and not (fnmatch(getIconPath(entry.getIcon()), '*.ico') or fnmatch(getIconPath(entry.getIcon()), '*.svg')): # awesome fails with ico/svg print(' { "' + entry.getName() + '", "' + entry.getExec() + '", "' + getIconPath(entry.getIcon()) + '" },') else: print(' { "' + entry.getName() + '", "' + entry.getExec() + '" },') print('}\n') print('myprogmenu {') for category in categories: print(' { "' + category + '", my' + category + ' },') print('}\n') return 0
def parse_menu (menu, fvwm_menu = None): ''' parse menu file ''' prefix = "+" if fvwm_menu == None: print '' print 'DestroyMenu "%s"' % menu print 'AddToMenu "%s"' % menu else: print 'DestroyMenu recreate %s' % fvwm_menu prefix = "AddToMenu %s" % fvwm_menu for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): icon = entry.getIcon() print u'%s "%s%%menu/folder.png%%" Popup "%s"' % (prefix, entry.getName(), entry) elif isinstance(entry, xdg.Menu.MenuEntry): desktop = DesktopEntry(entry.DesktopEntry.getFileName()) icon = desktop.getIcon() ind = icon.rfind('.') if ind != -1: icon = icon[0:ind] cmd = desktop.getExec().rstrip('%FUfu') cache_icon(icon) print u'%s "%s%%menu/%s.png%%" Exec exec %s' % (prefix, desktop.getName(), os.path.basename(icon), cmd) else: pass for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): parse_menu(entry)
def parse_menu(menu, fvwm_menu=None): """ parse menu file """ prefix = "+" if fvwm_menu == None: print "" print 'DestroyMenu "%s"' % menu print 'AddToMenu "%s"' % menu else: print "DestroyMenu recreate %s" % fvwm_menu prefix = "AddToMenu %s" % fvwm_menu for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): icon = entry.getIcon() print u'%s "%s%%menu/folder.png%%" Popup "%s"' % (prefix, entry.getName(), entry) elif isinstance(entry, xdg.Menu.MenuEntry): desktop = DesktopEntry(entry.DesktopEntry.getFileName()) icon = desktop.getIcon() ind = icon.rfind(".") if ind != -1: icon = icon[0:ind] cmd = desktop.getExec().rstrip("%FUfu") cache_icon(icon) print u'%s "%s%%menu/%s.png%%" Exec exec %s' % (prefix, desktop.getName(), os.path.basename(icon), cmd) else: pass for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): parse_menu(entry)
def checkfiles(self, path): if os.path.isdir(path): ls = os.listdir(path) for file in ls: self.checkfiles(os.path.join(path, file)) else: entry = DesktopEntry() try: entry.parse(path) except ParsingError, e: print "Parsing error: " + str(e) return category = entry.getCategories() if (len(category) < 2) or (category[0] <> self.category1) or (category[1] <> self.category2): return entry.name = entry.getName() entry.default_status = "" entry.after_animate_click = self.after_animate_click #debug("xdesktop file found: " + entry.name) #debug("category: " + str(entry.getCategories())) self.found_files.append(entry)
def checkfiles(path): if os.path.isdir(path): ls = os.listdir(path) for file in ls: checkfiles(os.path.join(path, file)) else: try: entry = DesktopEntry(path) except ParsingError, e: print e return entry.getName() try: entry.validate() except ValidationError, e: print e
def parse_qlaunch(): ''' parse recently opened files ''' for f in sorted(glob("%s/ydesk/qlaunch/*.desktop" % xdg_data_home)): if f.endswith(".desktop"): desktop = DesktopEntry(f) icon = desktop.getIcon() cache_icon(icon) cmd = desktop.getExec().rstrip('%FUfu') print('+ "%s%%%s.png%%" Exec exec %s' % (desktop.getName(), os.path.basename(icon), cmd))
def parsemenu(menu, name=""): if not name: name = menu.getPath() # print 'DestroyMenu "%s"' % name printtext('AddToMenu "%s"' % name) for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): printmenu(entry.getName(), entry.getIcon(), 'Popup "%s"' % entry.getPath()) elif isinstance(entry, xdg.Menu.MenuEntry): desktop = DesktopEntry(entry.DesktopEntry.getFileName()) printmenu(desktop.getName(), desktop.getIcon(), options.exec_command + " " + desktop.getExec()) else: printtext('# not supported: ' + str(entry)) print for entry in menu.getEntries(): if isinstance(entry, xdg.Menu.Menu): parsemenu(entry)
class MenuEntry: "Wrapper for 'Menu Style' Desktop Entries" def __init__(self, filename, dir="", prefix=""): # Create entry self.DesktopEntry = DesktopEntry(os.path.join(dir, filename)) self.setAttributes(filename, dir, prefix) # Can be one of Deleted/Hidden/Empty/NotShowIn/NoExec or True self.Show = True # Semi-Private self.Original = None self.Parents = [] # Private Stuff self.Allocated = False self.Add = False self.MatchedInclude = False # Caching self.Categories = self.DesktopEntry.getCategories() def save(self): if self.DesktopEntry.tainted == True: self.DesktopEntry.write() def getDir(self): return self.DesktopEntry.filename.replace(self.Filename, '') def getType(self): # Can be one of System/User/Both if xdg.Config.root_mode == False: if self.Original: return "Both" elif xdg_data_dirs[0] in self.DesktopEntry.filename: return "User" else: return "System" else: return "User" def setAttributes(self, filename, dir="", prefix=""): self.Filename = filename self.Prefix = prefix self.DesktopFileID = os.path.join(prefix, filename).replace("/", "-") if not os.path.isabs(self.DesktopEntry.filename): self.__setFilename() def updateAttributes(self): if self.getType() == "System": self.Original = MenuEntry(self.Filename, self.getDir(), self.Prefix) self.__setFilename() def __setFilename(self): if xdg.Config.root_mode == False: path = xdg_data_dirs[0] else: path = xdg_data_dirs[1] if self.DesktopEntry.getType() == "Application": dir = os.path.join(path, "applications") else: dir = os.path.join(path, "desktop-directories") self.DesktopEntry.filename = os.path.join(dir, self.Filename) def __cmp__(self, other): return locale.strcoll(self.DesktopEntry.getName(), other.DesktopEntry.getName()) def __eq__(self, other): if self.DesktopFileID == str(other): return True else: return False def __repr__(self): return self.DesktopFileID
def getservices(): # get list of desktop files from kde command = "grep -l kcmshell4 /usr/share/kde4/services/*.desktop" files = subprocess.getoutput(command).splitlines() # get list of desktop files from big command = "ls -d -1 " + os.getcwd() + "/includes/*.desktop" files += subprocess.getoutput(command).splitlines() # get current theme command = "kreadconfig --group 'Icons' --key 'Theme'" theme = subprocess.getoutput(command) # output output = {} # Map categories category_types = { "X-KDE-settings-accessibility": _("DESKTOP"), "X-KDE-settings-components": _("DESKTOP"), "X-KDE-settings-desktop": _("DESKTOP"), "X-KDE-settings-looknfeel": _("LOOK AND FEEL"), "X-KDE-settings-network": _("NETWORK AND CONNECTIVITY"), "X-KDE-settings-webbrowsing": _("NETWORK AND CONNECTIVITY"), "X-KDE-settings-peripherals": _("HARDWARE"), "X-KDE-settings-hardware": _("HARDWARE"), "X-KDE-settings-power": _("SYSTEM"), "X-KDE-settings-security": _("SECURITY"), "X-KDE-settings-sound": _("HARDWARE"), "X-KDE-settings-system": _("SYSTEM"), "X-KDE-settings-bluetooth": _("NETWORK AND CONNECTIVITY"), "X-KDE-settings-system-administration": _("SYSTEM"), "X-KDE-settings-user_manager": _("SYSTEM"), "X-KDE-information": _("INFORMATIONS OF SYSTEM") } # extra configurations apps_remove = open(os.getcwd() + "/conf/remove.conf").read().splitlines() apps_category = open(os.getcwd() + "/conf/category.conf").read().splitlines() # get informations from files for file in files: entry = DesktopEntry() # parse file try: entry.parse(file) except: continue # data from file name = entry.getName() comment = entry.getComment() icon = str(getIconPath(entry.getIcon(), theme=theme, size=32)) filename = os.path.splitext(os.path.basename(file))[0] category = None # fix error on get icon path if icon == "None": icon = str(getIconPath("preferences-system", theme=theme, size=32)) # get all categories from file file_categories = entry.getCategories() # use last category for elem in file_categories: category = elem # big applications if "/usr/share/kde4" not in file: execute = entry.getExec() category = _(category.upper()) # kde applications else: # remove applications if filename in apps_remove: continue execute = "kcmshell4 " + str(filename) # get category from file try: if category is None: raise Exception() category = category_types[category] except: category = _("OTHERS CONFIGURATIONS") # check recategorize regex = re.compile(filename + "=*") for line in apps_category: if regex.search(line): category = _(line.split("=")[1].upper()) # convert to upper category = category.upper() # fill array service if category not in output: output[category] = [] output[category].append({ "execute": execute, "comment": comment, "icon": icon, "name": name }) output = OrderedDict(sorted(output.items())) return output
class MenuEntry: "Wrapper for 'Menu Style' Desktop Entries" def __init__(self, filename, dir="", prefix=""): # Create entry self.DesktopEntry = DesktopEntry(os.path.join(dir,filename)) self.setAttributes(filename, dir, prefix) # Can be one of Deleted/Hidden/Empty/NotShowIn/NoExec or True self.Show = True # Semi-Private self.Original = None self.Parents = [] # Private Stuff self.Allocated = False self.Add = False self.MatchedInclude = False # Caching self.Categories = self.DesktopEntry.getCategories() def save(self): if self.DesktopEntry.tainted == True: self.DesktopEntry.write() def getDir(self): return self.DesktopEntry.filename.replace(self.Filename, '') def getType(self): """Return the type of MenuEntry, System/User/Both""" if xdg.Config.root_mode == False: if self.Original: return "Both" elif xdg_data_dirs[0] in self.DesktopEntry.filename: return "User" else: return "System" else: return "User" def setAttributes(self, filename, dir="", prefix=""): self.Filename = filename self.Prefix = prefix self.DesktopFileID = os.path.join(prefix,filename).replace("/", "-") if not os.path.isabs(self.DesktopEntry.filename): self.__setFilename() def updateAttributes(self): if self.getType() == "System": self.Original = MenuEntry(self.Filename, self.getDir(), self.Prefix) self.__setFilename() def __setFilename(self): if xdg.Config.root_mode == False: path = xdg_data_dirs[0] else: path= xdg_data_dirs[1] if self.DesktopEntry.getType() == "Application": dir = os.path.join(path, "applications") else: dir = os.path.join(path, "desktop-directories") self.DesktopEntry.filename = os.path.join(dir, self.Filename) def __cmp__(self, other): return locale.strcoll(self.DesktopEntry.getName(), other.DesktopEntry.getName()) def _key(self): """Key function for locale-aware sorting.""" return _strxfrm(self.DesktopEntry.getName()) def __lt__(self, other): try: other = other._key() except AttributeError: pass return self._key() < other def __eq__(self, other): if self.DesktopFileID == str(other): return True else: return False def __repr__(self): return self.DesktopFileID
def getservices(): # get list of desktop files from kde command = "grep -l kcmshell4 /usr/share/kde4/services/*.desktop" files = subprocess.getoutput(command).splitlines() # get list of desktop files from big command = "ls -d -1 " + os.getcwd() + "/includes/*.desktop" files += subprocess.getoutput(command).splitlines() # get current theme command = "kreadconfig --group 'Icons' --key 'Theme'" theme = subprocess.getoutput(command) # output output = {} # Map categories category_types = { "X-KDE-settings-accessibility": _("DESKTOP"), "X-KDE-settings-components": _("DESKTOP"), "X-KDE-settings-desktop": _("DESKTOP"), "X-KDE-settings-looknfeel": _("LOOK AND FEEL"), "X-KDE-settings-network": _("NETWORK AND CONNECTIVITY"), "X-KDE-settings-webbrowsing": _("NETWORK AND CONNECTIVITY"), "X-KDE-settings-peripherals": _("HARDWARE"), "X-KDE-settings-hardware": _("HARDWARE"), "X-KDE-settings-power": _("SYSTEM"), "X-KDE-settings-security": _("SECURITY"), "X-KDE-settings-sound": _("HARDWARE"), "X-KDE-settings-system": _("SYSTEM"), "X-KDE-settings-bluetooth": _("NETWORK AND CONNECTIVITY"), "X-KDE-settings-system-administration": _("SYSTEM"), "X-KDE-settings-user_manager": _("SYSTEM"), "X-KDE-information": _("INFORMATIONS OF SYSTEM") } # extra configurations apps_remove = open(os.getcwd() + "/conf/remove.conf").read().splitlines() apps_category = open(os.getcwd() + "/conf/category.conf").read().splitlines() # get informations from files for file in files: entry = DesktopEntry() # parse file try: entry.parse(file) except: continue # data from file name = entry.getName() comment = entry.getComment() icon = str(getIconPath(entry.getIcon(), theme=theme, size=32)) filename = os.path.splitext(os.path.basename(file))[0] category = None # fix error on get icon path if icon == "None": icon = str(getIconPath("preferences-system", theme=theme, size=32)) # get all categories from file file_categories = entry.getCategories() # use last category for elem in file_categories: category = elem # big applications if "/usr/share/kde4" not in file: execute = entry.getExec() category = _(category.upper()) # kde applications else: # remove applications if filename in apps_remove: continue execute = "kcmshell4 " + str(filename) # get category from file try: if category is None: raise Exception() category = category_types[category] except: category = _("OTHERS CONFIGURATIONS") # check recategorize regex=re.compile(filename + "=*") for line in apps_category: if regex.search(line): category = _(line.split("=")[1].upper()) # convert to upper category = category.upper() # fill array service if category not in output: output[category] = [] output[category].append({ "execute": execute, "comment": comment, "icon": icon, "name": name }) output = OrderedDict(sorted(output.items())) return output