Implemented icons caching (fixes memory leak)
This commit is contained in:
parent
321e0e64b6
commit
a09cf5ad5e
|
@ -164,7 +164,7 @@ Browser * browser_new(char const * directory)
|
||||||
gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),
|
gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar),
|
||||||
GTK_ICON_SIZE_SMALL_TOOLBAR);
|
GTK_ICON_SIZE_SMALL_TOOLBAR);
|
||||||
gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS);
|
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();
|
toolitem = gtk_tool_item_new();
|
||||||
gtk_container_add(GTK_CONTAINER(toolitem), widget);
|
gtk_container_add(GTK_CONTAINER(toolitem), widget);
|
||||||
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
|
gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1);
|
||||||
|
@ -204,7 +204,7 @@ Browser * browser_new(char const * directory)
|
||||||
BR_COL_DISPLAY_NAME);
|
BR_COL_DISPLAY_NAME);
|
||||||
gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(browser->iconview),
|
gtk_icon_view_set_pixbuf_column(GTK_ICON_VIEW(browser->iconview),
|
||||||
BR_COL_PIXBUF);
|
BR_COL_PIXBUF);
|
||||||
g_signal_connect(browser->iconview, "item_activated",
|
g_signal_connect(browser->iconview, "item-activated",
|
||||||
G_CALLBACK(_browser_on_icon_default), browser);
|
G_CALLBACK(_browser_on_icon_default), browser);
|
||||||
gtk_container_add(GTK_CONTAINER(sw), browser->iconview);
|
gtk_container_add(GTK_CONTAINER(sw), browser->iconview);
|
||||||
gtk_widget_grab_focus(browser->iconview);
|
gtk_widget_grab_focus(browser->iconview);
|
||||||
|
@ -278,12 +278,9 @@ static void _fill_store(Browser * browser)
|
||||||
{
|
{
|
||||||
gchar * path, * display_name;
|
gchar * path, * display_name;
|
||||||
char const * type;
|
char const * type;
|
||||||
char buf[256];
|
|
||||||
char * p;
|
|
||||||
gboolean is_dir;
|
gboolean is_dir;
|
||||||
GdkPixbuf * icon;
|
GdkPixbuf * icon;
|
||||||
|
|
||||||
strcpy(buf, "gnome-mime-");
|
|
||||||
if(name[0] == '.') /* FIXME optional */
|
if(name[0] == '.') /* FIXME optional */
|
||||||
continue;
|
continue;
|
||||||
path = g_build_filename(browser->current->data, name, NULL);
|
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))
|
&& (type = mime_type(browser->mime, name))
|
||||||
!= NULL)
|
!= NULL)
|
||||||
{
|
{
|
||||||
strncpy(&buf[11], type, sizeof(buf)-11);
|
if((icon = mime_icon(browser->mime, browser->theme,
|
||||||
for(; (p = strchr(&buf[11], '/')) != NULL; *p = '-');
|
type)) == NULL)
|
||||||
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;
|
icon = browser->pb_file;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
else
|
||||||
icon = browser->pb_file;
|
icon = browser->pb_file;
|
||||||
gtk_list_store_set(browser->store, &iter, BR_COL_PATH, path,
|
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;
|
break;
|
||||||
mime->types = p;
|
mime->types = p;
|
||||||
p[mime->types_cnt].type = strdup(buf);
|
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
|
if(p[mime->types_cnt-1].type == NULL
|
||||||
|| p[mime->types_cnt-1].glob == NULL)
|
|| p[mime->types_cnt-1].glob == NULL)
|
||||||
break;
|
break;
|
||||||
|
@ -80,6 +81,7 @@ void mime_delete(Mime * mime)
|
||||||
{
|
{
|
||||||
free(mime->types[i].type);
|
free(mime->types[i].type);
|
||||||
free(mime->types[i].glob);
|
free(mime->types[i].glob);
|
||||||
|
free(mime->types[i].icon);
|
||||||
}
|
}
|
||||||
free(mime->types);
|
free(mime->types);
|
||||||
free(mime);
|
free(mime);
|
||||||
|
@ -96,3 +98,32 @@ char const * mime_type(Mime * mime, char const * path)
|
||||||
break;
|
break;
|
||||||
return i < mime->types_cnt ? mime->types[i].type : NULL;
|
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 * type;
|
||||||
char * glob;
|
char * glob;
|
||||||
|
GdkPixbuf * icon;
|
||||||
} MimeType;
|
} MimeType;
|
||||||
|
|
||||||
typedef struct _Mime
|
typedef struct _Mime
|
||||||
|
@ -27,5 +28,6 @@ void mime_delete(Mime * mime);
|
||||||
|
|
||||||
/* useful */
|
/* useful */
|
||||||
char const * mime_type(Mime * mime, char const * path);
|
char const * mime_type(Mime * mime, char const * path);
|
||||||
|
GdkPixbuf * mime_icon(Mime * mime, GtkIconTheme * theme, char const * type);
|
||||||
|
|
||||||
#endif /* !BROWSER_MIME_H */
|
#endif /* !BROWSER_MIME_H */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user