Make builtin icons work in gtk_window_set_icon_name() (#321046, Maxim

2005-11-12  Matthias Clasen  <mclasen@redhat.com>

	Make builtin icons work in gtk_window_set_icon_name()
	(#321046, Maxim Udushlivy)

	* gtk/gtkicontheme.c (insert_theme): Always insert the default
	theme.
	(ensure_valid_themes): Call _gtk_icon_theme_ensure_builtin_cache()
	from here.
	(theme_lookup_icon, find_builtin_icon): ...and not from here.
	(gtk_icon_theme_lookup_icon): Remove an unncessary assert.
	(gtk_icon_theme_get_icon_sizes): Also check builtin icons.
This commit is contained in:
Matthias Clasen 2005-11-12 06:59:49 +00:00 committed by Matthias Clasen
parent de28325959
commit 82f12b610d
3 changed files with 101 additions and 71 deletions

View File

@ -1,3 +1,16 @@
2005-11-12 Matthias Clasen <mclasen@redhat.com>
Make builtin icons work in gtk_window_set_icon_name()
(#321046, Maxim Udushlivy)
* gtk/gtkicontheme.c (insert_theme): Always insert the default
theme.
(ensure_valid_themes): Call _gtk_icon_theme_ensure_builtin_cache()
from here.
(theme_lookup_icon, find_builtin_icon): ...and not from here.
(gtk_icon_theme_lookup_icon): Remove an unncessary assert.
(gtk_icon_theme_get_icon_sizes): Also check builtin icons.
2005-11-12 Tor Lillqvist <tml@novell.com>
* gtk/gtkfilesystemwin32.c (filename_get_info): Don't hide

View File

@ -1,3 +1,16 @@
2005-11-12 Matthias Clasen <mclasen@redhat.com>
Make builtin icons work in gtk_window_set_icon_name()
(#321046, Maxim Udushlivy)
* gtk/gtkicontheme.c (insert_theme): Always insert the default
theme.
(ensure_valid_themes): Call _gtk_icon_theme_ensure_builtin_cache()
from here.
(theme_lookup_icon, find_builtin_icon): ...and not from here.
(gtk_icon_theme_lookup_icon): Remove an unncessary assert.
(gtk_icon_theme_get_icon_sizes): Also check builtin icons.
2005-11-12 Tor Lillqvist <tml@novell.com>
* gtk/gtkfilesystemwin32.c (filename_get_info): Don't hide

View File

@ -937,31 +937,25 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name)
g_free (path);
}
if (theme_file || strcmp (theme_name, DEFAULT_THEME_NAME) == 0)
{
theme = g_new0 (IconTheme, 1);
theme->name = g_strdup (theme_name);
priv->themes = g_list_prepend (priv->themes, theme);
}
if (theme_file == NULL)
return;
theme = g_new (IconTheme, 1);
theme->display_name =
g_key_file_get_locale_string (theme_file, "Icon Theme", "Name", NULL, NULL);
if (!theme->display_name)
{
g_warning ("Theme file for %s has no name\n", theme_name);
g_free (theme);
g_key_file_free (theme_file);
return;
}
g_warning ("Theme file for %s has no name\n", theme_name);
dirs = g_key_file_get_string_list (theme_file, "Icon Theme", "Directories", NULL, NULL);
if (!dirs)
{
g_warning ("Theme file for %s has no directories\n", theme_name);
g_free (theme->display_name);
g_free (theme);
g_key_file_free (theme_file);
return;
}
g_warning ("Theme file for %s has no directories\n", theme_name);
theme->name = g_strdup (theme_name);
theme->comment =
g_key_file_get_locale_string (theme_file,
"Icon Theme", "Comment",
@ -979,9 +973,6 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name)
theme->dirs = g_list_reverse (theme->dirs);
/* Prepend the finished theme */
priv->themes = g_list_prepend (priv->themes, theme);
themes = g_key_file_get_string_list (theme_file,
"Icon Theme",
"Inherits",
@ -1128,12 +1119,48 @@ load_themes (GtkIconTheme *icon_theme)
priv->last_stat_time = tv.tv_sec;
}
static void
_gtk_icon_theme_ensure_builtin_cache (void)
{
static gboolean initialized = FALSE;
IconThemeDir *dir;
gint sizes[5] = { 16, 20, 24, 32, 48 };
gint n_sizes = G_N_ELEMENTS (sizes);
gint i;
if (!initialized)
{
initialized = TRUE;
_builtin_cache = _gtk_icon_cache_new ((gchar *)builtin_icons);
for (i = 0; i < n_sizes; i++)
{
dir = g_new (IconThemeDir, 1);
dir->type = ICON_THEME_DIR_THRESHOLD;
dir->context = 0;
dir->size = sizes[i];
dir->min_size = sizes[i];
dir->max_size = sizes[i];
dir->threshold = 2;
dir->dir = NULL;
dir->icon_data = NULL;
dir->subdir = g_strdup_printf ("%d", sizes[i]);
dir->cache = _gtk_icon_cache_ref (_builtin_cache);
builtin_dirs = g_list_append (builtin_dirs, dir);
}
}
}
static void
ensure_valid_themes (GtkIconTheme *icon_theme)
{
GtkIconThemePrivate *priv = icon_theme->priv;
GTimeVal tv;
_gtk_icon_theme_ensure_builtin_cache ();
if (priv->themes_valid)
{
g_get_current_time (&tv);
@ -1196,7 +1223,6 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
UnthemedIcon *unthemed_icon;
gboolean allow_svg;
gboolean use_builtin;
gboolean found_default;
g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
g_return_val_if_fail (icon_name != NULL, NULL);
@ -1218,24 +1244,15 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
ensure_valid_themes (icon_theme);
found_default = FALSE;
l = priv->themes;
while (l != NULL)
for (l = priv->themes; l; l = l->next)
{
IconTheme *theme = l->data;
if (strcmp (theme->name, DEFAULT_THEME_NAME) == 0)
found_default = TRUE;
icon_info = theme_lookup_icon (theme, icon_name, size, allow_svg, use_builtin);
if (icon_info)
goto out;
l = l->next;
}
g_assert (found_default);
unthemed_icon = g_hash_table_lookup (priv->unthemed_icons, icon_name);
if (unthemed_icon)
{
@ -1450,11 +1467,10 @@ gint *
gtk_icon_theme_get_icon_sizes (GtkIconTheme *icon_theme,
const char *icon_name)
{
GList *l, *d;
GList *l, *d, *icons;
GHashTable *sizes;
gint *result, *r;
guint suffix;
guint suffix;
GtkIconThemePrivate *priv;
g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
@ -1483,6 +1499,32 @@ gtk_icon_theme_get_icon_sizes (GtkIconTheme *icon_theme,
}
}
for (d = builtin_dirs; d; d = d->next)
{
IconThemeDir *dir = d->data;
suffix = theme_dir_get_icon_suffix (dir, icon_name, NULL);
if (suffix != ICON_SUFFIX_NONE)
{
if (suffix == ICON_SUFFIX_SVG)
g_hash_table_insert (sizes, GINT_TO_POINTER (-1), NULL);
else
g_hash_table_insert (sizes, GINT_TO_POINTER (dir->size), NULL);
}
}
if (icon_theme_builtin_icons)
{
icons = g_hash_table_lookup (icon_theme_builtin_icons, icon_name);
for ( ; icons; icons = icons->next);
{
BuiltinIcon *icon = icons->data;
g_hash_table_insert (sizes, GINT_TO_POINTER (icon->size), NULL);
}
}
r = result = g_new0 (gint, g_hash_table_size (sizes) + 1);
g_hash_table_foreach (sizes, add_size, &r);
@ -1811,40 +1853,6 @@ theme_dir_get_icon_suffix (IconThemeDir *dir,
return suffix;
}
static void
_gtk_icon_theme_ensure_builtin_cache (void)
{
static gboolean initialized = FALSE;
IconThemeDir *dir;
gint sizes[5] = { 16, 20, 24, 32, 48 };
gint n_sizes = G_N_ELEMENTS (sizes);
gint i;
if (!initialized)
{
initialized = TRUE;
_builtin_cache = _gtk_icon_cache_new ((gchar *)builtin_icons);
for (i = 0; i < n_sizes; i++)
{
dir = g_new (IconThemeDir, 1);
dir->type = ICON_THEME_DIR_THRESHOLD;
dir->context = 0;
dir->size = sizes[i];
dir->min_size = sizes[i];
dir->max_size = sizes[i];
dir->threshold = 2;
dir->dir = NULL;
dir->icon_data = NULL;
dir->subdir = g_strdup_printf ("%d", sizes[i]);
dir->cache = _gtk_icon_cache_ref (_builtin_cache);
builtin_dirs = g_list_append (builtin_dirs, dir);
}
}
}
static GtkIconInfo *
theme_lookup_icon (IconTheme *theme,
const char *icon_name,
@ -1867,8 +1875,6 @@ theme_lookup_icon (IconTheme *theme,
/* Builtin icons are logically part of the default theme and
* are searched before other subdirectories of the default theme.
*/
_gtk_icon_theme_ensure_builtin_cache ();
if (strcmp (theme->name, DEFAULT_THEME_NAME) == 0 && use_builtin)
{
closest_builtin = find_builtin_icon (icon_name,
@ -2945,8 +2951,6 @@ find_builtin_icon (const gchar *icon_name,
gboolean has_larger = FALSE;
BuiltinIcon *min_icon = NULL;
_gtk_icon_factory_ensure_default_icons ();
if (!icon_theme_builtin_icons)
return NULL;