def __create_model(self, all = False, comment = False): model = self.get_model() model.clear() allitems = [] allitems.extend(self.useritems) allitems.extend(self.systemitems) for item in allitems: try: desktopentry = DesktopEntry(item) except: continue if desktopentry.get("Hidden"): if not all: continue iter = model.append() enable = desktopentry.get("X-GNOME-Autostart-enabled") if enable == "false": enable = False else: enable = True iconname = desktopentry.get('Icon', locale = False) if not iconname: iconname = desktopentry.get('Name', locale = False) if not iconname: iconname = desktopentry.getName() icon = get_icon_with_name(iconname, 32) try: name = desktopentry.getName() except: name = desktopentry.get('Name', locale=False) if comment: comment = desktopentry.getComment() if not comment: comment = _("No description") description = "<b>%s</b>\n%s" % (name, comment) else: description = "<b>%s</b>" % name model.set(iter, COLUMN_ACTIVE, enable, COLUMN_ICON, icon, COLUMN_PROGRAM, description, COLUMN_PATH, item)
def init(self, info, progress): """ If needed, perform long initialisation tasks here. info is a dictionary with useful information. Currently it contains the following values: "values": a dict mapping index mnemonics to index numbers The progress indicator can be used to report progress. """ # Read the value indexes we will use values = info["values"] self.val_popcon = values.get("app-popcon", -1) self.indexers = [Indexer(lang, self.val_popcon, progress) for lang in [None] + list(self.langs)] self.entries = {} progress.begin("Reading .desktop files from %s" % APPINSTALLDIR) for f in os.listdir(APPINSTALLDIR): if f[0] == "." or not f.endswith(".desktop"): continue entry = DesktopEntry(os.path.join(APPINSTALLDIR, f)) pkg = entry.get("X-AppInstall-Package") self.entries.setdefault(pkg, []).append((f, entry)) progress.end()
def parse_xdg(self, path): de = DesktopEntry(path) # type: popup, notify msg_type = de.get('X-CLIP-Msg-Type') # mode: info, warning, error msg_mode = de.get('X-CLIP-Msg-Mode') # content: user message msg_cont = de.get('X-CLIP-Msg-Content') cache = {'type': msg_type, 'mode': msg_mode, 'cont': msg_cont} if self.cache != cache: self.cache = cache if len(msg_mode) > 0 and len(msg_type) > 0 and len(msg_cont) > 0: if msg_type == 'popup': self.popup(de.getName(), msg_cont, msg_mode) elif msg_type == 'notify': self.notify(de.getName(), msg_cont, msg_mode)
def init(self, info, progress): """ If needed, perform long initialisation tasks here. info is a dictionary with useful information. Currently it contains the following values: "values": a dict mapping index mnemonics to index numbers The progress indicator can be used to report progress. """ # Read the value indexes we will use values = info['values'] self.val_popcon = values.get("app-popcon", -1) self.indexers = [Indexer(lang, self.val_popcon, progress) for lang in [None] + list(self.langs)] self.entries = {} progress.begin("Reading .desktop files from %s" % APPINSTALLDIR) for f in os.listdir(APPINSTALLDIR): if f[0] == '.' or not f.endswith(".desktop"): continue entry = DesktopEntry(os.path.join(APPINSTALLDIR, f)) pkg = entry.get("X-AppInstall-Package") self.entries.setdefault(pkg, []).append((f, entry)) progress.end()
def __create_model(self, all=False, comment=False): model = self.get_model() model.clear() allitems = [] allitems.extend(self.useritems) allitems.extend(self.systemitems) for item in allitems: try: desktopentry = DesktopEntry(item) except: continue if desktopentry.get("Hidden"): if not all: continue iter = model.append() enable = desktopentry.get("X-GNOME-Autostart-enabled") if enable == "false": enable = False else: enable = True iconname = desktopentry.get('Icon', locale=False) if not iconname: iconname = desktopentry.get('Name', locale=False) if not iconname: iconname = desktopentry.getName() pixbuf = icon.get_from_name(iconname, size=32) try: name = desktopentry.getName() except: name = desktopentry.get('Name', locale=False) if comment: comment = desktopentry.getComment() if not comment: comment = _("No description") description = "<b>%s</b>\n%s" % (name, comment) else: description = "<b>%s</b>" % name model.set(iter, COLUMN_ACTIVE, enable, COLUMN_ICON, pixbuf, COLUMN_PROGRAM, description, COLUMN_PATH, item)
class VeraCCModule: """ An object representing a Vera Control Center module. """ def __init__(self, module_name, module_path): """ Initialize the object """ self.module_is_external = False self.module_name = module_name self.module_path = module_path self.launcher_icon = None self.launcher_name = None self.launcher_comment = None self.launcher_section = None self.module_launcher = DesktopEntry( os.path.join(self.module_path, "%s.desktop" % self.module_name)) # Icon self.launcher_icon = self.module_launcher.getIcon() if not self.launcher_icon: self.launcher_icon = "preferences-system" #ICON_THEME.connect("changed", lambda x: self.replace_icon(icon)) # Name self.launcher_name = self.module_launcher.getName() # Comment self.launcher_comment = self.module_launcher.getComment() # Section self.launcher_section = self.module_launcher.get("X-VeraCC-Section") # Keywords self.launcher_keywords = [ x.lower() for x in self.module_launcher.getKeywords() ] # External? _exec = self.module_launcher.getExec() if _exec: # Yeah! self.module_is_external = True self.module_path = _exec
class VeraCCModule: """ An object representing a Vera Control Center module. """ def __init__(self, module_name, module_path): """ Initialize the object """ self.module_is_external = False self.module_name = module_name self.module_path = module_path self.launcher_icon = None self.launcher_name = None self.launcher_comment = None self.launcher_section = None self.module_launcher = DesktopEntry(os.path.join(self.module_path, "%s.desktop" % self.module_name)) # Icon self.launcher_icon = self.module_launcher.getIcon() if not self.launcher_icon: self.launcher_icon = "preferences-system" #ICON_THEME.connect("changed", lambda x: self.replace_icon(icon)) # Name self.launcher_name = self.module_launcher.getName() # Comment self.launcher_comment = self.module_launcher.getComment() # Section self.launcher_section = self.module_launcher.get("X-VeraCC-Section") # Keywords self.launcher_keywords = [x.lower() for x in self.module_launcher.getKeywords()] # External? _exec = self.module_launcher.getExec() if _exec: # Yeah! self.module_is_external = True self.module_path = _exec
class Autostart(gobject.GObject): __gsignals__ = { 'changed' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_BOOLEAN,)), } def __init__(self): gobject.GObject.__init__(self) self.config = Config.Config(tgcm.country_support) # Determine the path for XDG autostart dirs self.autofile_name = 'tgcm-%s.desktop' % tgcm.country_support self.user_autodir = None for foo in BaseDirectory.load_config_paths('autostart'): if foo.startswith(os.path.expanduser('~')): self.user_autodir = foo else: self.system_autodir = foo self.__create_desktop_entry_if_necessary() # Listen to file changes myfile = gio.File(self.user_autofile) self.desktopentry_monitor = myfile.monitor_file() self.desktopentry_monitor.connect('changed', self.on_desktopentry_changed) def __create_desktop_entry_if_necessary(self): # Create user autostart dir if it does not exists if self.user_autodir is None: self.user_autodir = BaseDirectory.save_config_path('autostart') # It it does not exists an autostart file for TGCM in userdir, # create a copy from the global one self.user_autofile = os.path.join(self.user_autodir, self.autofile_name) if not os.path.exists(self.user_autofile): autofile_path = os.path.join(self.system_autodir, self.autofile_name) shutil.copy(autofile_path, self.user_autofile) # Honor 'launch-startup' policy in regional-info.xml file self.desktopentry = DesktopEntry(self.user_autofile) is_autostart = self.config.check_policy('launch-startup') self.set_enabled(is_autostart) else: self.desktopentry = DesktopEntry(self.user_autofile) def is_enabled(self): self.__create_desktop_entry_if_necessary() # Check if the DesktopEntry object has an autostart attribute if self.desktopentry.hasKey('X-GNOME-Autostart-enabled'): is_autostart = self.desktopentry.get('X-GNOME-Autostart-enabled', \ type='boolean') else: is_autostart = True if self.desktopentry.hasKey('Hidden'): is_shown = not self.desktopentry.get('Hidden', type='boolean') else: is_shown = True return is_shown and is_autostart def set_enabled(self, value): self.__create_desktop_entry_if_necessary() value = str(value).lower() self.desktopentry.set('X-GNOME-Autostart-enabled', value) self.desktopentry.removeKey('Hidden') self.desktopentry.write() def on_desktopentry_changed(self, monitor, myfile, other_file, event): if event == gio.FILE_MONITOR_EVENT_DELETED: self.__create_desktop_entry_if_necessary() is_enabled = self.is_enabled() self.emit('changed', is_enabled)
class Autostart(gobject.GObject): __gsignals__ = { 'changed': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_BOOLEAN, )), } def __init__(self): gobject.GObject.__init__(self) self.config = Config.Config(tgcm.country_support) # Determine the path for XDG autostart dirs self.autofile_name = 'tgcm-%s.desktop' % tgcm.country_support self.user_autodir = None for foo in BaseDirectory.load_config_paths('autostart'): if foo.startswith(os.path.expanduser('~')): self.user_autodir = foo else: self.system_autodir = foo self.__create_desktop_entry_if_necessary() # Listen to file changes myfile = gio.File(self.user_autofile) self.desktopentry_monitor = myfile.monitor_file() self.desktopentry_monitor.connect('changed', self.on_desktopentry_changed) def __create_desktop_entry_if_necessary(self): # Create user autostart dir if it does not exists if self.user_autodir is None: self.user_autodir = BaseDirectory.save_config_path('autostart') # It it does not exists an autostart file for TGCM in userdir, # create a copy from the global one self.user_autofile = os.path.join(self.user_autodir, self.autofile_name) if not os.path.exists(self.user_autofile): autofile_path = os.path.join(self.system_autodir, self.autofile_name) shutil.copy(autofile_path, self.user_autofile) # Honor 'launch-startup' policy in regional-info.xml file self.desktopentry = DesktopEntry(self.user_autofile) is_autostart = self.config.check_policy('launch-startup') self.set_enabled(is_autostart) else: self.desktopentry = DesktopEntry(self.user_autofile) def is_enabled(self): self.__create_desktop_entry_if_necessary() # Check if the DesktopEntry object has an autostart attribute if self.desktopentry.hasKey('X-GNOME-Autostart-enabled'): is_autostart = self.desktopentry.get('X-GNOME-Autostart-enabled', \ type='boolean') else: is_autostart = True if self.desktopentry.hasKey('Hidden'): is_shown = not self.desktopentry.get('Hidden', type='boolean') else: is_shown = True return is_shown and is_autostart def set_enabled(self, value): self.__create_desktop_entry_if_necessary() value = str(value).lower() self.desktopentry.set('X-GNOME-Autostart-enabled', value) self.desktopentry.removeKey('Hidden') self.desktopentry.write() def on_desktopentry_changed(self, monitor, myfile, other_file, event): if event == gio.FILE_MONITOR_EVENT_DELETED: self.__create_desktop_entry_if_necessary() is_enabled = self.is_enabled() self.emit('changed', is_enabled)
os.path.join(source_dir, translation)) catalog = TranslationCatalog("./po/vera-control-center") # Search for desktop files desktop_files = [] for directory, dirnames, filenames in os.walk("."): for file_ in filenames: if file_.endswith(".desktop"): entry = DesktopEntry(os.path.join(directory, file_)) for key in ("Name", "Comment", "Keywords"): try: source = entry.get(key) except: continue for lang, obj in TranslationCatalog.languages.items(): found = obj.find(source) if found and found.msgstr != "": # xdg's IniFile supports the locale= keyword, # but it supports only a boolean value. The locale # is hardcoded to the one of the current system. # We workaround this by specifying the right key # right now. entry.set("%s[%s]" % (key, lang), found.msgstr) entry.write()
class Mapping(object): """ An object representation of a wiican mapping. A wiican mapping must be located in a single directory containing a file with the wminput code, a file containing the metadata (name, description, author, version) and an optional icon file. """ # Mandatory filename for the metadata file info_filename = "info.desktop" # Mandatory filename for the wminput config file mapping_filename = "mapping.wminput" def __init__(self, path=None): """ Builds a mapping object. Parameters: path - scans the path for building a mapping object if the needed files where found. If None it builds an empty mapping. If some of the needed files wasn't found it tries to build a mapping with the found info. The Mapping.info_filename and Mapping.mapping_filename class attributes marks the requiered filenames for the metadata file and wminput config file respectively. The Mapping.mapping_filename file must contain wminput config file code The Mapping.info_filename follows XDG DesktopEntry syntax. The Mapping.info_filename contains the source of the optional associated icon. If no icon found or no icon directive it falls back to default icon. There are three posibilities for icon setting: - An absolute path where the icon it's stored - Icon filename if it's stored in the same dir as Mapping.info_filename - Theme-icon-name for auto-getting the icon from the icon theme """ self.__path = path # Getting freedesktop definition file self.__info = DesktopEntry() if path and os.path.exists(os.path.join(path, Mapping.info_filename)): self.__info.parse(os.path.join(path, Mapping.info_filename)) else: self.__info.new(self.info_filename) self.__info.set("Type", "Wiican Mapping") # Getting wminput mapping file if path and os.path.exists(os.path.join(path, Mapping.mapping_filename)): mapping_fp = open(os.path.join(path, Mapping.mapping_filename), "r") self.__mapping = mapping_fp.read() mapping_fp.close() else: self.__mapping = "" # Getting icon file path icon_name = self.__info.getIcon() if path and icon_name in os.listdir(path): # Icon included self.set_icon(os.path.join(path, icon_name)) elif getIconPath(icon_name): # Theme icon self.set_icon(getIconPath(icon_name)) else: # Default icon self.set_icon(ICON_DEFAULT) def get_path(self): """Returns the absolute path where the wiican mapping it's saved. It returns None if the mapping it's not saved yet""" return self.__path def get_name(self): """Gets the name of the mapping""" return self.__info.getName() def set_name(self, name): """Sets the name for the mapping""" self.__info.set("Name", name) self.__info.set("Name", name, locale=True) def get_comment(self): """Gets the descriptional comment""" return self.__info.getComment() def set_comment(self, comment): """Sets the descriptional comment for the mapping""" self.__info.set("Comment", comment) self.__info.set("Comment", comment, locale=True) def get_icon(self): """ Gets the associated icon. If no icon found or no icon directive it falls back to default icon. """ icon_name = self.__info.getIcon() # Icon included if self.__path and icon_name in os.listdir(self.__path): return os.path.join(self.__path, icon_name) # Theme icon elif getIconPath(icon_name): return getIconPath(icon_name) # Default icon else: return ICON_DEFAULT def set_icon(self, icon_path): """ Sets the icon for the mapping. There are three posibilities for icon setting: - An absolute path where the icon it's stored - Icon filename if it's stored in the same dir as Mapping.info_filename - Theme-icon-name for auto-getting the icon from the icon theme """ self.__info.set("Icon", icon_path) def get_authors(self): """Gets the mapping author/s""" return self.__info.get("X-Authors") def set_authors(self, authors): """Sets the author/s for the mapping""" self.__info.set("X-Authors", authors) def get_version(self): """Gets the version of the mapping""" return self.__info.get("X-Version") def set_version(self, version): """Sets the version of the mapping""" self.__info.set("X-Version", version) def get_mapping(self): """Gets the wminput config code""" return self.__mapping def set_mapping(self, mapping): """Sets the wminput config code""" self.__mapping = mapping def write(self, dest_path=None): """ Saves the mapping object by writing the files in the mapping directory. The metadata it's saved in Mapping.info_filename file. The wminput config code it's saved in Mapping.mapping_filename file. The associated icon it's copied to the mapping directory. """ if not dest_path: if not self.__path: raise MappingError, _("No path provided for writing mapping") dest_path = self.__path elif not os.path.exists(dest_path): os.mkdir(dest_path) icon_path = self.get_icon() icon_filename = os.path.basename(icon_path) if not icon_path == os.path.join(dest_path, icon_filename): shutil.copy(icon_path, dest_path) self.set_icon(icon_filename) self.__info.write(os.path.join(dest_path, Mapping.info_filename)) mapping_fp = open(os.path.join(dest_path, Mapping.mapping_filename), "w") mapping_fp.write(self.__mapping) mapping_fp.close() # Clean not useful files for item in [ x for x in os.listdir(dest_path) if not x in [Mapping.info_filename, Mapping.mapping_filename, icon_filename] ]: os.unlink(os.path.join(dest_path, item)) self.__path = dest_path def __repr__(self): return "Mapping <" + self.__info.get("Name", locale=False) + " " + str(self.__info.getVersion()) + ">"
language = translation.replace(".po","") self.languages[language] = polib.pofile(os.path.join(source_dir, translation)) catalog = TranslationCatalog("./po/vera-control-center-module-updates") # Search for desktop files desktop_files = [] for directory, dirnames, filenames in os.walk("."): for file_ in filenames: if file_.endswith(".desktop"): entry = DesktopEntry(os.path.join(directory, file_)) for key in ("Name", "Comment", "Keywords"): try: source = entry.get(key) except: continue for lang, obj in TranslationCatalog.languages.items(): found = obj.find(source) if found and found.msgstr != "": # xdg's IniFile supports the locale= keyword, # but it supports only a boolean value. The locale # is hardcoded to the one of the current system. # We workaround this by specifying the right key # right now. entry.set("%s[%s]" % (key, lang), found.msgstr) entry.write()