def on_drag_data_received(self, widget, context, x, y, selection, target, timestamp, box): droppeduris = selection.get_uris() # url-unquote the list, strip file:// schemes, handle .desktop-s pathlist = [] app = None for uri in droppeduris: scheme, _, path, _, _ = urlsplit(uri) if scheme != "file": pathlist.append(uri) else: filename = url2pathname(path) desktopentry = DesktopEntry() try: desktopentry.parse(filename) except xdg.Exceptions.ParsingError: pathlist.append(filename) continue if desktopentry.getType() == 'Link': pathlist.append(desktopentry.getURL()) if desktopentry.getType() == 'Application': app = desktopentry.getExec() if app and len(droppeduris) == 1: text = app else: text = str.join("", (shell_quote(path) + " " for path in pathlist)) box.terminal.feed_child(text) return True
def __init__(self, stage): self._apps = list() self._rdsk = re.compile(u".*\.desktop$") self._icon_actor_cache = dict() HOME = os.getenv("HOME") l = list() l += self._get_all_desktop_files(u'/usr/share/applications') if HOME: l += self._get_all_desktop_files(os.path.join(HOME, u'.local/share/applications')) for f in l: de = DesktopEntry(f) if de.getType() == u"Application" and not de.getHidden(): self._apps.append(apps_entry(stage, de)) self._apps.sort(key=lambda x: x.name) pass
def __init__(self, stage): self._apps = list() self._rdsk = re.compile(u".*\.desktop$") self._icon_actor_cache = dict() HOME = os.getenv("HOME") l = list() l += self._get_all_desktop_files(u'/usr/share/applications') if HOME: l += self._get_all_desktop_files( os.path.join(HOME, u'.local/share/applications')) for f in l: de = DesktopEntry(f) if de.getType() == u"Application" and not de.getHidden(): self._apps.append(apps_entry(stage, de)) self._apps.sort(key=lambda x: x.name) pass
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
def parse_linux_desktop_entry(fpath): """Load data from desktop entry with xdg specification.""" from xdg.DesktopEntry import DesktopEntry try: entry = DesktopEntry(fpath) entry_data = {} entry_data['name'] = entry.getName() entry_data['icon_path'] = entry.getIcon() entry_data['exec'] = entry.getExec() entry_data['type'] = entry.getType() entry_data['hidden'] = entry.getHidden() entry_data['fpath'] = fpath except Exception: entry_data = { 'name': '', 'icon_path': '', 'hidden': '', 'exec': '', 'type': '', 'fpath': fpath } return entry_data
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): """Save any changes to the desktop entry.""" if self.DesktopEntry.tainted == True: self.DesktopEntry.write() def getDir(self): """Return the directory containing the desktop entry file.""" 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