def parse(desktop_file, debug_enabled): """ Returns a dict if the .desktop entry should be included in the dmenu, or none if not applicable """ application = DesktopEntry(desktop_file) if debug_enabled: eprint('PARSED: ' + desktop_file) if application.getHidden(): if debug_enabled: eprint('HIDDEN: ' + desktop_file) return None if application.getNoDisplay(): if debug_enabled: eprint('NODISPLAY: ' + desktop_file) return None executable = application.getTryExec() if not executable: executable = application.getExec() if not executable: if debug_enabled: eprint('NO EXECUTABLE: ' + desktop_file) return None return { application.getName(): [part for part in executable.split(' ') if not part.startswith('%')] }
def fetchMore(self, parent): # print("RecollQuery.fetchMore:") num_to_fetch = min(self.pagelen, self.totres - len(self.searchResults)) titem = [] for count in range(num_to_fetch): try: item = self.query.fetchone() url = str(item['url'][7:]) if url.endswith("desktop"): desktop = DesktopEntry() try: desktop.parse(url) except (ParsingError, DuplicateGroupError, DuplicateKeyError) as e: print(e) if desktop.getNoDisplay(): continue if len(desktop.getOnlyShowIn()) != 0: continue titem.append(item) except: break self.beginInsertRows(QtCore.QModelIndex(), len(self.searchResults), len(self.searchResults) + len(titem) - 1) self.searchResults.extend(titem) self.endInsertRows()
def _get_app_list(self, directory, user): for root, dirs, files in os.walk(directory): for name in files: if name.endswith(".desktop"): app_path = root + "/" + name # setup desktop entry to access its elements xgd_de = DesktopEntry(app_path) # self.app_entry = Desktop_Entry( name, xgd_de.getName( ), xgd_de.getGenericName( ), xgd_de.getNoDisplay( ), xgd_de.getHidden( ), xgd_de.getOnlyShowIn( ), xgd_de.getNotShowIn( ), xgd_de.getCategories( ), app_path, user, False ) # Just as a note, skip no display or hidden .desktop if not (self.app_entry.de_nodisp or self.app_entry.de_hidden): self._add_entry(self.app_entry)
def provide(self): from fnmatch import fnmatch from xdg.DesktopEntry import DesktopEntry items = [] for app_directory in map(os.path.expanduser, self.app_directories): for root, dirs, files in os.walk(app_directory): for filename in files: if fnmatch(filename, "*.desktop"): app_entry = DesktopEntry(os.path.join(root, filename)) icon_theme = Gtk.IconTheme.get_default() if app_entry.getNoDisplay(): continue if app_entry.getIcon() == "": icon = Gtk.IconTheme.load_icon(icon_theme, "image-missing", self.icon_size, 0) elif "/" in app_entry.getIcon(): try: unscaled_icon = GdkPixbuf.Pixbuf.new_from_file(app_entry.getIcon()) icon = unscaled_icon.scale_simple(self.icon_size, self.icon_size, GdkPixbuf.InterpType.BILINEAR) except: icon = Gtk.IconTheme.load_icon(icon_theme, "image-missing", self.icon_size, 0) else: try: unscaled_icon = Gtk.IconTheme.load_icon(icon_theme, app_entry.getIcon(), self.icon_size, 0) icon = unscaled_icon.scale_simple(self.icon_size, self.icon_size, GdkPixbuf.InterpType.BILINEAR) except: icon = Gtk.IconTheme.load_icon(icon_theme, "image-missing", self.icon_size, 0) words = app_entry.getName().split() # words.append(app_entry.getExec()) command = self.escape_command(app_entry.getExec()) if app_entry.getTerminal(): command = "%s '%s'" % (self.terminal_emulator_command, command) item = { "indexer": self, "name": app_entry.getName(), "description": app_entry.getComment(), "icon": icon, "command": command, "words": words, } items.append(item) items.sort(key=lambda i: i["name"]) return items
def test_values(self): entry = DesktopEntry(self.test_file) self.assertEqual(entry.getName(), 'gedit') self.assertEqual(entry.getGenericName(), 'Text Editor') self.assertEqual(entry.getNoDisplay(), False) self.assertEqual(entry.getComment(), 'Edit text files') self.assertEqual(entry.getIcon(), 'accessories-text-editor') self.assertEqual(entry.getHidden(), False) self.assertEqual(entry.getOnlyShowIn(), []) self.assertEqual(entry.getExec(), 'gedit %U') self.assertEqual(entry.getTerminal(), False) self.assertEqual(entry.getMimeTypes(), ['text/plain']) self.assertEqual(entry.getCategories(), ['GNOME', 'GTK', 'Utility', 'TextEditor']) self.assertEqual(entry.getTerminal(), False)
def test_values(self): entry = DesktopEntry(self.test_file) self.assertEqual(entry.getName(), 'gedit') self.assertEqual(entry.getGenericName(), 'Text Editor') self.assertEqual(entry.getNoDisplay(), False) self.assertEqual(entry.getComment(), 'Edit text files') self.assertEqual(entry.getIcon(), 'accessories-text-editor') self.assertEqual(entry.getHidden(), False) self.assertEqual(entry.getOnlyShowIn(), []) self.assertEqual(entry.getExec(), 'gedit %U') self.assertEqual(entry.getTerminal(), False) self.assertEqual(entry.getMimeTypes(), ['text/plain']) self.assertEqual(entry.getCategories(), ['GNOME', 'GTK', 'Utility', 'TextEditor']) self.assertEqual(entry.getTerminal(), False)
def addDesktopEntry(file): entry=DesktopEntry() try: entry.parse(file) except: return if entry.getNoDisplay(): return tryexec=entry.getTryExec() if tryexec and not os.path.exists(tryexec): return entry.setLocale("C") display_name=entry.getName() catalog.insertEntry(file, display_name, run)
def get_desktop_entries(): starts = ((os.path.expanduser('~'), 'local'), (os.sep, 'usr')) end = ('share', 'applications', '*.desktop') for start in starts: pattern = os.path.join(*(start + end)) for desktop_entry in glob.iglob(pattern): entry = DesktopEntry(desktop_entry) if entry.getNoDisplay(): continue if entry.getOnlyShowIn(): continue if entry.getTerminal(): continue yield entry
def add_desktop(self, filename): try: d = DesktopEntry(filename) if d.getHidden() or d.getNoDisplay() or d.getTerminal( ) or d.getType() != 'Application': return app = Application(name=d.getName(), command_line=get_command(d), mtime=datetime.fromtimestamp( os.path.getmtime(filename)), is_desktop=True) if d.getPath(): app.path = d.getPath() self.add_app(app) except (xdg.Exceptions.ParsingError, xdg.Exceptions.DuplicateGroupError, xdg.Exceptions.DuplicateKeyError): pass
def _generate_app_actions(self, path): app_actions = [] filename_pattern = os.path.expanduser(os.path.join( path, AppsOperator.FILE_TYPE )) for filename in glob.glob(filename_pattern): app = DesktopEntry(filename) # TODO: Comply with full DesktopEntries spec - OnlyShowIn, TryExec if app.getType() == "Application" and not app.getNoDisplay() and \ not app.getHidden() and not app.getTerminal(): action = AppAction( name=app.getName(), description="application", run=self._launch_application, data={"desktop_entry": app, "cmd": self.get_cmd(app)}, icon=get_icon(app.getIcon()), ) app_actions.append(action) return app_actions
#!/usr/bin/env python3 # Author: Juho Teperi from xdg.BaseDirectory import load_data_paths from xdg.DesktopEntry import DesktopEntry from glob import glob from re import sub from os.path import basename # To remove duplicates data = {} for d in load_data_paths("applications"): for app in glob(d + "/*.desktop"): desktop = DesktopEntry(app) name = desktop.getName() if (not desktop.getHidden() and not desktop.getNoDisplay()) and name not in data: data[name] = basename(app) for name, cmd in data.items(): print('{}\t{}'.format(name, cmd))
for dir in SEARCH_DIRS: fnames = glob.glob(dir+'/*/*.desktop') for fname in fnames: de = DesktopEntry(fname) cats = de.getCategories() or ["All"] for cat in cats: if not cat in categories: categories[cat] = [] categories[cat].append(de) for k, v in sorted(categories.items()): catName = k for de in v: if de.getNoDisplay() or de.getHidden(): continue mainGroup = de.defaultGroup printEntry(catName, de, True) for group in de.groups(): if group != mainGroup: de.defaultGroup = group printEntry(catName, de, False) for exc in execs.values(): execFile.write(exc) menuFile.close() execFile.close()
def main(args): args =args[1:] if len(args )!=1: print("takes one argument") return try: desktop =DesktopEntry() desktop.parse(args[0]) except: print("parse error" ,args[0]) name =desktop.getName() name =''.join(lazy_pinyin(name)) AppName=desktop.getName() NoDisplay=False; if len(AppName)==0: AppName=desktop.getGenericName AppComment=desktop.getComment() AppIcon=desktop.getIcon() if not os.path.exists(AppIcon): ip=getIconPath(AppIcon,theme="deepin") # if ip is None: # ip=getIconPath(AppIcon,theme="hicolor") else: ip=AppIcon if ip is None: #TODO add defauult icon ip="test" pass AppIcon=ip NoDisplay=desktop.getNoDisplay() onlydi=desktop.getOnlyShowIn() if NoDisplay is True or len(onlydi)>0: AppIcon="" AppName="" AppComment="" NoDisplay="true" else: NoDisplay="false" print(''' <html><head> <title>''' +name+ '''</title> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" > <meta name="AppName" content="'''+AppName+'''" /> <meta name="AppComment" content="'''+AppComment+'''" /> <meta name="AppIcon" content="'''+AppIcon+'''" /> <meta name="AppNoDisplay" content="'''+NoDisplay+'''" /> </head> <body> '''+AppName+''' </body> </html> ''')
for dir in SEARCH_DIRS: fnames = glob.glob(dir + '/*/*.desktop') for fname in fnames: de = DesktopEntry(fname) cats = de.getCategories() or ["All"] for cat in cats: if not cat in categories: categories[cat] = [] categories[cat].append(de) for k, v in sorted(categories.items()): catName = k for de in v: if de.getNoDisplay() or de.getHidden(): continue mainGroup = de.defaultGroup printEntry(catName, de, True) for group in de.groups(): if group != mainGroup: de.defaultGroup = group printEntry(catName, de, False) for exc in execs.values(): execFile.write(exc) menuFile.close() execFile.close()