summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2007-05-18 20:19:12 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2007-05-18 20:19:12 +0000
commitb82c9dc589e7c1cf3e6a4aad5b3ebbdeab292b12 (patch)
treedab87d0e4382ec7acc828cad0db6d31b96e8e8f9
parent52119349f683a1697d631bfd10777fcfc0075560 (diff)
downloadgdk-pixbuf-b82c9dc589e7c1cf3e6a4aad5b3ebbdeab292b12.tar.gz
Add a function to look up an icon from a list of icon names. (#396901,
2007-05-18 Matthias Clasen <mclasen@redhat.com> * gtk/gtk.symbols: * gtk/gtkicontheme.h: * gtk/gtkicontheme.c: Add a function to look up an icon from a list of icon names. (#396901, Luca Ferretti) svn path=/trunk/; revision=17868
-rw-r--r--ChangeLog7
-rw-r--r--docs/reference/ChangeLog4
-rw-r--r--docs/reference/gtk/gtk-sections.txt18
-rw-r--r--gtk/gtk.symbols11
-rw-r--r--gtk/gtkicontheme.c180
-rw-r--r--gtk/gtkicontheme.h7
6 files changed, 174 insertions, 53 deletions
diff --git a/ChangeLog b/ChangeLog
index 90bc1abb7..469ae5b93 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2007-05-18 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtk.symbols:
+ * gtk/gtkicontheme.h:
+ * gtk/gtkicontheme.c: Add a function to look up an icon from
+ a list of icon names. (#396901, Luca Ferretti)
+
2007-05-18 Emmanuele Bassi <ebassi@gnome.org>
* gtk/gtkrecentchooserdefault.c:
diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog
index f745f5409..dd99c7aa8 100644
--- a/docs/reference/ChangeLog
+++ b/docs/reference/ChangeLog
@@ -1,3 +1,7 @@
+2007-05-18 Matthias Clasen <mclasen@redhat.com>
+
+ * gtk/gtk-sections.txt: Add generic icon lookup function
+
2007-04-29 Dan Winship <danw@novell.com>
* gdk/gdk-sections.txt: Add
diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index 2b8f6796a..161c2c4be 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -3013,6 +3013,23 @@ gtk_scale_get_type
</SECTION>
<SECTION>
+<FILE>gtkscalebutton</FILE>
+<TITLE>GtkScaleButton</TITLE>
+GtkScaleButton
+gtk_scale_button_new
+gtk_scale_button_set_value
+gtk_scale_button_get_value
+gtk_scale_button_set_icons
+<SUBSECTION Standard>
+GTK_SCALE_BUTTON
+GTK_SCALE_IS_BUTTON
+GTK_TYPE_SCALE_BUTTON
+GTK_SCALE_BUTTON_GET_CLASS
+<SUBSECTION Private>
+gtk_scale_button_get_type
+</SECTION>
+
+<SECTION>
<FILE>gtkscrollbar</FILE>
<TITLE>GtkScrollbar</TITLE>
GtkScrollbar
@@ -6003,6 +6020,7 @@ gtk_icon_theme_prepend_search_path
gtk_icon_theme_set_custom_theme
gtk_icon_theme_has_icon
gtk_icon_theme_lookup_icon
+gtk_icon_theme_choose_icon
gtk_icon_theme_load_icon
gtk_icon_theme_list_contexts
gtk_icon_theme_list_icons
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 73b9546ca..c278ae7f9 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -1768,6 +1768,7 @@ gtk_icon_theme_list_contexts
gtk_icon_theme_list_icons
gtk_icon_theme_load_icon
gtk_icon_theme_lookup_icon
+gtk_icon_theme_choose_icon
gtk_icon_theme_new
gtk_icon_theme_prepend_search_path PRIVATE
#ifdef G_OS_WIN32
@@ -4455,6 +4456,16 @@ gtk_viewport_set_vadjustment
#endif
#endif
+#if IN_HEADER(__GTK_SCALE_BUTTON_H__)
+#if IN_FILE(__GTK_SCALE_BUTTON_C__)
+gtk_scale_button_get_type G_GNUC_CONST
+gtk_scale_button_get_value
+gtk_scale_button_new
+gtk_scale_button_set_icons
+gtk_scale_button_set_value
+#endif
+#endif
+
#if IN_HEADER(__GTK_VPANED_H__)
#if IN_FILE(__GTK_VPANED_C__)
gtk_vpaned_get_type G_GNUC_CONST
diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c
index b7db3f4f8..2aa1c59e5 100644
--- a/gtk/gtkicontheme.c
+++ b/gtk/gtkicontheme.c
@@ -1225,30 +1225,11 @@ ensure_valid_themes (GtkIconTheme *icon_theme)
priv->loading_themes = FALSE;
}
-/**
- * gtk_icon_theme_lookup_icon:
- * @icon_theme: a #GtkIconTheme
- * @icon_name: the name of the icon to lookup
- * @size: desired icon size
- * @flags: flags modifying the behavior of the icon lookup
- *
- * Looks up a named icon and returns a structure containing
- * information such as the filename of the icon. The icon
- * can then be rendered into a pixbuf using
- * gtk_icon_info_load_icon(). (gtk_icon_theme_load_icon()
- * combines these two steps if all you need is the pixbuf.)
- *
- * Return value: a #GtkIconInfo structure containing information
- * about the icon, or %NULL if the icon wasn't found. Free with
- * gtk_icon_info_free()
- *
- * Since: 2.4
- **/
-GtkIconInfo *
-gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
- const gchar *icon_name,
- gint size,
- GtkIconLookupFlags flags)
+static GtkIconInfo *
+choose_icon (GtkIconTheme *icon_theme,
+ const gchar *icon_names[],
+ gint size,
+ GtkIconLookupFlags flags)
{
GtkIconThemePrivate *priv;
GList *l;
@@ -1256,17 +1237,10 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
UnthemedIcon *unthemed_icon;
gboolean allow_svg;
gboolean use_builtin;
- gboolean generic_fallback;
-
- g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
- g_return_val_if_fail (icon_name != NULL, NULL);
- g_return_val_if_fail ((flags & GTK_ICON_LOOKUP_NO_SVG) == 0 ||
- (flags & GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+ gint i;
priv = icon_theme->priv;
- GTK_NOTE (ICONTHEME,
- g_print ("gtk_icon_theme_lookup_icon %s\n", icon_name));
if (flags & GTK_ICON_LOOKUP_NO_SVG)
allow_svg = FALSE;
else if (flags & GTK_ICON_LOOKUP_FORCE_SVG)
@@ -1275,7 +1249,6 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
allow_svg = priv->pixbuf_supports_svg;
use_builtin = flags & GTK_ICON_LOOKUP_USE_BUILTIN;
- generic_fallback = flags & GTK_ICON_LOOKUP_GENERIC_FALLBACK;
ensure_valid_themes (icon_theme);
@@ -1283,29 +1256,21 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
{
IconTheme *theme = l->data;
- gchar *name = g_strdup (icon_name);
- gchar *s;
-
- while (TRUE)
+ for (i = 0; icon_names[i]; i++)
{
- icon_info = theme_lookup_icon (theme, name, size, allow_svg, use_builtin);
- if (icon_info || !generic_fallback)
- break;
-
- s = strrchr (name, '-');
- if (!s)
- break;
-
- *s = '\0';
+ icon_info = theme_lookup_icon (theme, icon_names[i], size, allow_svg, use_builtin);
+ if (icon_info)
+ goto out;
}
+ }
- g_free (name);
-
- if (icon_info)
- goto out;
+ for (i = 0; icon_names[i]; i++)
+ {
+ unthemed_icon = g_hash_table_lookup (priv->unthemed_icons, icon_names[i]);
+ if (unthemed_icon)
+ break;
}
- unthemed_icon = g_hash_table_lookup (priv->unthemed_icons, icon_name);
if (unthemed_icon)
{
icon_info = icon_info_new ();
@@ -1357,7 +1322,7 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
"was not found either, perhaps you need to install it.\n"
"You can get a copy from:\n"
"\t%s"),
- icon_name, DEFAULT_THEME_NAME, "http://icon-theme.freedesktop.org/releases");
+ icon_names[0], DEFAULT_THEME_NAME, "http://icon-theme.freedesktop.org/releases");
}
}
}
@@ -1365,6 +1330,117 @@ gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
return icon_info;
}
+
+/**
+ * gtk_icon_theme_lookup_icon:
+ * @icon_theme: a #GtkIconTheme
+ * @icon_name: the name of the icon to lookup
+ * @size: desired icon size
+ * @flags: flags modifying the behavior of the icon lookup
+ *
+ * Looks up a named icon and returns a structure containing
+ * information such as the filename of the icon. The icon
+ * can then be rendered into a pixbuf using
+ * gtk_icon_info_load_icon(). (gtk_icon_theme_load_icon()
+ * combines these two steps if all you need is the pixbuf.)
+ *
+ * Return value: a #GtkIconInfo structure containing information
+ * about the icon, or %NULL if the icon wasn't found. Free with
+ * gtk_icon_info_free()
+ *
+ * Since: 2.4
+ */
+GtkIconInfo *
+gtk_icon_theme_lookup_icon (GtkIconTheme *icon_theme,
+ const gchar *icon_name,
+ gint size,
+ GtkIconLookupFlags flags)
+{
+ GtkIconInfo *info;
+
+ g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
+ g_return_val_if_fail (icon_name != NULL, NULL);
+ g_return_val_if_fail ((flags & GTK_ICON_LOOKUP_NO_SVG) == 0 ||
+ (flags & GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+
+ GTK_NOTE (ICONTHEME,
+ g_print ("gtk_icon_theme_lookup_icon %s\n", icon_name));
+
+ if (flags & GTK_ICON_LOOKUP_GENERIC_FALLBACK)
+ {
+ gchar **names;
+ gint dashes, i;
+ gchar *p;
+
+ dashes = 0;
+ for (p = icon_name; *p; p++)
+ if (*p == '-')
+ dashes++;
+
+ names = g_new (gchar *, dashes + 2);
+ names[0] = g_strdup (icon_name);
+ for (i = 1; i <= dashes; i++)
+ {
+ names[i] = g_strdup (names[i - 1]);
+ p = strrchr (names[i], '-');
+ *p = '\0';
+ }
+ names[dashes + 1] = NULL;
+
+ info = choose_icon (icon_theme, names, size, flags);
+
+ g_strfreev (names);
+ }
+ else
+ {
+ gchar *names[2];
+
+ names[0] = icon_name;
+ names[1] = NULL;
+
+ info = choose_icon (icon_theme, names, size, flags);
+ }
+
+ return info;
+}
+
+/**
+ * gtk_icon_theme_choose_icon:
+ * @icon_theme: a #GtkIconTheme
+ * @icon_names: %NULL-terminated array of icon names to lookup
+ * @size: desired icon size
+ * @flags: flags modifying the behavior of the icon lookup
+ *
+ * Looks up a named icon and returns a structure containing
+ * information such as the filename of the icon. The icon
+ * can then be rendered into a pixbuf using
+ * gtk_icon_info_load_icon(). (gtk_icon_theme_load_icon()
+ * combines these two steps if all you need is the pixbuf.)
+ *
+ * If @icon_names contains more than one name, this function
+ * tries them all in the given order before falling back to
+ * inherited icon themes.
+ *
+ * Return value: a #GtkIconInfo structure containing information
+ * about the icon, or %NULL if the icon wasn't found. Free with
+ * gtk_icon_info_free()
+ *
+ * Since: 2.12
+ */
+GtkIconInfo *
+gtk_icon_theme_choose_icon (GtkIconTheme *icon_theme,
+ const gchar *icon_names[],
+ gint size,
+ GtkIconLookupFlags flags)
+{
+ g_return_val_if_fail (GTK_IS_ICON_THEME (icon_theme), NULL);
+ g_return_val_if_fail (icon_names != NULL, NULL);
+ g_return_val_if_fail ((flags & GTK_ICON_LOOKUP_NO_SVG) == 0 ||
+ (flags & GTK_ICON_LOOKUP_FORCE_SVG) == 0, NULL);
+
+ return choose_icon (icon_theme, icon_names, size, flags);
+}
+
/* Error quark */
GQuark
gtk_icon_theme_error_quark (void)
diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h
index cef75e712..6b62bc51f 100644
--- a/gtk/gtkicontheme.h
+++ b/gtk/gtkicontheme.h
@@ -67,7 +67,8 @@ struct _GtkIconThemeClass
* as well as files. For a builtin icon, gtk_icon_info_get_filename()
* returns %NULL and you need to call gtk_icon_info_get_builtin_pixbuf().
* @GTK_ICON_LOOKUP_GENERIC_FALLBACK: Try to shorten icon name at '-'
- * characters before looking at inherited themes.
+ * characters before looking at inherited themes. For more general
+ * fallback, see gtk_icon_theme_choose_icon(). Since 2.12.
*
* Used to specify options for gtk_icon_theme_lookup_icon()
**/
@@ -134,6 +135,10 @@ GtkIconInfo * gtk_icon_theme_lookup_icon (GtkIconTheme
const gchar *icon_name,
gint size,
GtkIconLookupFlags flags);
+GtkIconInfo * gtk_icon_theme_choose_icon (GtkIconTheme *icon_theme,
+ const gchar *icon_names[],
+ gint size,
+ GtkIconLookupFlags flags);
GdkPixbuf * gtk_icon_theme_load_icon (GtkIconTheme *icon_theme,
const gchar *icon_name,
gint size,