listen to on-disk theme changes in the details tabs, too
2007-06-23 Jens Granseuer <jensgr@gmx.net> * appearance-style.c: (add_to_treeview), (remove_from_treeview), (update_in_treeview), (changed_on_disk_cb), (style_init): * appearance-themes.c: (theme_select_name), (theme_set_custom_from_theme), (theme_changed_on_disk_cb), (theme_thumbnail_done_cb): * theme-installer.c: (gnome_theme_installer_run): * theme-util.c: (theme_find_in_model): * theme-util.h: listen to on-disk theme changes in the details tabs, too svn path=/trunk/; revision=7762
This commit is contained in:
parent
6b8520facc
commit
68466d1c27
6 changed files with 180 additions and 37 deletions
|
@ -1,3 +1,14 @@
|
||||||
|
2007-06-23 Jens Granseuer <jensgr@gmx.net>
|
||||||
|
|
||||||
|
* appearance-style.c: (add_to_treeview), (remove_from_treeview),
|
||||||
|
(update_in_treeview), (changed_on_disk_cb), (style_init):
|
||||||
|
* appearance-themes.c: (theme_select_name),
|
||||||
|
(theme_set_custom_from_theme), (theme_changed_on_disk_cb),
|
||||||
|
(theme_thumbnail_done_cb):
|
||||||
|
* theme-installer.c: (gnome_theme_installer_run):
|
||||||
|
* theme-util.c: (theme_find_in_model):
|
||||||
|
* theme-util.h: listen to on-disk theme changes in the details tabs, too
|
||||||
|
|
||||||
2007-06-22 Jens Granseuer <jensgr@gmx.net>
|
2007-06-22 Jens Granseuer <jensgr@gmx.net>
|
||||||
|
|
||||||
* appearance-style.c: (gtk_theme_changed), (window_theme_changed),
|
* appearance-style.c: (gtk_theme_changed), (window_theme_changed),
|
||||||
|
|
|
@ -168,6 +168,134 @@ icon_theme_delete_cb (GtkWidget *button, AppearanceData *data)
|
||||||
generic_theme_delete ("icon_themes_list", THEME_TYPE_ICON, data);
|
generic_theme_delete ("icon_themes_list", THEME_TYPE_ICON, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
add_to_treeview (const gchar *tv_name,
|
||||||
|
const gchar *theme_name,
|
||||||
|
const gchar *theme_label,
|
||||||
|
GdkPixbuf *theme_thumbnail,
|
||||||
|
AppearanceData *data)
|
||||||
|
{
|
||||||
|
GtkTreeView *treeview;
|
||||||
|
GtkListStore *model;
|
||||||
|
|
||||||
|
treeview = GTK_TREE_VIEW (glade_xml_get_widget (data->xml, tv_name));
|
||||||
|
model = GTK_LIST_STORE (
|
||||||
|
gtk_tree_model_sort_get_model (
|
||||||
|
GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (treeview))));
|
||||||
|
|
||||||
|
gtk_list_store_insert_with_values (model, NULL, 0,
|
||||||
|
COL_LABEL, theme_label,
|
||||||
|
COL_NAME, theme_name,
|
||||||
|
COL_THUMBNAIL, theme_thumbnail,
|
||||||
|
-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
remove_from_treeview (const gchar *tv_name,
|
||||||
|
const gchar *theme_name,
|
||||||
|
AppearanceData *data)
|
||||||
|
{
|
||||||
|
GtkTreeView *treeview;
|
||||||
|
GtkListStore *model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
treeview = GTK_TREE_VIEW (glade_xml_get_widget (data->xml, tv_name));
|
||||||
|
model = GTK_LIST_STORE (
|
||||||
|
gtk_tree_model_sort_get_model (
|
||||||
|
GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (treeview))));
|
||||||
|
|
||||||
|
if (theme_find_in_model (GTK_TREE_MODEL (model), theme_name, &iter))
|
||||||
|
gtk_list_store_remove (model, &iter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_in_treeview (const gchar *tv_name,
|
||||||
|
const gchar *theme_name,
|
||||||
|
const gchar *theme_label,
|
||||||
|
GdkPixbuf *theme_thumbnail,
|
||||||
|
AppearanceData *data)
|
||||||
|
{
|
||||||
|
GtkTreeView *treeview;
|
||||||
|
GtkListStore *model;
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
treeview = GTK_TREE_VIEW (glade_xml_get_widget (data->xml, tv_name));
|
||||||
|
model = GTK_LIST_STORE (
|
||||||
|
gtk_tree_model_sort_get_model (
|
||||||
|
GTK_TREE_MODEL_SORT (gtk_tree_view_get_model (treeview))));
|
||||||
|
|
||||||
|
if (theme_find_in_model (GTK_TREE_MODEL (model), theme_name, &iter)) {
|
||||||
|
gtk_list_store_set (model, &iter,
|
||||||
|
COL_LABEL, theme_label,
|
||||||
|
COL_NAME, theme_name,
|
||||||
|
COL_THUMBNAIL, theme_thumbnail,
|
||||||
|
-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
changed_on_disk_cb (GnomeThemeType type,
|
||||||
|
gpointer theme,
|
||||||
|
GnomeThemeChangeType change_type,
|
||||||
|
GnomeThemeElement element,
|
||||||
|
AppearanceData *data)
|
||||||
|
{
|
||||||
|
if (type == GNOME_THEME_TYPE_REGULAR) {
|
||||||
|
GnomeThemeInfo *info = theme;
|
||||||
|
|
||||||
|
if (change_type == GNOME_THEME_CHANGE_DELETED) {
|
||||||
|
if (info->has_gtk)
|
||||||
|
remove_from_treeview ("gtk_themes_list", info->name, data);
|
||||||
|
if (info->has_metacity)
|
||||||
|
remove_from_treeview ("metacity_themes_list", info->name, data);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
GdkPixbuf *thumbnail;
|
||||||
|
|
||||||
|
if (info->has_gtk) {
|
||||||
|
thumbnail = generate_gtk_theme_thumbnail (info);
|
||||||
|
|
||||||
|
if (change_type == GNOME_THEME_CHANGE_CREATED)
|
||||||
|
add_to_treeview ("gtk_themes_list", info->name, info->name, thumbnail, data);
|
||||||
|
else if (change_type == GNOME_THEME_CHANGE_CHANGED)
|
||||||
|
update_in_treeview ("gtk_themes_list", info->name, info->name, thumbnail, data);
|
||||||
|
|
||||||
|
if (thumbnail)
|
||||||
|
g_object_unref (thumbnail);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->has_metacity) {
|
||||||
|
thumbnail = generate_metacity_theme_thumbnail (info);
|
||||||
|
|
||||||
|
if (change_type == GNOME_THEME_CHANGE_CREATED)
|
||||||
|
add_to_treeview ("metacity_themes_list", info->name, info->name, thumbnail, data);
|
||||||
|
else if (change_type == GNOME_THEME_CHANGE_CHANGED)
|
||||||
|
update_in_treeview ("metacity_themes_list", info->name, info->name, thumbnail, data);
|
||||||
|
|
||||||
|
if (thumbnail)
|
||||||
|
g_object_unref (thumbnail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else if (type == GNOME_THEME_TYPE_ICON) {
|
||||||
|
GnomeThemeIconInfo *info = theme;
|
||||||
|
|
||||||
|
if (change_type == GNOME_THEME_CHANGE_DELETED) {
|
||||||
|
remove_from_treeview ("icon_themes_list", info->name, data);
|
||||||
|
} else {
|
||||||
|
GdkPixbuf *thumbnail = generate_icon_theme_thumbnail (info);
|
||||||
|
|
||||||
|
if (change_type == GNOME_THEME_CHANGE_CREATED)
|
||||||
|
add_to_treeview ("icon_themes_list", info->name, info->readable_name, thumbnail, data);
|
||||||
|
else if (change_type == GNOME_THEME_CHANGE_CHANGED)
|
||||||
|
update_in_treeview ("icon_themes_list", info->name, info->readable_name, thumbnail, data);
|
||||||
|
|
||||||
|
if (thumbnail)
|
||||||
|
g_object_unref (thumbnail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
style_init (AppearanceData *data)
|
style_init (AppearanceData *data)
|
||||||
{
|
{
|
||||||
|
@ -209,6 +337,8 @@ style_init (AppearanceData *data)
|
||||||
g_signal_connect (glade_xml_get_widget (data->xml, "gtk_themes_delete"), "clicked", (GCallback) gtk_theme_delete_cb, data);
|
g_signal_connect (glade_xml_get_widget (data->xml, "gtk_themes_delete"), "clicked", (GCallback) gtk_theme_delete_cb, data);
|
||||||
g_signal_connect (glade_xml_get_widget (data->xml, "window_themes_delete"), "clicked", (GCallback) window_theme_delete_cb, data);
|
g_signal_connect (glade_xml_get_widget (data->xml, "window_themes_delete"), "clicked", (GCallback) window_theme_delete_cb, data);
|
||||||
g_signal_connect (glade_xml_get_widget (data->xml, "icon_themes_delete"), "clicked", (GCallback) icon_theme_delete_cb, data);
|
g_signal_connect (glade_xml_get_widget (data->xml, "icon_themes_delete"), "clicked", (GCallback) icon_theme_delete_cb, data);
|
||||||
|
|
||||||
|
gnome_theme_info_register_theme_change ((ThemeChangedCallback) changed_on_disk_cb, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -56,36 +56,6 @@ is_locked_down (GConfClient *client)
|
||||||
return gconf_client_get_bool (client, LOCKDOWN_KEY, NULL);
|
return gconf_client_get_bool (client, LOCKDOWN_KEY, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
find_in_model (GtkTreeModel *model, const gchar *value, gint column, GtkTreeIter *hit)
|
|
||||||
{
|
|
||||||
GtkTreeIter iter;
|
|
||||||
gboolean valid;
|
|
||||||
gchar *test;
|
|
||||||
|
|
||||||
if (!value)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
for (valid = gtk_tree_model_get_iter_first (model, &iter); valid;
|
|
||||||
valid = gtk_tree_model_iter_next (model, &iter))
|
|
||||||
{
|
|
||||||
gtk_tree_model_get (model, &iter, column, &test, -1);
|
|
||||||
|
|
||||||
if (test) {
|
|
||||||
gint cmp = strcmp (test, value);
|
|
||||||
g_free (test);
|
|
||||||
|
|
||||||
if (!cmp) {
|
|
||||||
if (hit)
|
|
||||||
*hit = iter;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
theme_load_from_gconf (GConfClient *client, GnomeThemeMetaInfo *theme)
|
theme_load_from_gconf (GConfClient *client, GnomeThemeMetaInfo *theme)
|
||||||
{
|
{
|
||||||
|
@ -192,7 +162,7 @@ theme_select_name (GtkIconView *icon_view, const gchar *theme)
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
GtkTreeModel *model = gtk_icon_view_get_model (icon_view);
|
GtkTreeModel *model = gtk_icon_view_get_model (icon_view);
|
||||||
|
|
||||||
if (find_in_model (model, theme, COL_NAME, &iter))
|
if (theme_find_in_model (model, theme, &iter))
|
||||||
theme_select_iter (icon_view, &iter);
|
theme_select_iter (icon_view, &iter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,7 +234,7 @@ theme_set_custom_from_theme (const GnomeThemeMetaInfo *info, AppearanceData *dat
|
||||||
|
|
||||||
/* select the custom theme */
|
/* select the custom theme */
|
||||||
model = gtk_icon_view_get_model (icon_view);
|
model = gtk_icon_view_get_model (icon_view);
|
||||||
if (!find_in_model (model, custom->name, COL_NAME, &iter)) {
|
if (!theme_find_in_model (model, custom->name, &iter)) {
|
||||||
GtkTreeIter child;
|
GtkTreeIter child;
|
||||||
|
|
||||||
gtk_list_store_insert_with_values (data->theme_store, &child, 0,
|
gtk_list_store_insert_with_values (data->theme_store, &child, 0,
|
||||||
|
@ -294,8 +264,6 @@ theme_changed_on_disk_cb (GnomeThemeType type,
|
||||||
GnomeThemeElement element,
|
GnomeThemeElement element,
|
||||||
AppearanceData *data)
|
AppearanceData *data)
|
||||||
{
|
{
|
||||||
/* TODO: add/change/remove themes from the model as appropriate */
|
|
||||||
|
|
||||||
if (type == GNOME_THEME_TYPE_METATHEME) {
|
if (type == GNOME_THEME_TYPE_METATHEME) {
|
||||||
GnomeThemeMetaInfo *meta = theme;
|
GnomeThemeMetaInfo *meta = theme;
|
||||||
|
|
||||||
|
@ -310,7 +278,7 @@ theme_changed_on_disk_cb (GnomeThemeType type,
|
||||||
} else if (change_type == GNOME_THEME_CHANGE_DELETED) {
|
} else if (change_type == GNOME_THEME_CHANGE_DELETED) {
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
|
||||||
if (find_in_model (GTK_TREE_MODEL (data->theme_store), meta->name, COL_NAME, &iter))
|
if (theme_find_in_model (GTK_TREE_MODEL (data->theme_store), meta->name, &iter))
|
||||||
gtk_list_store_remove (data->theme_store, &iter);
|
gtk_list_store_remove (data->theme_store, &iter);
|
||||||
|
|
||||||
} else if (change_type == GNOME_THEME_CHANGE_CHANGED) {
|
} else if (change_type == GNOME_THEME_CHANGE_CHANGED) {
|
||||||
|
@ -331,7 +299,7 @@ theme_thumbnail_done_cb (GdkPixbuf *pixbuf, AppearanceData *data)
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
GtkTreeModel *model = GTK_TREE_MODEL (data->theme_store);
|
GtkTreeModel *model = GTK_TREE_MODEL (data->theme_store);
|
||||||
|
|
||||||
if (find_in_model (model, info->name, COL_NAME, &iter))
|
if (theme_find_in_model (model, info->name, &iter))
|
||||||
gtk_list_store_set (data->theme_store, &iter, COL_THUMBNAIL, pixbuf, -1);
|
gtk_list_store_set (data->theme_store, &iter, COL_THUMBNAIL, pixbuf, -1);
|
||||||
|
|
||||||
g_object_unref (pixbuf);
|
g_object_unref (pixbuf);
|
||||||
|
|
|
@ -618,7 +618,10 @@ gnome_theme_installer_run (GtkWindow *parent, gchar *filename)
|
||||||
g_strlcpy (old_folder, folder, 255);
|
g_strlcpy (old_folder, folder, 255);
|
||||||
g_free (folder);
|
g_free (folder);
|
||||||
|
|
||||||
/* FIXME: refresh GUI from disk here */
|
/*
|
||||||
|
* we're relying on the gnome theme info module to pick up changes
|
||||||
|
* to the themes so we don't need to update the model here
|
||||||
|
*/
|
||||||
|
|
||||||
gtk_widget_destroy (dialog);
|
gtk_widget_destroy (dialog);
|
||||||
|
|
||||||
|
|
|
@ -113,3 +113,33 @@ theme_model_iter_last (GtkTreeModel *model, GtkTreeIter *iter)
|
||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
theme_find_in_model (GtkTreeModel *model, const gchar *name, GtkTreeIter *iter)
|
||||||
|
{
|
||||||
|
GtkTreeIter walk;
|
||||||
|
gboolean valid;
|
||||||
|
gchar *test;
|
||||||
|
|
||||||
|
if (!name)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
for (valid = gtk_tree_model_get_iter_first (model, &walk); valid;
|
||||||
|
valid = gtk_tree_model_iter_next (model, &walk))
|
||||||
|
{
|
||||||
|
gtk_tree_model_get (model, &walk, COL_NAME, &test, -1);
|
||||||
|
|
||||||
|
if (test) {
|
||||||
|
gint cmp = strcmp (test, name);
|
||||||
|
g_free (test);
|
||||||
|
|
||||||
|
if (!cmp) {
|
||||||
|
if (iter)
|
||||||
|
*iter = walk;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -42,3 +42,4 @@ typedef enum {
|
||||||
|
|
||||||
gboolean theme_delete (const gchar *name, ThemeType type);
|
gboolean theme_delete (const gchar *name, ThemeType type);
|
||||||
gboolean theme_model_iter_last (GtkTreeModel *model, GtkTreeIter *iter);
|
gboolean theme_model_iter_last (GtkTreeModel *model, GtkTreeIter *iter);
|
||||||
|
gboolean theme_find_in_model (GtkTreeModel *model, const gchar *name, GtkTreeIter *iter);
|
||||||
|
|
Loading…
Add table
Reference in a new issue