Implemented icons caching (fixes memory leak)
This commit is contained in:
parent
321e0e64b6
commit
a09cf5ad5e
|
@ -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,23 +293,10 @@ 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)
|
||||
if((icon = mime_icon(browser->mime, browser->theme,
|
||||
type)) == NULL)
|
||||
icon = browser->pb_file;
|
||||
}
|
||||
}
|
||||
else
|
||||
icon = browser->pb_file;
|
||||
gtk_list_store_set(browser->store, &iter, BR_COL_PATH, path,
|
||||
|
|
33
src/mime.c
33
src/mime.c
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue
Block a user