From 304ee0d357b09420c71a0fa42e049a41e69428a0 Mon Sep 17 00:00:00 2001 From: Denis Washington Date: Mon, 25 Jun 2007 15:22:45 +0000 Subject: [PATCH] Adjusted for the API changes in theme-thumbnail.c. Thumbnail requestes are 2007-06-25 Denis Washington * appearance-themes.c: Adjusted for the API changes in theme-thumbnail.c. Thumbnail requestes are now directly queued by generate_*_async(), so do not maintain an own queue anymore. * appearance-style.c: Use the new asynchronous thumbnail generation functions, and replace all occurrences of "metacity_themes_list" with the correct "window_themes_list". * appearance.h: Remove "theme_queue", it is not needed anymore. svn path=/trunk/; revision=7776 --- capplets/appearance/ChangeLog | 14 +++++ capplets/appearance/appearance-style.c | 69 ++++++++++++++++++++++--- capplets/appearance/appearance-themes.c | 52 +++++-------------- capplets/appearance/appearance.h | 1 - 4 files changed, 89 insertions(+), 47 deletions(-) diff --git a/capplets/appearance/ChangeLog b/capplets/appearance/ChangeLog index 2a161445b..6838e82f7 100644 --- a/capplets/appearance/ChangeLog +++ b/capplets/appearance/ChangeLog @@ -1,3 +1,17 @@ +2007-06-25 Denis Washington + + * appearance-themes.c: + Adjusted for the API changes in theme-thumbnail.c. Thumbnail requestes are + now directly queued by generate_*_async(), so do not maintain an own queue + anymore. + + * appearance-style.c: + Use the new asynchronous thumbnail generation functions, and replace all + occurrences of "metacity_themes_list" with the correct "window_themes_list". + + * appearance.h: + Remove "theme_queue", it is not needed anymore. + 2007-06-24 Jens Granseuer * Makefile.am: diff --git a/capplets/appearance/appearance-style.c b/capplets/appearance/appearance-style.c index c9774aa7e..70677ee5f 100644 --- a/capplets/appearance/appearance-style.c +++ b/capplets/appearance/appearance-style.c @@ -494,6 +494,28 @@ update_in_treeview (const gchar *tv_name, } } +static void +update_thumbnail_in_treeview (const gchar *tv_name, + const gchar *theme_name, + 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_THUMBNAIL, theme_thumbnail, + -1); + } +} + static void changed_on_disk_cb (GnomeThemeType type, gpointer theme, @@ -508,7 +530,7 @@ changed_on_disk_cb (GnomeThemeType type, 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); + remove_from_treeview ("window_themes_list", info->name, data); } else { GdkPixbuf *thumbnail; @@ -529,9 +551,9 @@ changed_on_disk_cb (GnomeThemeType type, 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); + add_to_treeview ("window_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); + update_in_treeview ("window_themes_list", info->name, info->name, thumbnail, data); if (thumbnail) g_object_unref (thumbnail); @@ -557,6 +579,30 @@ changed_on_disk_cb (GnomeThemeType type, } } +static void +gtk_theme_thumbnail_cb (GdkPixbuf *pixbuf, + gchar *theme_name, + AppearanceData *data) +{ + update_thumbnail_in_treeview ("gtk_themes_list", theme_name, pixbuf, data); +} + +static void +metacity_theme_thumbnail_cb (GdkPixbuf *pixbuf, + gchar *theme_name, + AppearanceData *data) +{ + update_thumbnail_in_treeview ("window_themes_list", theme_name, pixbuf, data); +} + +static void +icon_theme_thumbnail_cb (GdkPixbuf *pixbuf, + gchar *theme_name, + AppearanceData *data) +{ + update_thumbnail_in_treeview ("icon_themes_list", theme_name, pixbuf, data); +} + static void prepare_list (AppearanceData *data, GtkWidget *list, ThemeType type, GCallback callback) { @@ -617,15 +663,24 @@ prepare_list (AppearanceData *data, GtkWidget *list, ThemeType type, GCallback c switch (type) { case THEME_TYPE_GTK: - thumbnail = generate_gtk_theme_thumbnail ((GnomeThemeInfo *) l->data); + generate_gtk_theme_thumbnail_async ((GnomeThemeInfo *) l->data, + (ThemeThumbnailFunc) gtk_theme_thumbnail_cb, + data, + NULL); break; case THEME_TYPE_ICON: - thumbnail = generate_icon_theme_thumbnail ((GnomeThemeIconInfo *) l->data); + generate_icon_theme_thumbnail_async ((GnomeThemeIconInfo *) l->data, + (ThemeThumbnailFunc) icon_theme_thumbnail_cb, + data, + NULL); break; case THEME_TYPE_WINDOW: - thumbnail = generate_metacity_theme_thumbnail ((GnomeThemeInfo *) l->data); + generate_metacity_theme_thumbnail_async ((GnomeThemeInfo *) l->data, + (ThemeThumbnailFunc) metacity_theme_thumbnail_cb, + data, + NULL); break; default: @@ -686,8 +741,8 @@ style_init (AppearanceData *data) g_signal_connect (w, "response", (GCallback) style_response_cb, NULL); g_signal_connect (w, "delete_event", (GCallback) gtk_true, NULL); - prepare_list (data, glade_xml_get_widget (data->xml, "gtk_themes_list"), THEME_TYPE_GTK, (GCallback) gtk_theme_changed); prepare_list (data, glade_xml_get_widget (data->xml, "window_themes_list"), THEME_TYPE_WINDOW, (GCallback) window_theme_changed); + prepare_list (data, glade_xml_get_widget (data->xml, "gtk_themes_list"), THEME_TYPE_GTK, (GCallback) gtk_theme_changed); prepare_list (data, glade_xml_get_widget (data->xml, "icon_themes_list"), THEME_TYPE_ICON, (GCallback) icon_theme_changed); w = glade_xml_get_widget (data->xml, "color_scheme_message_hbox"); diff --git a/capplets/appearance/appearance-themes.c b/capplets/appearance/appearance-themes.c index 5256766b6..87c05fa0b 100644 --- a/capplets/appearance/appearance-themes.c +++ b/capplets/appearance/appearance-themes.c @@ -30,7 +30,7 @@ #define CUSTOM_THEME_NAME "__custom__" -static void theme_thumbnail_done_cb (GdkPixbuf *pixbuf, AppearanceData *data); +static void theme_thumbnail_done_cb (GdkPixbuf *pixbuf, gchar *theme_name, AppearanceData *data); static gchar * get_default_string_from_key (GConfClient *client, const char *key) @@ -86,23 +86,11 @@ theme_load_from_gconf (GConfClient *client, GnomeThemeMetaInfo *theme) } } -static gboolean -theme_thumbnail_generate (AppearanceData *data) -{ - generate_theme_thumbnail_async (data->theme_queue->data, - (ThemeThumbnailFunc) theme_thumbnail_done_cb, data, NULL); - return FALSE; -} - static void -theme_queue_for_thumbnail (GnomeThemeMetaInfo *theme, AppearanceData *data) +theme_thumbnail_generate (GnomeThemeMetaInfo *info, AppearanceData *data) { - gboolean idle = (data->theme_queue == NULL); - - data->theme_queue = g_slist_append (data->theme_queue, theme); - - if (idle) - theme_thumbnail_generate (data); + generate_meta_theme_thumbnail_async (info, + (ThemeThumbnailFunc) theme_thumbnail_done_cb, data, NULL); } static gchar * @@ -252,7 +240,7 @@ theme_set_custom_from_theme (const GnomeThemeMetaInfo *info, AppearanceData *dat gtk_tree_path_free (path); /* update the theme thumbnail */ - theme_queue_for_thumbnail (custom, data); + theme_thumbnail_generate (custom, data); } /** Theme Callbacks **/ @@ -273,7 +261,7 @@ theme_changed_on_disk_cb (GnomeThemeType type, COL_NAME, meta->name, COL_THUMBNAIL, data->theme_icon, -1); - theme_queue_for_thumbnail (meta, data); + theme_thumbnail_generate (meta, data); } else if (change_type == GNOME_THEME_CHANGE_DELETED) { GtkTreeIter iter; @@ -282,35 +270,24 @@ theme_changed_on_disk_cb (GnomeThemeType type, gtk_list_store_remove (data->theme_store, &iter); } else if (change_type == GNOME_THEME_CHANGE_CHANGED) { - theme_queue_for_thumbnail (meta, data); + theme_thumbnail_generate (meta, data); } } } static void -theme_thumbnail_done_cb (GdkPixbuf *pixbuf, AppearanceData *data) +theme_thumbnail_done_cb (GdkPixbuf *pixbuf, gchar *theme_name, AppearanceData *data) { - GnomeThemeMetaInfo *info = data->theme_queue->data; - - g_return_if_fail (info != NULL); - /* find item in model and update thumbnail */ if (pixbuf) { GtkTreeIter iter; GtkTreeModel *model = GTK_TREE_MODEL (data->theme_store); - if (theme_find_in_model (model, info->name, &iter)) + if (theme_find_in_model (model, theme_name, &iter)) gtk_list_store_set (data->theme_store, &iter, COL_THUMBNAIL, pixbuf, -1); g_object_unref (pixbuf); } - - data->theme_queue = g_slist_remove (data->theme_queue, info); - - if (data->theme_queue) - /* we can't call theme_thumbnail_generate directly since the thumbnail - * factory hasn't yet cleaned up at this point */ - g_idle_add ((GSourceFunc) theme_thumbnail_generate, data); } /** GUI Callbacks **/ @@ -503,7 +480,6 @@ themes_init (AppearanceData *data) gnome_theme_init (NULL); gnome_wm_manager_init (); - data->theme_queue = NULL; data->theme_save_dialog = NULL; data->theme_custom = gnome_theme_meta_info_new (); data->theme_icon = gdk_pixbuf_new_from_file (GNOMECC_PIXMAP_DIR "/theme-thumbnailing.png", NULL); @@ -524,14 +500,14 @@ themes_init (AppearanceData *data) for (l = theme_list; l; l = l->next) { GnomeThemeMetaInfo *info = l->data; - data->theme_queue = g_slist_prepend (data->theme_queue, info); - gtk_list_store_insert_with_values (theme_store, NULL, 0, COL_LABEL, info->readable_name, COL_NAME, info->name, COL_THUMBNAIL, data->theme_icon, -1); + theme_thumbnail_generate (info, data); + if (!meta_theme && theme_is_equal (data->theme_custom, info)) meta_theme = info; } @@ -540,13 +516,14 @@ themes_init (AppearanceData *data) if (!meta_theme) { /* add custom theme */ meta_theme = data->theme_custom; - data->theme_queue = g_slist_prepend (data->theme_queue, meta_theme); gtk_list_store_insert_with_values (theme_store, NULL, 0, COL_LABEL, meta_theme->readable_name, COL_NAME, meta_theme->name, COL_THUMBNAIL, data->theme_icon, -1); + + theme_thumbnail_generate (meta_theme, data); } w = glade_xml_get_widget (data->xml, "theme_list"); @@ -571,15 +548,12 @@ themes_init (AppearanceData *data) if (is_locked_down (data->client)) { /* FIXME: determine what needs disabling */ } - - theme_thumbnail_generate (data); } void themes_shutdown (AppearanceData *data) { gnome_theme_meta_info_free (data->theme_custom); - g_slist_free (data->theme_queue); if (data->theme_icon) g_object_unref (data->theme_icon); diff --git a/capplets/appearance/appearance.h b/capplets/appearance/appearance.h index e8eac63c8..32572ffca 100644 --- a/capplets/appearance/appearance.h +++ b/capplets/appearance/appearance.h @@ -53,7 +53,6 @@ typedef struct { /* themes */ GtkListStore *theme_store; - GSList *theme_queue; GnomeThemeMetaInfo *theme_custom; GdkPixbuf *theme_icon; GtkWidget *theme_save_dialog;