This commit is contained in:
Kovid Goyal
2024-07-29 14:44:30 +05:30
parent 8b8e752ece
commit 10d62a9596

View File

@@ -31,35 +31,35 @@ class XDGIconCache:
def __init__(self) -> None: def __init__(self) -> None:
self.existing_icon_names: set[str] = set() self.existing_icon_names: set[str] = set()
self.scanned = False self.scanned = False
self.themes_to_search: set[str] = set()
def find_inherited_themes(self, basedir: str, seen_indexes: set[str]) -> bool: def find_inherited_themes(self, basedir: str, seen_indexes: set[str], themes_to_search: set[str]) -> bool:
if basedir not in seen_indexes: if basedir not in seen_indexes:
seen_indexes.add(basedir) seen_indexes.add(basedir)
with suppress(OSError), open(os.path.join(basedir, 'index.theme')) as f: with suppress(OSError), open(os.path.join(basedir, 'index.theme')) as f:
raw = f.read() raw = f.read()
if m := re.search(r'^Inherits\s*=\s*(.+?)$', raw, re.MULTILINE): if m := re.search(r'^Inherits\s*=\s*(.+?)$', raw, re.MULTILINE):
for x in m.group(1).split(','): for x in m.group(1).split(','):
self.themes_to_search.add(x.strip()) themes_to_search.add(x.strip())
return True return True
return False return False
def scan(self) -> None: def scan(self) -> None:
themes_to_search: set[str] = set()
self.scanned = True self.scanned = True
seen_indexes: set[str] = set() seen_indexes: set[str] = set()
for icdir in icon_dirs(): for icdir in icon_dirs():
if self.find_inherited_themes(os.path.join(icdir, 'default'), seen_indexes): if self.find_inherited_themes(os.path.join(icdir, 'default'), seen_indexes, themes_to_search):
break break
self.themes_to_search.add('hicolor') themes_to_search.add('hicolor')
while True: while True:
before = len(self.themes_to_search) before = len(themes_to_search)
for icdir in icon_dirs(): for icdir in icon_dirs():
for theme in tuple(self.themes_to_search): for theme in tuple(themes_to_search):
self.find_inherited_themes(os.path.join(icdir, theme), seen_indexes) self.find_inherited_themes(os.path.join(icdir, theme), seen_indexes, themes_to_search)
if len(self.themes_to_search) == before: if len(themes_to_search) == before:
break break
for icdir in icon_dirs(): for icdir in icon_dirs():
for theme in self.themes_to_search: for theme in themes_to_search:
self.scan_theme_dir(os.path.join(icdir, theme)) self.scan_theme_dir(os.path.join(icdir, theme))
self.scan_theme_dir('/usr/share/pixmaps') self.scan_theme_dir('/usr/share/pixmaps')