st/icon-theme: Use standard GObject macros

The GTK code predates the G_DECLARE_*() macros, so it's under- standable
that it still does all the boilerplate manually. We
don't have that excuse in 2023, so move the the standard macros.

There is no reason for GtkIconTheme to be derivable, and as that
means that the instance struct itself is private, stop adding
separate private instance data.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2620>
This commit is contained in:
Florian Müllner 2023-02-01 16:10:28 +01:00 committed by Marge Bot
parent bdd14e3431
commit d65de0df60
2 changed files with 152 additions and 274 deletions

View File

@ -82,8 +82,10 @@ typedef enum
#define DEBUG_CACHE(args) #define DEBUG_CACHE(args)
#endif #endif
struct _GtkIconThemePrivate struct _GtkIconTheme
{ {
GObject parent_instance;
GHashTable *info_cache; GHashTable *info_cache;
GList *info_cache_lru; GList *info_cache_lru;
@ -267,7 +269,14 @@ static void remove_from_lru_cache (GtkIconTheme *icon_theme,
GtkIconInfo *icon_info); GtkIconInfo *icon_info);
static gboolean icon_info_ensure_scale_and_pixbuf (GtkIconInfo* icon_info); static gboolean icon_info_ensure_scale_and_pixbuf (GtkIconInfo* icon_info);
static guint signal_changed = 0; enum
{
CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0, };
static guint static guint
icon_info_key_hash (gconstpointer _key) icon_info_key_hash (gconstpointer _key)
@ -313,7 +322,7 @@ icon_info_key_equal (gconstpointer _a,
return a->icon_names[i] == NULL && b->icon_names[i] == NULL; return a->icon_names[i] == NULL && b->icon_names[i] == NULL;
} }
G_DEFINE_TYPE_WITH_PRIVATE (GtkIconTheme, gtk_icon_theme, G_TYPE_OBJECT) G_DEFINE_TYPE (GtkIconTheme, gtk_icon_theme, G_TYPE_OBJECT)
/** /**
* gtk_icon_theme_new: * gtk_icon_theme_new:
@ -346,13 +355,13 @@ gtk_icon_theme_class_init (GtkIconThemeClass *klass)
* that a change has occurred in the contents of the current * that a change has occurred in the contents of the current
* icon theme. * icon theme.
*/ */
signal_changed = g_signal_new ("changed", signals[CHANGED] = g_signal_new ("changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GtkIconThemeClass, changed), 0,
NULL, NULL, NULL, NULL,
NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }
@ -362,17 +371,16 @@ update_current_theme (GtkIconTheme *icon_theme)
#define theme_changed(_old, _new) \ #define theme_changed(_old, _new) \
((_old && !_new) || (!_old && _new) || \ ((_old && !_new) || (!_old && _new) || \
(_old && _new && strcmp (_old, _new) != 0)) (_old && _new && strcmp (_old, _new) != 0))
GtkIconThemePrivate *priv = icon_theme->priv;
StSettings *settings = st_settings_get (); StSettings *settings = st_settings_get ();
g_autofree char *theme = NULL; g_autofree char *theme = NULL;
gboolean changed = FALSE; gboolean changed = FALSE;
g_object_get (settings, "gtk-icon-theme", &theme, NULL); g_object_get (settings, "gtk-icon-theme", &theme, NULL);
if (theme_changed (priv->current_theme, theme)) if (theme_changed (icon_theme->current_theme, theme))
{ {
g_free (priv->current_theme); g_free (icon_theme->current_theme);
priv->current_theme = g_steal_pointer (&theme); icon_theme->current_theme = g_steal_pointer (&theme);
changed = TRUE; changed = TRUE;
} }
@ -437,7 +445,7 @@ icon_info_uncached (GtkIconInfo *icon_info)
g_strjoinv (",", icon_info->key.icon_names), g_strjoinv (",", icon_info->key.icon_names),
icon_info->key.size, icon_info->key.flags, icon_info->key.size, icon_info->key.flags,
icon_theme, icon_theme,
icon_theme != NULL ? g_hash_table_size (icon_theme->priv->info_cache) : 0)); icon_theme != NULL ? g_hash_table_size (icon_theme->info_cache) : 0));
icon_info->in_cache = NULL; icon_info->in_cache = NULL;
@ -448,41 +456,37 @@ icon_info_uncached (GtkIconInfo *icon_info)
static void static void
gtk_icon_theme_init (GtkIconTheme *icon_theme) gtk_icon_theme_init (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv;
StSettings *settings; StSettings *settings;
const char * const *xdg_data_dirs; const char * const *xdg_data_dirs;
int i, j; int i, j;
priv = gtk_icon_theme_get_instance_private (icon_theme); icon_theme->info_cache = g_hash_table_new_full (icon_info_key_hash, icon_info_key_equal, NULL,
icon_theme->priv = priv; (GDestroyNotify)icon_info_uncached);
priv->info_cache = g_hash_table_new_full (icon_info_key_hash, icon_info_key_equal, NULL,
(GDestroyNotify)icon_info_uncached);
xdg_data_dirs = g_get_system_data_dirs (); xdg_data_dirs = g_get_system_data_dirs ();
for (i = 0; xdg_data_dirs[i]; i++) ; for (i = 0; xdg_data_dirs[i]; i++) ;
priv->search_path_len = 2 * i + 2; icon_theme->search_path_len = 2 * i + 2;
priv->search_path = g_new (char *, priv->search_path_len); icon_theme->search_path = g_new (char *, icon_theme->search_path_len);
i = 0; i = 0;
priv->search_path[i++] = g_build_filename (g_get_user_data_dir (), "icons", NULL); icon_theme->search_path[i++] = g_build_filename (g_get_user_data_dir (), "icons", NULL);
priv->search_path[i++] = g_build_filename (g_get_home_dir (), ".icons", NULL); icon_theme->search_path[i++] = g_build_filename (g_get_home_dir (), ".icons", NULL);
for (j = 0; xdg_data_dirs[j]; j++) for (j = 0; xdg_data_dirs[j]; j++)
priv->search_path[i++] = g_build_filename (xdg_data_dirs[j], "icons", NULL); icon_theme->search_path[i++] = g_build_filename (xdg_data_dirs[j], "icons", NULL);
for (j = 0; xdg_data_dirs[j]; j++) for (j = 0; xdg_data_dirs[j]; j++)
priv->search_path[i++] = g_build_filename (xdg_data_dirs[j], "pixmaps", NULL); icon_theme->search_path[i++] = g_build_filename (xdg_data_dirs[j], "pixmaps", NULL);
priv->resource_paths = g_list_append (NULL, g_strdup ("/org/gtk/libgtk/icons/")); icon_theme->resource_paths = g_list_append (NULL, g_strdup ("/org/gtk/libgtk/icons/"));
priv->themes_valid = FALSE; icon_theme->themes_valid = FALSE;
priv->themes = NULL; icon_theme->themes = NULL;
priv->unthemed_icons = NULL; icon_theme->unthemed_icons = NULL;
priv->pixbuf_supports_svg = pixbuf_supports_svg (); icon_theme->pixbuf_supports_svg = pixbuf_supports_svg ();
settings = st_settings_get (); settings = st_settings_get ();
g_signal_connect (settings, "notify::gtk-icon-theme", g_signal_connect (settings, "notify::gtk-icon-theme",
@ -503,14 +507,12 @@ static gboolean
theme_changed_idle (gpointer user_data) theme_changed_idle (gpointer user_data)
{ {
GtkIconTheme *icon_theme; GtkIconTheme *icon_theme;
GtkIconThemePrivate *priv;
icon_theme = GTK_ICON_THEME (user_data); icon_theme = GTK_ICON_THEME (user_data);
priv = icon_theme->priv;
g_signal_emit (icon_theme, signal_changed, 0); g_signal_emit (icon_theme, signals[CHANGED], 0);
priv->theme_changed_idle = 0; icon_theme->theme_changed_idle = 0;
return FALSE; return FALSE;
} }
@ -518,23 +520,19 @@ theme_changed_idle (gpointer user_data)
static void static void
queue_theme_changed (GtkIconTheme *icon_theme) queue_theme_changed (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv = icon_theme->priv; if (!icon_theme->theme_changed_idle)
if (!priv->theme_changed_idle)
{ {
priv->theme_changed_idle = g_idle_add (theme_changed_idle, icon_theme); icon_theme->theme_changed_idle = g_idle_add (theme_changed_idle, icon_theme);
g_source_set_name_by_id (priv->theme_changed_idle, "[gtk+] theme_changed_idle"); g_source_set_name_by_id (icon_theme->theme_changed_idle, "[gtk+] theme_changed_idle");
} }
} }
static void static void
do_theme_change (GtkIconTheme *icon_theme) do_theme_change (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv = icon_theme->priv; g_hash_table_remove_all (icon_theme->info_cache);
g_hash_table_remove_all (priv->info_cache); if (!icon_theme->themes_valid)
if (!priv->themes_valid)
return; return;
g_debug ("change to icon theme \"%s\"", icon_theme->current_theme); g_debug ("change to icon theme \"%s\"", icon_theme->current_theme);
@ -547,42 +545,38 @@ do_theme_change (GtkIconTheme *icon_theme)
static void static void
blow_themes (GtkIconTheme *icon_theme) blow_themes (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv = icon_theme->priv; if (icon_theme->themes_valid)
if (priv->themes_valid)
{ {
g_list_free_full (priv->themes, (GDestroyNotify) theme_destroy); g_list_free_full (icon_theme->themes, (GDestroyNotify) theme_destroy);
g_list_free_full (priv->dir_mtimes, (GDestroyNotify) free_dir_mtime); g_list_free_full (icon_theme->dir_mtimes, (GDestroyNotify) free_dir_mtime);
g_hash_table_destroy (priv->unthemed_icons); g_hash_table_destroy (icon_theme->unthemed_icons);
} }
priv->themes = NULL; icon_theme->themes = NULL;
priv->unthemed_icons = NULL; icon_theme->unthemed_icons = NULL;
priv->dir_mtimes = NULL; icon_theme->dir_mtimes = NULL;
priv->themes_valid = FALSE; icon_theme->themes_valid = FALSE;
} }
static void static void
gtk_icon_theme_finalize (GObject *object) gtk_icon_theme_finalize (GObject *object)
{ {
GtkIconTheme *icon_theme; GtkIconTheme *icon_theme;
GtkIconThemePrivate *priv;
int i; int i;
icon_theme = GTK_ICON_THEME (object); icon_theme = GTK_ICON_THEME (object);
priv = icon_theme->priv;
g_hash_table_destroy (priv->info_cache); g_hash_table_destroy (icon_theme->info_cache);
g_assert (priv->info_cache_lru == NULL); g_assert (icon_theme->info_cache_lru == NULL);
g_clear_handle_id (&priv->theme_changed_idle, g_source_remove); g_clear_handle_id (&icon_theme->theme_changed_idle, g_source_remove);
g_free (priv->current_theme); g_free (icon_theme->current_theme);
for (i = 0; i < priv->search_path_len; i++) for (i = 0; i < icon_theme->search_path_len; i++)
g_free (priv->search_path[i]); g_free (icon_theme->search_path[i]);
g_free (priv->search_path); g_free (icon_theme->search_path);
g_list_free_full (priv->resource_paths, g_free); g_list_free_full (icon_theme->resource_paths, g_free);
blow_themes (icon_theme); blow_themes (icon_theme);
@ -618,22 +612,20 @@ gtk_icon_theme_set_search_path (GtkIconTheme *icon_theme,
const char *path[], const char *path[],
int n_elements) int n_elements)
{ {
GtkIconThemePrivate *priv;
int i; int i;
g_return_if_fail (GTK_IS_ICON_THEME (icon_theme)); g_return_if_fail (GTK_IS_ICON_THEME (icon_theme));
priv = icon_theme->priv; for (i = 0; i < icon_theme->search_path_len; i++)
for (i = 0; i < priv->search_path_len; i++) g_free (icon_theme->search_path[i]);
g_free (priv->search_path[i]);
g_free (priv->search_path); g_free (icon_theme->search_path);
priv->search_path = g_new (char *, n_elements); icon_theme->search_path = g_new (char *, n_elements);
priv->search_path_len = n_elements; icon_theme->search_path_len = n_elements;
for (i = 0; i < priv->search_path_len; i++) for (i = 0; i < icon_theme->search_path_len; i++)
priv->search_path[i] = g_strdup (path[i]); icon_theme->search_path[i] = g_strdup (path[i]);
do_theme_change (icon_theme); do_theme_change (icon_theme);
} }
@ -655,21 +647,18 @@ gtk_icon_theme_get_search_path (GtkIconTheme *icon_theme,
char **path[], char **path[],
int *n_elements) int *n_elements)
{ {
GtkIconThemePrivate *priv;
int i; int i;
g_return_if_fail (GTK_IS_ICON_THEME (icon_theme)); g_return_if_fail (GTK_IS_ICON_THEME (icon_theme));
priv = icon_theme->priv;
if (n_elements) if (n_elements)
*n_elements = priv->search_path_len; *n_elements = icon_theme->search_path_len;
if (path) if (path)
{ {
*path = g_new (char *, priv->search_path_len + 1); *path = g_new (char *, icon_theme->search_path_len + 1);
for (i = 0; i < priv->search_path_len; i++) for (i = 0; i < icon_theme->search_path_len; i++)
(*path)[i] = g_strdup (priv->search_path[i]); (*path)[i] = g_strdup (icon_theme->search_path[i]);
(*path)[i] = NULL; (*path)[i] = NULL;
} }
} }
@ -688,17 +677,13 @@ void
gtk_icon_theme_append_search_path (GtkIconTheme *icon_theme, gtk_icon_theme_append_search_path (GtkIconTheme *icon_theme,
const char *path) const char *path)
{ {
GtkIconThemePrivate *priv;
g_return_if_fail (GTK_IS_ICON_THEME (icon_theme)); g_return_if_fail (GTK_IS_ICON_THEME (icon_theme));
g_return_if_fail (path != NULL); g_return_if_fail (path != NULL);
priv = icon_theme->priv; icon_theme->search_path_len++;
priv->search_path_len++; icon_theme->search_path = g_renew (char *, icon_theme->search_path, icon_theme->search_path_len);
icon_theme->search_path[icon_theme->search_path_len-1] = g_strdup (path);
priv->search_path = g_renew (char *, priv->search_path, priv->search_path_len);
priv->search_path[priv->search_path_len-1] = g_strdup (path);
do_theme_change (icon_theme); do_theme_change (icon_theme);
} }
@ -717,21 +702,18 @@ void
gtk_icon_theme_prepend_search_path (GtkIconTheme *icon_theme, gtk_icon_theme_prepend_search_path (GtkIconTheme *icon_theme,
const char *path) const char *path)
{ {
GtkIconThemePrivate *priv;
int i; int i;
g_return_if_fail (GTK_IS_ICON_THEME (icon_theme)); g_return_if_fail (GTK_IS_ICON_THEME (icon_theme));
g_return_if_fail (path != NULL); g_return_if_fail (path != NULL);
priv = icon_theme->priv; icon_theme->search_path_len++;
icon_theme->search_path = g_renew (char *, icon_theme->search_path, icon_theme->search_path_len);
priv->search_path_len++; for (i = icon_theme->search_path_len - 1; i > 0; i--)
priv->search_path = g_renew (char *, priv->search_path, priv->search_path_len); icon_theme->search_path[i] = icon_theme->search_path[i - 1];
for (i = priv->search_path_len - 1; i > 0; i--) icon_theme->search_path[0] = g_strdup (path);
priv->search_path[i] = priv->search_path[i - 1];
priv->search_path[0] = g_strdup (path);
do_theme_change (icon_theme); do_theme_change (icon_theme);
} }
@ -759,13 +741,10 @@ void
gtk_icon_theme_add_resource_path (GtkIconTheme *icon_theme, gtk_icon_theme_add_resource_path (GtkIconTheme *icon_theme,
const char *path) const char *path)
{ {
GtkIconThemePrivate *priv = NULL;
g_return_if_fail (GTK_IS_ICON_THEME (icon_theme)); g_return_if_fail (GTK_IS_ICON_THEME (icon_theme));
g_return_if_fail (path != NULL); g_return_if_fail (path != NULL);
priv = icon_theme->priv; icon_theme->resource_paths = g_list_append (icon_theme->resource_paths, g_strdup (path));
priv->resource_paths = g_list_append (priv->resource_paths, g_strdup (path));
do_theme_change (icon_theme); do_theme_change (icon_theme);
} }
@ -812,7 +791,6 @@ insert_theme (GtkIconTheme *icon_theme,
char **dirs; char **dirs;
char **scaled_dirs; char **scaled_dirs;
char **themes; char **themes;
GtkIconThemePrivate *priv;
IconTheme *theme = NULL; IconTheme *theme = NULL;
char *path; char *path;
GKeyFile *theme_file; GKeyFile *theme_file;
@ -820,18 +798,16 @@ insert_theme (GtkIconTheme *icon_theme,
IconThemeDirMtime *dir_mtime; IconThemeDirMtime *dir_mtime;
GStatBuf stat_buf; GStatBuf stat_buf;
priv = icon_theme->priv; for (l = icon_theme->themes; l != NULL; l = l->next)
for (l = priv->themes; l != NULL; l = l->next)
{ {
theme = l->data; theme = l->data;
if (strcmp (theme->name, theme_name) == 0) if (strcmp (theme->name, theme_name) == 0)
return; return;
} }
for (i = 0; i < priv->search_path_len; i++) for (i = 0; i < icon_theme->search_path_len; i++)
{ {
path = g_build_filename (priv->search_path[i], path = g_build_filename (icon_theme->search_path[i],
theme_name, theme_name,
NULL); NULL);
dir_mtime = g_slice_new (IconThemeDirMtime); dir_mtime = g_slice_new (IconThemeDirMtime);
@ -845,13 +821,13 @@ insert_theme (GtkIconTheme *icon_theme,
dir_mtime->exists = FALSE; dir_mtime->exists = FALSE;
} }
priv->dir_mtimes = g_list_prepend (priv->dir_mtimes, dir_mtime); icon_theme->dir_mtimes = g_list_prepend (icon_theme->dir_mtimes, dir_mtime);
} }
theme_file = NULL; theme_file = NULL;
for (i = 0; i < priv->search_path_len && !theme_file; i++) for (i = 0; i < icon_theme->search_path_len && !theme_file; i++)
{ {
path = g_build_filename (priv->search_path[i], path = g_build_filename (icon_theme->search_path[i],
theme_name, theme_name,
"index.theme", "index.theme",
NULL); NULL);
@ -874,7 +850,7 @@ insert_theme (GtkIconTheme *icon_theme,
{ {
theme = g_new0 (IconTheme, 1); theme = g_new0 (IconTheme, 1);
theme->name = g_strdup (theme_name); theme->name = g_strdup (theme_name);
priv->themes = g_list_prepend (priv->themes, theme); icon_theme->themes = g_list_prepend (icon_theme->themes, theme);
if (!theme_file) if (!theme_file)
{ {
theme_file = g_key_file_new (); theme_file = g_key_file_new ();
@ -895,7 +871,7 @@ insert_theme (GtkIconTheme *icon_theme,
if (!dirs) if (!dirs)
{ {
g_warning ("Theme file for %s has no directories", theme_name); g_warning ("Theme file for %s has no directories", theme_name);
priv->themes = g_list_remove (priv->themes, theme); icon_theme->themes = g_list_remove (icon_theme->themes, theme);
g_free (theme->name); g_free (theme->name);
g_free (theme->display_name); g_free (theme->display_name);
g_free (theme); g_free (theme);
@ -974,7 +950,6 @@ add_unthemed_icon (GtkIconTheme *icon_theme,
const char *file, const char *file,
gboolean is_resource) gboolean is_resource)
{ {
GtkIconThemePrivate *priv = icon_theme->priv;
IconSuffix new_suffix, old_suffix; IconSuffix new_suffix, old_suffix;
char *abs_file; char *abs_file;
char *base_name; char *base_name;
@ -988,7 +963,7 @@ add_unthemed_icon (GtkIconTheme *icon_theme,
abs_file = g_build_filename (dir, file, NULL); abs_file = g_build_filename (dir, file, NULL);
base_name = strip_suffix (file); base_name = strip_suffix (file);
unthemed_icon = g_hash_table_lookup (priv->unthemed_icons, base_name); unthemed_icon = g_hash_table_lookup (icon_theme->unthemed_icons, base_name);
if (unthemed_icon) if (unthemed_icon)
{ {
@ -1030,14 +1005,13 @@ add_unthemed_icon (GtkIconTheme *icon_theme,
unthemed_icon->no_svg_filename = abs_file; unthemed_icon->no_svg_filename = abs_file;
/* takes ownership of base_name */ /* takes ownership of base_name */
g_hash_table_replace (priv->unthemed_icons, base_name, unthemed_icon); g_hash_table_replace (icon_theme->unthemed_icons, base_name, unthemed_icon);
} }
} }
static void static void
load_themes (GtkIconTheme *icon_theme) load_themes (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv;
GDir *gdir; GDir *gdir;
int base; int base;
char *dir; char *dir;
@ -1047,10 +1021,8 @@ load_themes (GtkIconTheme *icon_theme)
GStatBuf stat_buf; GStatBuf stat_buf;
GList *d; GList *d;
priv = icon_theme->priv; if (icon_theme->current_theme)
insert_theme (icon_theme, icon_theme->current_theme);
if (priv->current_theme)
insert_theme (icon_theme, priv->current_theme);
/* Always look in the Adwaita, gnome and hicolor icon themes. /* Always look in the Adwaita, gnome and hicolor icon themes.
* Looking in hicolor is mandated by the spec, looking in Adwaita * Looking in hicolor is mandated by the spec, looking in Adwaita
@ -1060,18 +1032,18 @@ load_themes (GtkIconTheme *icon_theme)
insert_theme (icon_theme, DEFAULT_ICON_THEME); insert_theme (icon_theme, DEFAULT_ICON_THEME);
insert_theme (icon_theme, "gnome"); insert_theme (icon_theme, "gnome");
insert_theme (icon_theme, FALLBACK_ICON_THEME); insert_theme (icon_theme, FALLBACK_ICON_THEME);
priv->themes = g_list_reverse (priv->themes); icon_theme->themes = g_list_reverse (icon_theme->themes);
priv->unthemed_icons = g_hash_table_new_full (g_str_hash, g_str_equal, icon_theme->unthemed_icons = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, (GDestroyNotify)free_unthemed_icon); g_free, (GDestroyNotify)free_unthemed_icon);
for (base = 0; base < icon_theme->priv->search_path_len; base++) for (base = 0; base < icon_theme->search_path_len; base++)
{ {
dir = icon_theme->priv->search_path[base]; dir = icon_theme->search_path[base];
dir_mtime = g_slice_new (IconThemeDirMtime); dir_mtime = g_slice_new (IconThemeDirMtime);
priv->dir_mtimes = g_list_prepend (priv->dir_mtimes, dir_mtime); icon_theme->dir_mtimes = g_list_prepend (icon_theme->dir_mtimes, dir_mtime);
dir_mtime->dir = g_strdup (dir); dir_mtime->dir = g_strdup (dir);
dir_mtime->mtime = 0; dir_mtime->mtime = 0;
@ -1096,9 +1068,9 @@ load_themes (GtkIconTheme *icon_theme)
g_dir_close (gdir); g_dir_close (gdir);
} }
priv->dir_mtimes = g_list_reverse (priv->dir_mtimes); icon_theme->dir_mtimes = g_list_reverse (icon_theme->dir_mtimes);
for (d = priv->resource_paths; d; d = d->next) for (d = icon_theme->resource_paths; d; d = d->next)
{ {
char **children; char **children;
int i; int i;
@ -1114,36 +1086,35 @@ load_themes (GtkIconTheme *icon_theme)
g_strfreev (children); g_strfreev (children);
} }
priv->themes_valid = TRUE; icon_theme->themes_valid = TRUE;
g_get_current_time (&tv); g_get_current_time (&tv);
priv->last_stat_time = tv.tv_sec; icon_theme->last_stat_time = tv.tv_sec;
} }
static void static void
ensure_valid_themes (GtkIconTheme *icon_theme) ensure_valid_themes (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv = icon_theme->priv;
GTimeVal tv; GTimeVal tv;
gboolean was_valid = priv->themes_valid; gboolean was_valid = icon_theme->themes_valid;
if (priv->loading_themes) if (icon_theme->loading_themes)
return; return;
priv->loading_themes = TRUE; icon_theme->loading_themes = TRUE;
if (priv->themes_valid) if (icon_theme->themes_valid)
{ {
g_get_current_time (&tv); g_get_current_time (&tv);
if (ABS (tv.tv_sec - priv->last_stat_time) > 5 && if (ABS (tv.tv_sec - icon_theme->last_stat_time) > 5 &&
rescan_themes (icon_theme)) rescan_themes (icon_theme))
{ {
g_hash_table_remove_all (priv->info_cache); g_hash_table_remove_all (icon_theme->info_cache);
blow_themes (icon_theme); blow_themes (icon_theme);
} }
} }
if (!priv->themes_valid) if (!icon_theme->themes_valid)
{ {
load_themes (icon_theme); load_themes (icon_theme);
@ -1151,7 +1122,7 @@ ensure_valid_themes (GtkIconTheme *icon_theme)
queue_theme_changed (icon_theme); queue_theme_changed (icon_theme);
} }
priv->loading_themes = FALSE; icon_theme->loading_themes = FALSE;
} }
/* The LRU cache is a short list of IconInfos that are kept /* The LRU cache is a short list of IconInfos that are kept
@ -1166,11 +1137,10 @@ ensure_valid_themes (GtkIconTheme *icon_theme)
static void static void
ensure_lru_cache_space (GtkIconTheme *icon_theme) ensure_lru_cache_space (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv = icon_theme->priv;
GList *l; GList *l;
/* Remove last item if LRU full */ /* Remove last item if LRU full */
l = g_list_nth (priv->info_cache_lru, INFO_CACHE_LRU_SIZE - 1); l = g_list_nth (icon_theme->info_cache_lru, INFO_CACHE_LRU_SIZE - 1);
if (l) if (l)
{ {
GtkIconInfo *icon_info = l->data; GtkIconInfo *icon_info = l->data;
@ -1179,9 +1149,9 @@ ensure_lru_cache_space (GtkIconTheme *icon_theme)
icon_info, icon_info,
g_strjoinv (",", icon_info->key.icon_names), g_strjoinv (",", icon_info->key.icon_names),
icon_info->key.size, icon_info->key.flags, icon_info->key.size, icon_info->key.flags,
g_list_length (priv->info_cache_lru))); g_list_length (icon_theme->info_cache_lru)));
priv->info_cache_lru = g_list_delete_link (priv->info_cache_lru, l); icon_theme->info_cache_lru = g_list_delete_link (icon_theme->info_cache_lru, l);
g_object_unref (icon_info); g_object_unref (icon_info);
} }
} }
@ -1190,19 +1160,17 @@ static void
add_to_lru_cache (GtkIconTheme *icon_theme, add_to_lru_cache (GtkIconTheme *icon_theme,
GtkIconInfo *icon_info) GtkIconInfo *icon_info)
{ {
GtkIconThemePrivate *priv = icon_theme->priv;
DEBUG_CACHE (("adding %p (%s %d 0x%x) to LRU cache (cache size %d)\n", DEBUG_CACHE (("adding %p (%s %d 0x%x) to LRU cache (cache size %d)\n",
icon_info, icon_info,
g_strjoinv (",", icon_info->key.icon_names), g_strjoinv (",", icon_info->key.icon_names),
icon_info->key.size, icon_info->key.flags, icon_info->key.size, icon_info->key.flags,
g_list_length (priv->info_cache_lru))); g_list_length (icon_theme->info_cache_lru)));
g_assert (g_list_find (priv->info_cache_lru, icon_info) == NULL); g_assert (g_list_find (icon_theme->info_cache_lru, icon_info) == NULL);
ensure_lru_cache_space (icon_theme); ensure_lru_cache_space (icon_theme);
/* prepend new info to LRU */ /* prepend new info to LRU */
priv->info_cache_lru = g_list_prepend (priv->info_cache_lru, icon_theme->info_cache_lru = g_list_prepend (icon_theme->info_cache_lru,
g_object_ref (icon_info)); g_object_ref (icon_info));
} }
@ -1210,15 +1178,14 @@ static void
ensure_in_lru_cache (GtkIconTheme *icon_theme, ensure_in_lru_cache (GtkIconTheme *icon_theme,
GtkIconInfo *icon_info) GtkIconInfo *icon_info)
{ {
GtkIconThemePrivate *priv = icon_theme->priv;
GList *l; GList *l;
l = g_list_find (priv->info_cache_lru, icon_info); l = g_list_find (icon_theme->info_cache_lru, icon_info);
if (l) if (l)
{ {
/* Move to front of LRU if already in it */ /* Move to front of LRU if already in it */
priv->info_cache_lru = g_list_remove_link (priv->info_cache_lru, l); icon_theme->info_cache_lru = g_list_remove_link (icon_theme->info_cache_lru, l);
priv->info_cache_lru = g_list_concat (l, priv->info_cache_lru); icon_theme->info_cache_lru = g_list_concat (l, icon_theme->info_cache_lru);
} }
else else
add_to_lru_cache (icon_theme, icon_info); add_to_lru_cache (icon_theme, icon_info);
@ -1228,16 +1195,15 @@ static void
remove_from_lru_cache (GtkIconTheme *icon_theme, remove_from_lru_cache (GtkIconTheme *icon_theme,
GtkIconInfo *icon_info) GtkIconInfo *icon_info)
{ {
GtkIconThemePrivate *priv = icon_theme->priv; if (g_list_find (icon_theme->info_cache_lru, icon_info))
if (g_list_find (priv->info_cache_lru, icon_info))
{ {
DEBUG_CACHE (("removing %p (%s %d 0x%x) from LRU cache (cache size %d)\n", DEBUG_CACHE (("removing %p (%s %d 0x%x) from LRU cache (cache size %d)\n",
icon_info, icon_info,
g_strjoinv (",", icon_info->key.icon_names), g_strjoinv (",", icon_info->key.icon_names),
icon_info->key.size, icon_info->key.flags, icon_info->key.size, icon_info->key.flags,
g_list_length (priv->info_cache_lru))); g_list_length (icon_theme->info_cache_lru)));
priv->info_cache_lru = g_list_remove (priv->info_cache_lru, icon_info); icon_theme->info_cache_lru = g_list_remove (icon_theme->info_cache_lru, icon_info);
g_object_unref (icon_info); g_object_unref (icon_info);
} }
} }
@ -1345,7 +1311,6 @@ real_choose_icon (GtkIconTheme *icon_theme,
int scale, int scale,
GtkIconLookupFlags flags) GtkIconLookupFlags flags)
{ {
GtkIconThemePrivate *priv;
GList *l; GList *l;
GtkIconInfo *icon_info = NULL; GtkIconInfo *icon_info = NULL;
GtkIconInfo *unscaled_icon_info; GtkIconInfo *unscaled_icon_info;
@ -1356,8 +1321,6 @@ real_choose_icon (GtkIconTheme *icon_theme,
int i; int i;
IconInfoKey key; IconInfoKey key;
priv = icon_theme->priv;
ensure_valid_themes (icon_theme); ensure_valid_themes (icon_theme);
key.icon_names = (char **)icon_names; key.icon_names = (char **)icon_names;
@ -1365,14 +1328,14 @@ real_choose_icon (GtkIconTheme *icon_theme,
key.scale = scale; key.scale = scale;
key.flags = flags; key.flags = flags;
icon_info = g_hash_table_lookup (priv->info_cache, &key); icon_info = g_hash_table_lookup (icon_theme->info_cache, &key);
if (icon_info != NULL) if (icon_info != NULL)
{ {
DEBUG_CACHE (("cache hit %p (%s %d 0x%x) (cache size %d)\n", DEBUG_CACHE (("cache hit %p (%s %d 0x%x) (cache size %d)\n",
icon_info, icon_info,
g_strjoinv (",", icon_info->key.icon_names), g_strjoinv (",", icon_info->key.icon_names),
icon_info->key.size, icon_info->key.flags, icon_info->key.size, icon_info->key.flags,
g_hash_table_size (priv->info_cache))); g_hash_table_size (icon_theme->info_cache)));
icon_info = g_object_ref (icon_info); icon_info = g_object_ref (icon_info);
remove_from_lru_cache (icon_theme, icon_info); remove_from_lru_cache (icon_theme, icon_info);
@ -1385,7 +1348,7 @@ real_choose_icon (GtkIconTheme *icon_theme,
else if (flags & GTK_ICON_LOOKUP_FORCE_SVG) else if (flags & GTK_ICON_LOOKUP_FORCE_SVG)
allow_svg = TRUE; allow_svg = TRUE;
else else
allow_svg = priv->pixbuf_supports_svg; allow_svg = icon_theme->pixbuf_supports_svg;
/* For symbolic icons, do a search in all registered themes first; /* For symbolic icons, do a search in all registered themes first;
* a theme that inherits them from a parent theme might provide * a theme that inherits them from a parent theme might provide
@ -1395,7 +1358,7 @@ real_choose_icon (GtkIconTheme *icon_theme,
* In other words: We prefer symbolic icons in inherited themes over * In other words: We prefer symbolic icons in inherited themes over
* generic icons in the theme. * generic icons in the theme.
*/ */
for (l = priv->themes; l; l = l->next) for (l = icon_theme->themes; l; l = l->next)
{ {
theme = l->data; theme = l->data;
for (i = 0; icon_names[i] && icon_name_is_symbolic (icon_names[i]); i++) for (i = 0; icon_names[i] && icon_name_is_symbolic (icon_names[i]); i++)
@ -1407,7 +1370,7 @@ real_choose_icon (GtkIconTheme *icon_theme,
} }
} }
for (l = priv->themes; l; l = l->next) for (l = icon_theme->themes; l; l = l->next)
{ {
theme = l->data; theme = l->data;
@ -1424,7 +1387,7 @@ real_choose_icon (GtkIconTheme *icon_theme,
for (i = 0; icon_names[i]; i++) for (i = 0; icon_names[i]; i++)
{ {
unthemed_icon = g_hash_table_lookup (priv->unthemed_icons, icon_names[i]); unthemed_icon = g_hash_table_lookup (icon_theme->unthemed_icons, icon_names[i]);
if (unthemed_icon) if (unthemed_icon)
break; break;
} }
@ -1502,8 +1465,8 @@ real_choose_icon (GtkIconTheme *icon_theme,
icon_info, icon_info,
g_strjoinv (",", icon_info->key.icon_names), g_strjoinv (",", icon_info->key.icon_names),
icon_info->key.size, icon_info->key.flags, icon_info->key.size, icon_info->key.flags,
g_hash_table_size (priv->info_cache))); g_hash_table_size (icon_theme->info_cache)));
g_hash_table_insert (priv->info_cache, &icon_info->key, icon_info); g_hash_table_insert (icon_theme->info_cache, &icon_info->key, icon_info);
} }
else else
{ {
@ -1515,9 +1478,9 @@ real_choose_icon (GtkIconTheme *icon_theme,
{ {
check_for_default_theme = FALSE; check_for_default_theme = FALSE;
for (i = 0; !found && i < priv->search_path_len; i++) for (i = 0; !found && i < icon_theme->search_path_len; i++)
{ {
default_theme_path = g_build_filename (priv->search_path[i], default_theme_path = g_build_filename (icon_theme->search_path[i],
FALLBACK_ICON_THEME, FALLBACK_ICON_THEME,
"index.theme", "index.theme",
NULL); NULL);
@ -1988,7 +1951,7 @@ gtk_icon_theme_load_icon_for_scale (GtkIconTheme *icon_theme,
if (!icon_info) if (!icon_info)
{ {
g_set_error (error, GTK_ICON_THEME_ERROR, GTK_ICON_THEME_NOT_FOUND, g_set_error (error, GTK_ICON_THEME_ERROR, GTK_ICON_THEME_NOT_FOUND,
_("Icon '%s' not present in theme %s"), icon_name, icon_theme->priv->current_theme); _("Icon '%s' not present in theme %s"), icon_name, icon_theme->current_theme);
return NULL; return NULL;
} }
@ -2016,17 +1979,14 @@ gboolean
gtk_icon_theme_has_icon (GtkIconTheme *icon_theme, gtk_icon_theme_has_icon (GtkIconTheme *icon_theme,
const char *icon_name) const char *icon_name)
{ {
GtkIconThemePrivate *priv;
GList *l; GList *l;
g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), FALSE); g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), FALSE);
g_return_val_if_fail (icon_name != NULL, FALSE); g_return_val_if_fail (icon_name != NULL, FALSE);
priv = icon_theme->priv;
ensure_valid_themes (icon_theme); ensure_valid_themes (icon_theme);
for (l = priv->dir_mtimes; l; l = l->next) for (l = icon_theme->dir_mtimes; l; l = l->next)
{ {
IconThemeDirMtime *dir_mtime = l->data; IconThemeDirMtime *dir_mtime = l->data;
GtkIconCache *cache = dir_mtime->cache; GtkIconCache *cache = dir_mtime->cache;
@ -2035,7 +1995,7 @@ gtk_icon_theme_has_icon (GtkIconTheme *icon_theme,
return TRUE; return TRUE;
} }
for (l = priv->themes; l; l = l->next) for (l = icon_theme->themes; l; l = l->next)
{ {
if (theme_has_icon (l->data, icon_name)) if (theme_has_icon (l->data, icon_name))
return TRUE; return TRUE;
@ -2081,17 +2041,14 @@ gtk_icon_theme_get_icon_sizes (GtkIconTheme *icon_theme,
GHashTable *sizes; GHashTable *sizes;
int *result, *r; int *result, *r;
guint suffix; guint suffix;
GtkIconThemePrivate *priv;
g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL); g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
priv = icon_theme->priv;
ensure_valid_themes (icon_theme); ensure_valid_themes (icon_theme);
sizes = g_hash_table_new (g_direct_hash, g_direct_equal); sizes = g_hash_table_new (g_direct_hash, g_direct_equal);
for (l = priv->themes; l; l = l->next) for (l = icon_theme->themes; l; l = l->next)
{ {
IconTheme *theme = l->data; IconTheme *theme = l->data;
for (d = theme->dirs; d; d = d->next) for (d = theme->dirs; d; d = d->next)
@ -2167,13 +2124,10 @@ GList *
gtk_icon_theme_list_icons (GtkIconTheme *icon_theme, gtk_icon_theme_list_icons (GtkIconTheme *icon_theme,
const char *context) const char *context)
{ {
GtkIconThemePrivate *priv;
GHashTable *icons; GHashTable *icons;
GList *list, *l; GList *list, *l;
GQuark context_quark; GQuark context_quark;
priv = icon_theme->priv;
ensure_valid_themes (icon_theme); ensure_valid_themes (icon_theme);
if (context) if (context)
@ -2188,7 +2142,7 @@ gtk_icon_theme_list_icons (GtkIconTheme *icon_theme,
icons = g_hash_table_new (g_str_hash, g_str_equal); icons = g_hash_table_new (g_str_hash, g_str_equal);
l = priv->themes; l = icon_theme->themes;
while (l != NULL) while (l != NULL)
{ {
theme_list_icons (l->data, icons, context_quark); theme_list_icons (l->data, icons, context_quark);
@ -2196,7 +2150,7 @@ gtk_icon_theme_list_icons (GtkIconTheme *icon_theme,
} }
if (context_quark == 0) if (context_quark == 0)
g_hash_table_foreach (priv->unthemed_icons, g_hash_table_foreach (icon_theme->unthemed_icons,
add_key_to_hash, add_key_to_hash,
icons); icons);
@ -2229,17 +2183,14 @@ gtk_icon_theme_list_icons (GtkIconTheme *icon_theme,
GList * GList *
gtk_icon_theme_list_contexts (GtkIconTheme *icon_theme) gtk_icon_theme_list_contexts (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv;
GHashTable *contexts; GHashTable *contexts;
GList *list, *l; GList *list, *l;
priv = icon_theme->priv;
ensure_valid_themes (icon_theme); ensure_valid_themes (icon_theme);
contexts = g_hash_table_new (g_str_hash, g_str_equal); contexts = g_hash_table_new (g_str_hash, g_str_equal);
l = priv->themes; l = icon_theme->themes;
while (l != NULL) while (l != NULL)
{ {
theme_list_contexts (l->data, contexts); theme_list_contexts (l->data, contexts);
@ -2257,20 +2208,16 @@ gtk_icon_theme_list_contexts (GtkIconTheme *icon_theme)
return list; return list;
} }
static gboolean static gboolean
rescan_themes (GtkIconTheme *icon_theme) rescan_themes (GtkIconTheme *icon_theme)
{ {
GtkIconThemePrivate *priv;
IconThemeDirMtime *dir_mtime; IconThemeDirMtime *dir_mtime;
GList *d; GList *d;
int stat_res; int stat_res;
GStatBuf stat_buf; GStatBuf stat_buf;
GTimeVal tv; GTimeVal tv;
priv = icon_theme->priv; for (d = icon_theme->dir_mtimes; d != NULL; d = d->next)
for (d = priv->dir_mtimes; d != NULL; d = d->next)
{ {
dir_mtime = d->data; dir_mtime = d->data;
@ -2290,7 +2237,7 @@ rescan_themes (GtkIconTheme *icon_theme)
} }
g_get_current_time (&tv); g_get_current_time (&tv);
priv->last_stat_time = tv.tv_sec; icon_theme->last_stat_time = tv.tv_sec;
return FALSE; return FALSE;
} }
@ -2711,9 +2658,9 @@ theme_list_contexts (IconTheme *theme,
} }
static gboolean static gboolean
scan_directory (GtkIconThemePrivate *icon_theme, scan_directory (GtkIconTheme *icon_theme,
IconThemeDir *dir, IconThemeDir *dir,
char *full_dir) char *full_dir)
{ {
GDir *gdir; GDir *gdir;
const char *name; const char *name;
@ -2749,9 +2696,9 @@ scan_directory (GtkIconThemePrivate *icon_theme,
} }
static gboolean static gboolean
scan_resources (GtkIconThemePrivate *icon_theme, scan_resources (GtkIconTheme *icon_theme,
IconThemeDir *dir, IconThemeDir *dir,
char *full_dir) char *full_dir)
{ {
int i; int i;
char **children; char **children;
@ -2857,7 +2804,7 @@ theme_subdir_load (GtkIconTheme *icon_theme,
else else
scale = 1; scale = 1;
for (d = icon_theme->priv->dir_mtimes; d; d = d->next) for (d = icon_theme->dir_mtimes; d; d = d->next)
{ {
dir_mtime = (IconThemeDirMtime *)d->data; dir_mtime = (IconThemeDirMtime *)d->data;
@ -2897,7 +2844,7 @@ theme_subdir_load (GtkIconTheme *icon_theme,
{ {
dir->cache = NULL; dir->cache = NULL;
dir->subdir_index = -1; dir->subdir_index = -1;
has_icons = scan_directory (icon_theme->priv, dir, full_dir); has_icons = scan_directory (icon_theme, dir, full_dir);
} }
if (has_icons) if (has_icons)
@ -2911,7 +2858,7 @@ theme_subdir_load (GtkIconTheme *icon_theme,
if (strcmp (theme->name, FALLBACK_ICON_THEME) == 0) if (strcmp (theme->name, FALLBACK_ICON_THEME) == 0)
{ {
for (d = icon_theme->priv->resource_paths; d; d = d->next) for (d = icon_theme->resource_paths; d; d = d->next)
{ {
/* Force a trailing / here, to avoid extra copies in GResource */ /* Force a trailing / here, to avoid extra copies in GResource */
full_dir = g_build_filename ((const char *)d->data, subdir, " ", NULL); full_dir = g_build_filename ((const char *)d->data, subdir, " ", NULL);
@ -2930,7 +2877,7 @@ theme_subdir_load (GtkIconTheme *icon_theme,
dir->cache = NULL; dir->cache = NULL;
dir->subdir_index = -1; dir->subdir_index = -1;
if (scan_resources (icon_theme->priv, dir, full_dir)) if (scan_resources (icon_theme, dir, full_dir))
theme->dirs = g_list_prepend (theme->dirs, dir); theme->dirs = g_list_prepend (theme->dirs, dir);
else else
theme_dir_destroy (dir); theme_dir_destroy (dir);
@ -3024,7 +2971,7 @@ gtk_icon_info_finalize (GObject *object)
GtkIconInfo *icon_info = (GtkIconInfo *) object; GtkIconInfo *icon_info = (GtkIconInfo *) object;
if (icon_info->in_cache) if (icon_info->in_cache)
g_hash_table_remove (icon_info->in_cache->priv->info_cache, &icon_info->key); g_hash_table_remove (icon_info->in_cache->info_cache, &icon_info->key);
g_strfreev (icon_info->key.icon_names); g_strfreev (icon_info->key.icon_names);

View File

@ -28,73 +28,10 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define GTK_TYPE_ICON_INFO (gtk_icon_info_get_type ()) #define GTK_TYPE_ICON_INFO (gtk_icon_info_get_type ())
#define GTK_ICON_INFO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_ICON_INFO, GtkIconInfo)) G_DECLARE_FINAL_TYPE (GtkIconInfo, gtk_icon_info, GTK, ICON_INFO, GObject)
#define GTK_ICON_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ICON_INFO, GtkIconInfoClass))
#define GTK_IS_ICON_INFO(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_ICON_INFO))
#define GTK_IS_ICON_INFO_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ICON_INFO))
#define GTK_ICON_INFO_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ICON_INFO, GtkIconInfoClass))
#define GTK_TYPE_ICON_THEME (gtk_icon_theme_get_type ()) #define GTK_TYPE_ICON_THEME (gtk_icon_theme_get_type ())
#define GTK_ICON_THEME(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_ICON_THEME, GtkIconTheme)) G_DECLARE_FINAL_TYPE (GtkIconTheme, gtk_icon_theme, GTK, ICON_THEME, GOBject)
#define GTK_ICON_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ICON_THEME, GtkIconThemeClass))
#define GTK_IS_ICON_THEME(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_ICON_THEME))
#define GTK_IS_ICON_THEME_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ICON_THEME))
#define GTK_ICON_THEME_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ICON_THEME, GtkIconThemeClass))
/**
* GtkIconInfo:
*
* Contains information found when looking up an icon in
* an icon theme.
*/
typedef struct _GtkIconInfo GtkIconInfo;
typedef struct _GtkIconInfoClass GtkIconInfoClass;
typedef struct _GtkIconTheme GtkIconTheme;
typedef struct _GtkIconThemeClass GtkIconThemeClass;
typedef struct _GtkIconThemePrivate GtkIconThemePrivate;
/**
* GtkIconTheme:
*
* Acts as a database of information about an icon theme.
* Normally, you retrieve the icon theme for a particular
* screen using gtk_icon_theme_get_for_screen() and it
* will contain information about current icon theme for
* that screen, but you can also create a new #GtkIconTheme
* object and set the icon theme name explicitly using
* gtk_icon_theme_set_custom_theme().
*/
struct _GtkIconTheme
{
/*< private >*/
GObject parent_instance;
GtkIconThemePrivate *priv;
};
/**
* GtkIconThemeClass:
* @parent_class: The parent class.
* @changed: Signal emitted when the current icon theme is switched or
* GTK+ detects that a change has occurred in the contents of the
* current icon theme.
*/
struct _GtkIconThemeClass
{
GObjectClass parent_class;
/*< public >*/
void (* changed) (GtkIconTheme *icon_theme);
/*< private >*/
/* Padding for future expansion */
void (*_gtk_reserved1) (void);
void (*_gtk_reserved2) (void);
void (*_gtk_reserved3) (void);
void (*_gtk_reserved4) (void);
};
/** /**
* GtkIconLookupFlags: * GtkIconLookupFlags:
@ -154,9 +91,6 @@ typedef enum {
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GQuark gtk_icon_theme_error_quark (void); GQuark gtk_icon_theme_error_quark (void);
GDK_AVAILABLE_IN_ALL
GType gtk_icon_theme_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GtkIconTheme *gtk_icon_theme_new (void); GtkIconTheme *gtk_icon_theme_new (void);
@ -244,9 +178,6 @@ GList * gtk_icon_theme_list_contexts (GtkIconTheme
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
gboolean gtk_icon_theme_rescan_if_needed (GtkIconTheme *icon_theme); gboolean gtk_icon_theme_rescan_if_needed (GtkIconTheme *icon_theme);
GDK_AVAILABLE_IN_ALL
GType gtk_icon_info_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL GDK_AVAILABLE_IN_ALL
GtkIconInfo * gtk_icon_info_new_for_pixbuf (GtkIconTheme *icon_theme, GtkIconInfo * gtk_icon_info_new_for_pixbuf (GtkIconTheme *icon_theme,
GdkPixbuf *pixbuf); GdkPixbuf *pixbuf);