Implemented icons caching (fixes memory leak)

This commit is contained in:
Pierre Pronchery 2006-06-19 11:53:15 +00:00
parent 321e0e64b6
commit a09cf5ad5e
3 changed files with 39 additions and 22 deletions

View File

@ -164,7 +164,7 @@ Browser * browser_new(char const * directory)
gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),
GTK_ICON_SIZE_SMALL_TOOLBAR);
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
widget = gtk_label_new("Location: ");
widget = gtk_label_new(" Location: ");
toolitem = gtk_tool_item_new();
gtk_container_add(GTK_CONTAINER(toolitem), widget);
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
@ -204,7 +204,7 @@ Browser * browser_new(char const * directory)
BR_COL_DISPLAY_NAME);
gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(browser->iconview),
BR_COL_PIXBUF);
g_signal_connect(browser->iconview, "item_activated",
g_signal_connect(browser->iconview, "item-activated",
G_CALLBACK(_browser_on_icon_default), browser);
gtk_container_add(GTK_CONTAINER(sw), browser->iconview);
gtk_widget_grab_focus(browser->iconview);
@ -278,12 +278,9 @@ static void _fill_store(Browser * browser)
{
gchar * path, * display_name;
char const * type;
char buf[256];
char * p;
gboolean is_dir;
GdkPixbuf * icon;
strcpy(buf, "gnome-mime-");
if(name[0] == '.') /* FIXME optional */
continue;
path = g_build_filename(browser->current->data, name, NULL);
@ -296,22 +293,9 @@ static void _fill_store(Browser * browser)
&& (type = mime_type(browser->mime, name))
!= NULL)
{
strncpy(&buf[11], type, sizeof(buf)-11);
for(; (p = strchr(&buf[11], '/')) != NULL; *p = '-');
if((icon = gtk_icon_theme_load_icon(browser->theme,
buf, 48, 0, NULL))
== NULL)
{
if((p = strchr(&buf[11], '-')) != NULL)
{
*p = '\0';
icon = gtk_icon_theme_load_icon(
browser->theme, buf, 48,
0, NULL);
}
if(icon == NULL)
icon = browser->pb_file;
}
if((icon = mime_icon(browser->mime, browser->theme,
type)) == NULL)
icon = browser->pb_file;
}
else
icon = browser->pb_file;

View File

@ -56,7 +56,8 @@ Mime * mime_new(void)
break;
mime->types = p;
p[mime->types_cnt].type = strdup(buf);
p[mime->types_cnt++].glob = strdup(glob);
p[mime->types_cnt].glob = strdup(glob);
p[mime->types_cnt++].icon = NULL;
if(p[mime->types_cnt-1].type == NULL
|| p[mime->types_cnt-1].glob == NULL)
break;
@ -80,6 +81,7 @@ void mime_delete(Mime * mime)
{
free(mime->types[i].type);
free(mime->types[i].glob);
free(mime->types[i].icon);
}
free(mime->types);
free(mime);
@ -96,3 +98,32 @@ char const * mime_type(Mime * mime, char const * path)
break;
return i < mime->types_cnt ? mime->types[i].type : NULL;
}
GdkPixbuf * mime_icon(Mime * mime, GtkIconTheme * theme, char const * type)
{
unsigned int i;
static char buf[256] = "gnome-mime-";
char * p;
for(i = 0; i < mime->types_cnt; i++)
if(strcmp(type, mime->types[i].type) == 0)
break;
if(i == mime->types_cnt)
return NULL;
if(mime->types[i].icon != NULL)
return mime->types[i].icon;
strncpy(&buf[11], type, sizeof(buf)-11);
for(; (p = strchr(&buf[11], '/')) != NULL; *p = '-');
if((mime->types[i].icon = gtk_icon_theme_load_icon(theme, buf, 48, 0,
NULL)) == NULL)
{
if((p = strchr(&buf[11], '-')) != NULL)
{
*p = '\0';
mime->types[i].icon = gtk_icon_theme_load_icon(theme,
buf, 48, 0, NULL);
}
}
return mime->types[i].icon;
}

View File

@ -12,6 +12,7 @@ typedef struct _MimeType
{
char * type;
char * glob;
GdkPixbuf * icon;
} MimeType;
typedef struct _Mime
@ -27,5 +28,6 @@ void mime_delete(Mime * mime);
/* useful */
char const * mime_type(Mime * mime, char const * path);
GdkPixbuf * mime_icon(Mime * mime, GtkIconTheme * theme, char const * type);
#endif /* !BROWSER_MIME_H */