Adjusted for the API changes in theme-thumbnail.c. Thumbnail requestes are

2007-06-25  Denis Washington  <denisw@svn.gnome.org>

	* 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
This commit is contained in:
Denis Washington 2007-06-25 15:22:45 +00:00 committed by Denis Washington
parent 443068f132
commit 304ee0d357
4 changed files with 89 additions and 47 deletions

View file

@ -1,3 +1,17 @@
2007-06-25 Denis Washington <denisw@svn.gnome.org>
* 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 <jensgr@gmx.net>
* Makefile.am:

View file

@ -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");

View file

@ -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);

View file

@ -53,7 +53,6 @@ typedef struct {
/* themes */
GtkListStore *theme_store;
GSList *theme_queue;
GnomeThemeMetaInfo *theme_custom;
GdkPixbuf *theme_icon;
GtkWidget *theme_save_dialog;