~jconti/recent-notifications/trunk

« back to all changes in this revision

Viewing changes to recent_notifications/Icon.py

  • Committer: Jason Conti
  • Date: 2012-03-25 16:36:54 UTC
  • Revision ID: jason.conti@gmail.com-20120325163654-29rf2epy5wdywi5w
* Check mtime on icons loaded from a file to determine if they need to be
  reloaded.
* Fix a bug with clear_icon_cache deleting the wrong object. Oops.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
import gc
10
10
import gtk
11
11
import logging
 
12
import os
12
13
 
13
14
icon_cache = {}
14
15
logger = logging.getLogger("Icon")
16
17
def clear_icon_cache():
17
18
  """Clear the icon cache, garbage collecting all the icons."""
18
19
  global icon_cache
19
 
  for key, icon in icon_cache:
 
20
  for icon in icon_cache.values():
20
21
    del icon
21
22
  icon_cache = {}
22
23
  gc.collect()
24
25
def load_icon(name, size = 48):
25
26
  """Loads an icon from the default icon theme."""
26
27
  global icon_cache
27
 
  if (name, size) in icon_cache:
28
 
    return icon_cache[(name, size)]
 
28
  if (name, size, 0) in icon_cache:
 
29
    return icon_cache[(name, size, 0)]
29
30
  else:
30
31
    try:
31
32
      theme = gtk.icon_theme_get_default()
32
33
      icon = theme.load_icon(name, size, gtk.ICON_LOOKUP_FORCE_SVG)
33
 
      icon_cache[(name, size)] = icon
 
34
      icon_cache[(name, size, 0)] = icon
34
35
      return icon
35
36
    except:
36
 
      logger.exception("failed to load_icon")
 
37
      logger.exception("failed to load_icon {0}".format(name))
37
38
      return None
38
39
 
39
40
def load_icon_from_file(path, size = 48):
40
41
  """Loads an icon from the given path."""
41
42
  global icon_cache
42
 
  if (path, size) in icon_cache:
43
 
    return icon_cache[(path, size)]
 
43
 
 
44
  try:
 
45
    mtime = os.path.getmtime(path)
 
46
  except:
 
47
    logger.exception("failed to get mtime for {0}".format(path))
 
48
    return None
 
49
 
 
50
  if (path, size, mtime) in icon_cache:
 
51
    logger.debug("loading {0} from cache (mtime = {1})".format(path, mtime))
 
52
    return icon_cache[(path, size, mtime)]
44
53
  else:
 
54
    logger.debug("cache miss on {0} (mtime = {1})".format(path, mtime))
45
55
    try:
46
56
      icon = gtk.gdk.pixbuf_new_from_file_at_size(path, size, size)
47
 
      icon_cache[(path, size)] = icon
 
57
      icon_cache[(path, size, mtime)] = icon
48
58
      return icon
49
59
    except:
50
 
      logger.exception("failed to load_icon_from_file")
 
60
      logger.exception("failed to load_icon_from_file for {0}".format(path))
51
61
      return None
52
62