55 lines
1.6 KiB
Python
55 lines
1.6 KiB
Python
"""
|
|
Library for caching Cairo surfaces for icons by name and size.
|
|
"""
|
|
import os
|
|
import cairo
|
|
import yutani
|
|
|
|
icon_directories = {
|
|
16: [
|
|
"/usr/share/icons/16",
|
|
"/usr/share/icons/external/16",
|
|
"/usr/share/icons/24",
|
|
"/usr/share/icons/external/24",
|
|
"/usr/share/icons/48",
|
|
"/usr/share/icons/external/48",
|
|
"/usr/share/icons",
|
|
"/usr/share/icons/external",
|
|
],
|
|
24: [
|
|
"/usr/share/icons/24",
|
|
"/usr/share/icons/external/24",
|
|
"/usr/share/icons/48",
|
|
"/usr/share/icons/external/48",
|
|
"/usr/share/icons",
|
|
"/usr/share/icons/external",
|
|
],
|
|
48: [
|
|
"/usr/share/icons/48",
|
|
"/usr/share/icons/external/48",
|
|
"/usr/share/icons",
|
|
"/usr/share/icons/external",
|
|
"/usr/share/icons/24",
|
|
"/usr/share/icons/external/24",
|
|
],
|
|
}
|
|
|
|
icon_cache = {24:{},48:{},16:{}}
|
|
def get_icon(name,size=24,fallback='applications-generic'):
|
|
"""Find an icon in the icon cache or fetch it if possible."""
|
|
if not name:
|
|
return get_icon(fallback,size)
|
|
|
|
if not name in icon_cache[size]:
|
|
for directory in icon_directories[size]:
|
|
path = f"{directory}/{name}.bmp"
|
|
if os.access(path,os.R_OK):
|
|
#icon = cairo.ImageSurface.create_from_png(f"{directory}/{name}.png")
|
|
icon = yutani.Sprite.from_file(f"{directory}/{name}.bmp").get_cairo_surface()
|
|
icon_cache[size][name] = icon
|
|
return icon
|
|
return get_icon(fallback,size)
|
|
else:
|
|
return icon_cache[size][name]
|
|
|