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:
parent
0630f59b94
commit
55a7bb8a47
2 changed files with 75 additions and 55 deletions
|
@ -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
|
||||||
|
|
|
@ -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,6 +162,52 @@ 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
|
||||||
|
queue_pixbuf_generation (GtkTreeModel *model, GtkTreeIter *iter)
|
||||||
|
{
|
||||||
|
GdkPixbuf *pixbuf = NULL;
|
||||||
|
gchar *theme_id = NULL;
|
||||||
|
PixbufAsyncData *pixbuf_async_data;
|
||||||
|
GnomeThemeMetaInfo *meta_theme_info;
|
||||||
|
|
||||||
|
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,
|
||||||
|
-1);
|
||||||
|
if (theme_id == NULL)
|
||||||
|
{
|
||||||
|
meta_theme_info = &custom_meta_theme_info;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_theme_info = gnome_theme_meta_info_find (theme_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We should always have a metatheme file */
|
||||||
|
g_assert (meta_theme_info);
|
||||||
|
|
||||||
|
pixbuf_async_data = g_new (PixbufAsyncData, 1);
|
||||||
|
pixbuf_async_data->theme_id = theme_id;
|
||||||
|
pixbuf_async_data->model = model;
|
||||||
|
pixbuf_async_data->cancelled = FALSE;
|
||||||
|
g_object_ref (model);
|
||||||
|
generate_theme_thumbnail_async (meta_theme_info,
|
||||||
|
pixbuf_async_func,
|
||||||
|
pixbuf_async_data,
|
||||||
|
pixbuf_async_data_free);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
pixbuf_idle_func (gpointer data)
|
pixbuf_idle_func (gpointer data)
|
||||||
{
|
{
|
||||||
|
@ -171,6 +215,7 @@ pixbuf_idle_func (gpointer data)
|
||||||
GtkWidget *tree_view;
|
GtkWidget *tree_view;
|
||||||
GtkTreeModel *model;
|
GtkTreeModel *model;
|
||||||
GtkTreeIter iter;
|
GtkTreeIter iter;
|
||||||
|
GtkTreePath *path, *end;
|
||||||
gboolean valid;
|
gboolean valid;
|
||||||
|
|
||||||
pixbuf_idle_id = 0;
|
pixbuf_idle_id = 0;
|
||||||
|
@ -190,48 +235,31 @@ pixbuf_idle_func (gpointer data)
|
||||||
tree_view = WID ("meta_theme_treeview");
|
tree_view = WID ("meta_theme_treeview");
|
||||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view));
|
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);
|
for (valid = gtk_tree_model_get_iter_first (model, &iter);
|
||||||
valid;
|
valid;
|
||||||
valid = gtk_tree_model_iter_next (model, &iter))
|
valid = gtk_tree_model_iter_next (model, &iter))
|
||||||
{
|
{
|
||||||
GdkPixbuf *pixbuf = NULL;
|
if (queue_pixbuf_generation (model, &iter))
|
||||||
gchar *theme_id = NULL;
|
return FALSE;
|
||||||
|
|
||||||
gtk_tree_model_get (model, &iter,
|
|
||||||
META_THEME_PIXBUF_COLUMN, &pixbuf,
|
|
||||||
-1);
|
|
||||||
if (pixbuf == default_image)
|
|
||||||
{
|
|
||||||
PixbufAsyncData *pixbuf_async_data;
|
|
||||||
GnomeThemeMetaInfo *meta_theme_info;
|
|
||||||
|
|
||||||
gtk_tree_model_get (model, &iter,
|
|
||||||
META_THEME_ID_COLUMN, &theme_id,
|
|
||||||
-1);
|
|
||||||
if (theme_id == NULL)
|
|
||||||
{
|
|
||||||
meta_theme_info = &custom_meta_theme_info;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meta_theme_info = gnome_theme_meta_info_find (theme_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We should always have a metatheme file */
|
|
||||||
g_assert (meta_theme_info);
|
|
||||||
|
|
||||||
pixbuf_async_data = g_new (PixbufAsyncData, 1);
|
|
||||||
pixbuf_async_data->theme_id = theme_id;
|
|
||||||
pixbuf_async_data->model = model;
|
|
||||||
pixbuf_async_data->cancelled = FALSE;
|
|
||||||
g_object_ref (model);
|
|
||||||
generate_theme_thumbnail_async (meta_theme_info,
|
|
||||||
pixbuf_async_func,
|
|
||||||
pixbuf_async_data,
|
|
||||||
pixbuf_async_data_free);
|
|
||||||
|
|
||||||
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 ();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue