Icon: handle image loading errors

If the icon can't be found, fall back on showing a generic icon.

Useful when activity/content bundles specify a bad icon, which is
unfortunately true for most content bundles in current existance
(because the icon field was previously unused).
master
Daniel Drake 11 years ago committed by Daniel Narvaez
parent f46ac7ba6a
commit 670fc44b1a

@ -130,19 +130,19 @@ class _IconBuffer(object):
return attach_x, attach_y return attach_x, attach_y
def _get_icon_info(self): def _get_icon_info(self, file_name, icon_name):
icon_info = _IconInfo() icon_info = _IconInfo()
if self.file_name: if file_name:
icon_info.file_name = self.file_name icon_info.file_name = file_name
elif self.icon_name: elif icon_name:
theme = Gtk.IconTheme.get_default() theme = Gtk.IconTheme.get_default()
size = 50 size = 50
if self.width is not None: if self.width is not None:
size = self.width size = self.width
info = theme.lookup_icon(self.icon_name, int(size), 0) info = theme.lookup_icon(icon_name, int(size), 0)
if info: if info:
attach_x, attach_y = self._get_attach_points(info, size) attach_x, attach_y = self._get_attach_points(info, size)
@ -153,7 +153,7 @@ class _IconBuffer(object):
del info del info
else: else:
logging.warning('No icon with the name %s was found in the ' logging.warning('No icon with the name %s was found in the '
'theme.', self.icon_name) 'theme.', icon_name)
return icon_info return icon_info
@ -250,21 +250,40 @@ class _IconBuffer(object):
if cache_key in self._surface_cache: if cache_key in self._surface_cache:
return self._surface_cache[cache_key] return self._surface_cache[cache_key]
icon_info = self._get_icon_info() # We run two attempts at finding the icon. First, we try the icon
if icon_info.file_name is None: # requested by the user. If that fails, we fall back on
# document-generic. If that doesn't work out, bail.
icon_width = None
for (file_name, icon_name) in ((self.file_name, self.icon_name),
(None, 'document-generic')):
icon_info = self._get_icon_info(file_name, icon_name)
if icon_info.file_name is None:
return None
is_svg = icon_info.file_name.endswith('.svg')
if is_svg:
try:
handle = self._load_svg(icon_info.file_name)
icon_width = handle.props.width
icon_height = handle.props.height
break
except IOError:
pass
else:
try:
path = icon_info.file_name
pixbuf = GdkPixbuf.Pixbuf.new_from_file(path)
icon_width = pixbuf.get_width()
icon_height = pixbuf.get_height()
break
except GObject.GError:
pass
if icon_width is None:
# Neither attempt found an icon for us to use
return None return None
is_svg = icon_info.file_name.endswith('.svg')
if is_svg:
handle = self._load_svg(icon_info.file_name)
icon_width = handle.props.width
icon_height = handle.props.height
else:
pixbuf = GdkPixbuf.Pixbuf.new_from_file(icon_info.file_name)
icon_width = pixbuf.get_width()
icon_height = pixbuf.get_height()
badge_info = self._get_badge_info(icon_info, icon_width, icon_height) badge_info = self._get_badge_info(icon_info, icon_width, icon_height)
padding = badge_info.icon_padding padding = badge_info.icon_padding

Loading…
Cancel
Save