shell: Reload icons when icon theme changes
https://bugzilla.gnome.org/show_bug.cgi?id=639268
This commit is contained in:
parent
310b83ed86
commit
4b80e08055
1 changed files with 73 additions and 27 deletions
|
@ -29,10 +29,78 @@
|
||||||
|
|
||||||
G_DEFINE_TYPE (CcShellModel, cc_shell_model, GTK_TYPE_LIST_STORE)
|
G_DEFINE_TYPE (CcShellModel, cc_shell_model, GTK_TYPE_LIST_STORE)
|
||||||
|
|
||||||
|
static GdkPixbuf *
|
||||||
|
load_pixbuf_for_string (const char *icon)
|
||||||
|
{
|
||||||
|
GtkIconTheme *theme;
|
||||||
|
GdkPixbuf *pixbuf;
|
||||||
|
GError *err = NULL;
|
||||||
|
char *icon2 = NULL;
|
||||||
|
|
||||||
|
if (icon == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
theme = gtk_icon_theme_get_default ();
|
||||||
|
|
||||||
|
/* find the icon */
|
||||||
|
if (*icon == '/')
|
||||||
|
{
|
||||||
|
pixbuf = gdk_pixbuf_new_from_file_at_scale (icon, 32, 32, TRUE, &err);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (g_str_has_suffix (icon, ".png"))
|
||||||
|
icon2 = g_strndup (icon, strlen (icon) - strlen (".png"));
|
||||||
|
|
||||||
|
pixbuf = gtk_icon_theme_load_icon (theme,
|
||||||
|
icon2 ? icon2 : icon, 32,
|
||||||
|
GTK_ICON_LOOKUP_FORCE_SIZE,
|
||||||
|
&err);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err)
|
||||||
|
{
|
||||||
|
g_warning ("Could not load icon '%s': %s", icon2 ? icon2 : icon,
|
||||||
|
err->message);
|
||||||
|
g_error_free (err);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (icon2);
|
||||||
|
|
||||||
|
return pixbuf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
icon_theme_changed (GtkIconTheme *theme,
|
||||||
|
CcShellModel *self)
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
gboolean cont;
|
||||||
|
|
||||||
|
model = GTK_TREE_MODEL (self);
|
||||||
|
cont = gtk_tree_model_get_iter_first (model, &iter);
|
||||||
|
while (cont)
|
||||||
|
{
|
||||||
|
GdkPixbuf *pixbuf;
|
||||||
|
char *icon;
|
||||||
|
|
||||||
|
gtk_tree_model_get (model, &iter,
|
||||||
|
COL_ICON_NAME, &icon,
|
||||||
|
-1);
|
||||||
|
pixbuf = load_pixbuf_for_string (icon);
|
||||||
|
g_free (icon);
|
||||||
|
gtk_list_store_set (GTK_LIST_STORE (model), &iter,
|
||||||
|
COL_PIXBUF, pixbuf,
|
||||||
|
-1);
|
||||||
|
|
||||||
|
cont = gtk_tree_model_iter_next (model, &iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cc_shell_model_class_init (CcShellModelClass *klass)
|
cc_shell_model_class_init (CcShellModelClass *klass)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -43,6 +111,9 @@ cc_shell_model_init (CcShellModel *self)
|
||||||
|
|
||||||
gtk_list_store_set_column_types (GTK_LIST_STORE (self),
|
gtk_list_store_set_column_types (GTK_LIST_STORE (self),
|
||||||
N_COLS, types);
|
N_COLS, types);
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (gtk_icon_theme_get_default ()), "changed",
|
||||||
|
G_CALLBACK (icon_theme_changed), self);
|
||||||
}
|
}
|
||||||
|
|
||||||
CcShellModel *
|
CcShellModel *
|
||||||
|
@ -92,8 +163,6 @@ cc_shell_model_add_item (CcShellModel *model,
|
||||||
const gchar *comment = gmenu_tree_entry_get_comment (item);
|
const gchar *comment = gmenu_tree_entry_get_comment (item);
|
||||||
gchar *id;
|
gchar *id;
|
||||||
GdkPixbuf *pixbuf = NULL;
|
GdkPixbuf *pixbuf = NULL;
|
||||||
gchar *icon2 = NULL;
|
|
||||||
GError *err = NULL;
|
|
||||||
gchar *search_target;
|
gchar *search_target;
|
||||||
GKeyFile *key_file;
|
GKeyFile *key_file;
|
||||||
gchar **keywords;
|
gchar **keywords;
|
||||||
|
@ -130,30 +199,7 @@ cc_shell_model_add_item (CcShellModel *model,
|
||||||
g_key_file_free (key_file);
|
g_key_file_free (key_file);
|
||||||
key_file = NULL;
|
key_file = NULL;
|
||||||
|
|
||||||
/* find the icon */
|
pixbuf = load_pixbuf_for_string (icon);
|
||||||
if (icon != NULL && *icon == '/')
|
|
||||||
{
|
|
||||||
pixbuf = gdk_pixbuf_new_from_file_at_scale (icon, 32, 32, TRUE, &err);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (icon2 == NULL && icon != NULL && g_str_has_suffix (icon, ".png"))
|
|
||||||
icon2 = g_strndup (icon, strlen (icon) - strlen (".png"));
|
|
||||||
|
|
||||||
pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
|
|
||||||
icon2 ? icon2 : icon, 32,
|
|
||||||
GTK_ICON_LOOKUP_FORCE_SIZE,
|
|
||||||
&err);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
{
|
|
||||||
g_warning ("Could not load icon '%s': %s", icon2 ? icon2 : icon,
|
|
||||||
err->message);
|
|
||||||
g_error_free (err);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_free (icon2);
|
|
||||||
|
|
||||||
search_target = g_strconcat (name, " - ", comment, NULL);
|
search_target = g_strconcat (name, " - ", comment, NULL);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue