about summary refs log tree commit diff stats
BranchCommit messageAuthorAge
bongkeys: st-xterm compatAcid Bong3 years
masterbump version to 6.4Hiltjo Posthuma3 years
musldmenumon fixAcid Bong3 years
 
TagDownloadAuthorAge
6.4dwm-6.4.tar.gz  Hiltjo Posthuma3 years
6.3dwm-6.3.tar.gz  Hiltjo Posthuma4 years
6.2dwm-6.2.tar.gz  Anselm R Garbe7 years
6.1dwm-6.1.tar.gz  Hiltjo Posthuma10 years
6.0dwm-6.0.tar.gz  anselm@garbe.us14 years
5.9dwm-5.9.tar.gz  garbeam@gmail.com14 years
5.8.2dwm-5.8.2.tar.gz  Anselm R Garbe15 years
5.8.1dwm-5.8.1.tar.gz  Anselm R Garbe15 years
5.8dwm-5.8.tar.gz  anselm@garbe.us15 years
5.7.2dwm-5.7.2.tar.gz  Anselm R Garbe16 years
5.7.1dwm-5.7.1.tar.gz  Anselm R Garbe16 years
5.7dwm-5.7.tar.gz  Anselm R Garbe16 years
5.6.1dwm-5.6.1.tar.gz  Anselm R Garbe16 years
5.6dwm-5.6.tar.gz  Anselm R Garbe16 years
5.5dwm-5.5.tar.gz  Anselm R Garbe16 years
5.4.1dwm-5.4.1.tar.gz  a@null17 years
5.4dwm-5.4.tar.gz  a@null17 years
5.3.1dwm-5.3.1.tar.gz  Anselm R Garbe17 years
5.3dwm-5.3.tar.gz  Anselm R Garbe17 years
5.2dwm-5.2.tar.gz  Anselm R Garbe17 years
5.1dwm-5.1.tar.gz  Anselm R Garbe17 years
5.0dwm-5.0.tar.gz  Anselm R Garbe17 years
4.9dwm-4.9.tar.gz  Anselm R Garbe17 years
4.8dwm-4.8.tar.gz  Anselm R Garbe17 years
4.7dwm-4.7.tar.gz  Anselm R. Garbe18 years
4.6dwm-4.6.tar.gz  arg@suckless.org18 years
4.5dwm-4.5.tar.gz  Anselm R. Garbe18 years
4.4.1dwm-4.4.1.tar.gz  Anselm R. Garbe18 years
4.4dwm-4.4.tar.gz  Anselm R. Garbe18 years
4.3dwm-4.3.tar.gz  arg@f00b4r18 years
4.2dwm-4.2.tar.gz  Anselm R. Garbe18 years
4.1dwm-4.1.tar.gz  Anselm R. Garbe18 years
4.0dwm-4.0.tar.gz  Anselm R. Garbe18 years
3.9dwm-3.9.tar.gz  Anselm R. Garbe18 years
3.8dwm-3.8.tar.gz  Anselm R. Garbe18 years
3.7dwm-3.7.tar.gz  Anselm R. Garbe18 years
3.6.1dwm-3.6.1.tar.gz  Anselm R. Garbe18 years
3.6dwm-3.6.tar.gz  Anselm R. Garbe18 years
3.5dwm-3.5.tar.gz  Anselm R. Garbe18 years
3.4dwm-3.4.tar.gz  Anselm R. Garbe19 years
3.3dwm-3.3.tar.gz  Anselm R. Garbe19 years
3.2.2dwm-3.2.2.tar.gz  Anselm R. Garbe19 years
3.2.1dwm-3.2.1.tar.gz  Anselm R. Garbe19 years
3.2dwm-3.2.tar.gz  Anselm R. Garbe19 years
3.1dwm-3.1.tar.gz  Anselm R. Garbe19 years
3.0dwm-3.0.tar.gz  Anselm R. Garbe19 years
2.9dwm-2.9.tar.gz  Anselm R. Garbe19 years
2.8dwm-2.8.tar.gz  arg@mig2919 years
2.7dwm-2.7.tar.gz  arg@mig2919 years
2.6dwm-2.6.tar.gz  arg@mig2919 years
2.5.1dwm-2.5.1.tar.gz  arg@mig2919 years
2.5dwm-2.5.tar.gz  arg@mig2919 years
2.4dwm-2.4.tar.gz  arg@mig2919 years
2.3dwm-2.3.tar.gz  arg@mig2919 years
2.2dwm-2.2.tar.gz  arg@mig2919 years
2.1dwm-2.1.tar.gz  arg@mig2919 years
2.0dwm-2.0.tar.gz  arg@mig2919 years
1.9dwm-1.9.tar.gz  Anselm R. Garbe19 years
1.8dwm-1.8.tar.gz  Anselm R. Garbe19 years
1.7.1dwm-1.7.1.tar.gz  Anselm R. Garbe19 years
1.7dwm-1.7.tar.gz  arg@mmvi19 years
1.6dwm-1.6.tar.gz  arg@mmvi19 years
1.5dwm-1.5.tar.gz  Anselm R. Garbe19 years
1.4dwm-1.4.tar.gz  Anselm R. Garbe19 years
1.3dwm-1.3.tar.gz  Anselm R. Garbe19 years
1.2dwm-1.2.tar.gz  Anselm R. Garbe19 years
1.1dwm-1.1.tar.gz  Anselm R. Garbe19 years
1.0dwm-1.0.tar.gz  Anselm R. Garbe19 years
0.9dwm-0.9.tar.gz  Anselm R.Garbe19 years
0.8dwm-0.8.tar.gz  Anselm R.Garbe19 years
0.7dwm-0.7.tar.gz  arg@10ksloc.org19 years
0.6dwm-0.6.tar.gz  arg@10ksloc.org19 years
0.5dwm-0.5.tar.gz  arg@10ksloc.org19 years
0.4dwm-0.4.tar.gz  arg@10ksloc.org19 years
0.3dwm-0.3.tar.gz  arg@10ksloc.org19 years
0.2dwm-0.2.tar.gz  Anselm R. Garbe19 years
0.1dwm-0.1.tar.gz  Anselm R. Garbe19 years
span>self): return iter(self.dct.items()) def __getitem__(self, key): """Get the bookmark associated with the key""" if key == '`': key = "'" if key in self.dct: value = self.dct[key] if self._validate(value): return value else: raise KeyError("Cannot open bookmark: `%s'!" % key) else: raise KeyError("Nonexistent Bookmark: `%s'!" % key) def __setitem__(self, key, value): """Bookmark <value> to the key <key>. key is expected to be a 1-character string and element of ALLOWED_KEYS. value is expected to be a filesystemobject. """ if key == '`': key = "'" if key in ALLOWED_KEYS: self.dct[key] = value if self.autosave: self.save() def __contains__(self, key): """Test whether a bookmark-key is defined""" return key in self.dct def update_path(self, path_old, file_new): """Update bookmarks containing path""" self.update_if_outdated() changed = False for key, bfile in self: if bfile.path == path_old: self.dct[key] = file_new changed = True elif bfile.path.startswith(path_old + os.path.sep): self.dct[key] = self.bookmarktype(file_new.path + bfile.path[len(path_old):]) changed = True if changed: self.save() def update(self): """Update the bookmarks from the bookmark file. Useful if two instances are running which define different bookmarks. """ real_dict = self._load_dict() if real_dict is None: return real_dict_copy = real_dict.copy() for key in set(self.dct) | set(real_dict): # set some variables if key in self.dct: current = self.dct[key] else: current = None if key in self.original_dict: original = self.original_dict[key] else: original = None if key in real_dict: real = real_dict[key] else: real = None # determine if there have been changes if current == original and current != real: continue # another ranger instance has changed the bookmark if key not in self.dct: del real_dict[key] # the user has deleted it else: real_dict[key] = current # the user has changed it self._set_dict(real_dict, original=real_dict_copy) def save(self): """Save the bookmarks to the bookmarkfile. This is done automatically after every modification if autosave is True. """ self.update() if self.path is None: return path_new = self.path + '.new' try: with open(path_new, 'w', encoding="utf-8") as fobj: for key, value in self.dct.items(): if key in ALLOWED_KEYS \ and key not in self.nonpersistent_bookmarks: key_value = "{0}:{1}\n".format(key, value) if not PY3 and isinstance(key_value, str): key_value = key_value.decode("utf-8") fobj.write(key_value) except OSError as ex: self.fm.notify('Bookmarks error: {0}'.format(str(ex)), bad=True) return try: old_perms = os.stat(self.path) os.chown(path_new, old_perms.st_uid, old_perms.st_gid) os.chmod(path_new, old_perms.st_mode) if os.path.islink(self.path): target_path = os.path.realpath(self.path) os.rename(path_new, target_path) else: os.rename(path_new, self.path) except OSError as ex: self.fm.notify('Bookmarks error: {0}'.format(str(ex)), bad=True) return self._update_mtime() def enable_saving_backtick_bookmark(self, boolean): """ Adds or removes the ' from the list of nonpersitent bookmarks """ if boolean: if "'" in self.nonpersistent_bookmarks: self.nonpersistent_bookmarks.remove("'") # enable else: self.nonpersistent_bookmarks.add("'") # disable def _load_dict(self): if self.path is None: return {} if not os.path.exists(self.path): try: with open(self.path, 'w', encoding="utf-8") as fobj: pass except OSError as ex: self.fm.notify('Bookmarks error: {0}'.format(str(ex)), bad=True) return None try: with open(self.path, 'r', encoding="utf-8") as fobj: dct = {} for line in fobj: if self.load_pattern.match(line): key, value = line[0], line[2:-1] if key in ALLOWED_KEYS: dct[key] = self.bookmarktype(value) except OSError as ex: self.fm.notify('Bookmarks error: {0}'.format(str(ex)), bad=True) return None return dct def _set_dict(self, dct, original): if original is None: original = {} self.dct.clear() self.dct.update(dct) self.original_dict = original self._update_mtime() def _get_mtime(self): if self.path is None: return None try: return os.stat(self.path).st_mtime except OSError: return None def _update_mtime(self): self.last_mtime = self._get_mtime() def _validate(self, value): # pylint: disable=no-self-use return os.path.isdir(str(value))