Applied first two patches from bug 351521

2006-08-21  Thomas Wood  <thos@gnome.org>

        * gnome-theme-manager.c: (queue_pixbuf_generation),
        (pixbuf_idle_func), (load_meta_themes): Applied first two patches from bug 351521
This commit is contained in:
Thomas Wood 2006-08-21 22:13:51 +00:00 committed by Thomas Wood
parent 0630f59b94
commit 55a7bb8a47
2 changed files with 75 additions and 55 deletions

View file

@ -1,3 +1,8 @@
2006-08-21 Thomas Wood <thos@gnome.org>
* gnome-theme-manager.c: (queue_pixbuf_generation),
(pixbuf_idle_func), (load_meta_themes): Applied first two patches from bug 351521
2006-07-27 Rob Bradford <robster@debian.org> 2006-07-27 Rob Bradford <robster@debian.org>
Fixes #346041 Fixes #346041

View file

@ -25,8 +25,6 @@
#include <gnome-theme-apply.h> #include <gnome-theme-apply.h>
#define MAX_ELEMENTS_BEFORE_SCROLLING 3
/* Events: There are two types of change events we worry about. The first is /* Events: There are two types of change events we worry about. The first is
* when the theme settings change. In this case, we can quickly update the UI * when the theme settings change. In this case, we can quickly update the UI
* to reflect. The other is when the themes themselves change. * to reflect. The other is when the themes themselves change.
@ -164,48 +162,25 @@ pixbuf_async_data_free (gpointer data)
g_free (pixbuf_async_data); g_free (pixbuf_async_data);
} }
/* Checks if the preview pixbuf for iter needs to be generated and if so, it
* queues the generation.
* Returns: TRUE if the generation was queued, FALSE otherwise.
*/
static gboolean static gboolean
pixbuf_idle_func (gpointer data) queue_pixbuf_generation (GtkTreeModel *model, GtkTreeIter *iter)
{
GladeXML *dialog;
GtkWidget *tree_view;
GtkTreeModel *model;
GtkTreeIter iter;
gboolean valid;
pixbuf_idle_id = 0;
if (reload_themes) {
GladeXML *dialog;
reload_themes = FALSE;
loading_themes = FALSE;
dialog = gnome_theme_manager_get_theme_dialog ();
update_themes_from_disk (dialog);
return FALSE;
}
dialog = gnome_theme_manager_get_theme_dialog ();
tree_view = WID ("meta_theme_treeview");
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
for (valid = gtk_tree_model_get_iter_first (model, &iter);
valid;
valid = gtk_tree_model_iter_next (model, &iter))
{ {
GdkPixbuf *pixbuf = NULL; GdkPixbuf *pixbuf = NULL;
gchar *theme_id = NULL; gchar *theme_id = NULL;
gtk_tree_model_get (model, &iter,
META_THEME_PIXBUF_COLUMN, &pixbuf,
-1);
if (pixbuf == default_image)
{
PixbufAsyncData *pixbuf_async_data; PixbufAsyncData *pixbuf_async_data;
GnomeThemeMetaInfo *meta_theme_info; GnomeThemeMetaInfo *meta_theme_info;
gtk_tree_model_get (model, &iter, gtk_tree_model_get (model, iter,
META_THEME_PIXBUF_COLUMN, &pixbuf,
-1);
if (pixbuf != default_image)
return FALSE;
gtk_tree_model_get (model, iter,
META_THEME_ID_COLUMN, &theme_id, META_THEME_ID_COLUMN, &theme_id,
-1); -1);
if (theme_id == NULL) if (theme_id == NULL)
@ -230,8 +205,61 @@ pixbuf_idle_func (gpointer data)
pixbuf_async_data, pixbuf_async_data,
pixbuf_async_data_free); pixbuf_async_data_free);
return TRUE;
}
static gboolean
pixbuf_idle_func (gpointer data)
{
GladeXML *dialog;
GtkWidget *tree_view;
GtkTreeModel *model;
GtkTreeIter iter;
GtkTreePath *path, *end;
gboolean valid;
pixbuf_idle_id = 0;
if (reload_themes) {
GladeXML *dialog;
reload_themes = FALSE;
loading_themes = FALSE;
dialog = gnome_theme_manager_get_theme_dialog ();
update_themes_from_disk (dialog);
return FALSE; return FALSE;
} }
dialog = gnome_theme_manager_get_theme_dialog ();
tree_view = WID ("meta_theme_treeview");
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
/* first, try to load previews for themes that are currently visible */
if (gtk_tree_view_get_visible_range (GTK_TREE_VIEW (tree_view), &path, &end))
{
for (; gtk_tree_path_compare (path, end) <= 0; gtk_tree_path_next (path))
{
if (!gtk_tree_model_get_iter (model, &iter, path))
break;
if (queue_pixbuf_generation (model, &iter))
{
gtk_tree_path_free (path);
gtk_tree_path_free (end);
return FALSE;
}
}
gtk_tree_path_free (path);
gtk_tree_path_free (end);
}
/* if all visible previews have been loaded, try to load the rest */
for (valid = gtk_tree_model_get_iter_first (model, &iter);
valid;
valid = gtk_tree_model_iter_next (model, &iter))
{
if (queue_pixbuf_generation (model, &iter))
return FALSE;
} }
/* If we're done loading all the main themes, lets initialize the details /* If we're done loading all the main themes, lets initialize the details
@ -359,7 +387,7 @@ load_meta_themes (GtkTreeView *tree_view,
} }
} }
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow), gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
GTK_POLICY_NEVER, GTK_POLICY_NEVER); GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
gtk_widget_set_usize (swindow, -1, -1); gtk_widget_set_usize (swindow, -1, -1);
/* Sort meta_theme_list to be in the same order of the current data. This way /* Sort meta_theme_list to be in the same order of the current data. This way
@ -469,16 +497,8 @@ load_meta_themes (GtkTreeView *tree_view,
blurb = g_markup_printf_escaped ("<span size=\"larger\" weight=\"bold\">%s</span>\n%s", blurb = g_markup_printf_escaped ("<span size=\"larger\" weight=\"bold\">%s</span>\n%s",
list_meta_theme_info->readable_name, list_meta_theme_info->comment); list_meta_theme_info->readable_name, list_meta_theme_info->comment);
if (i <= MAX_ELEMENTS_BEFORE_SCROLLING) {
pixbuf = generate_theme_thumbnail (list_meta_theme_info, FALSE);
if (pixbuf == NULL)
pixbuf = broken_image;
} else {
pixbuf = default_image;
}
gtk_list_store_set (GTK_LIST_STORE (model), &iter_to_set, gtk_list_store_set (GTK_LIST_STORE (model), &iter_to_set,
META_THEME_PIXBUF_COLUMN, pixbuf, META_THEME_PIXBUF_COLUMN, default_image,
META_THEME_NAME_COLUMN, blurb, META_THEME_NAME_COLUMN, blurb,
META_THEME_ID_COLUMN, list_meta_theme_info->name, META_THEME_ID_COLUMN, list_meta_theme_info->name,
META_THEME_FLAG_COLUMN, list_is_default ? THEME_FLAG_DEFAULT : 0, META_THEME_FLAG_COLUMN, list_is_default ? THEME_FLAG_DEFAULT : 0,
@ -488,11 +508,6 @@ load_meta_themes (GtkTreeView *tree_view,
list = list->next; list = list->next;
i++; i++;
} }
if (i == MAX_ELEMENTS_BEFORE_SCROLLING)
{
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
}
} }
add_pixbuf_idle (); add_pixbuf_idle ();