Return a GList of ThemeEntry*, and remove extraneous number argument.

2001-09-29  Richard Hestilow  <hestilow@ximian.com>

	* lister.c: (list_themes, list_system_themes, list_user_themes):
	Return a GList of ThemeEntry*, and remove extraneous number argument.
	Also, use g_strdup_printf instead of g_snprintf.

	* da.h (ThemeEntry): Add a "row" data member.
	* gui.c: Change variables current_theme, current_global_theme,
	initial_theme, and last_theme to ThemeEntry*.
	(make_main): Change GtkList to a GtkCList to avoid scrolling bug.
	(click_entry): Changed to "select_row" callback prototype.
	(delete_entry): Removed.
	(item_destroy_notify): Added in lieu of delete_entry.
	(sort_alpha): Accept ThemeEntry* and not GtkBin*.
	(add_theme_list): Added.
	(update_theme_entries): Use clist functions.
This commit is contained in:
Richard Hestilow 2001-09-29 20:45:12 +00:00 committed by Rachel Hestilow
parent 2c96d642fb
commit bcf570c7bd
7 changed files with 255 additions and 280 deletions

View file

@ -1,3 +1,20 @@
2001-09-29 Richard Hestilow <hestilow@ximian.com>
* lister.c: (list_themes, list_system_themes, list_user_themes):
Return a GList of ThemeEntry*, and remove extraneous number argument.
Also, use g_strdup_printf instead of g_snprintf.
* da.h (ThemeEntry): Add a "row" data member.
* gui.c: Change variables current_theme, current_global_theme,
initial_theme, and last_theme to ThemeEntry*.
(make_main): Change GtkList to a GtkCList to avoid scrolling bug.
(click_entry): Changed to "select_row" callback prototype.
(delete_entry): Removed.
(item_destroy_notify): Added in lieu of delete_entry.
(sort_alpha): Accept ThemeEntry* and not GtkBin*.
(add_theme_list): Added.
(update_theme_entries): Use clist functions.
2001-07-27 Bradford Hovinen <hovinen@ximian.com>
* RELEASE : 1.5.2

View file

@ -16,6 +16,7 @@ typedef struct _theme_entry
gchar *dir;
gchar *readme;
gchar *icon;
int row;
} ThemeEntry;
void md(char *s);
@ -50,12 +51,12 @@ void mkdirs(char *s);
void
free_theme_list(ThemeEntry *list, gint number);
ThemeEntry *
list_themes(gchar *dir, gint *number);
ThemeEntry *
list_system_themes(gint *number);
ThemeEntry *
list_user_themes(gint *number);
GList*
list_themes(gchar *dir);
GList*
list_system_themes(void);
GList*
list_user_themes(void);
GtkWidget *
make_main(void);
void

View file

@ -16,6 +16,7 @@ typedef struct _theme_entry
gchar *dir;
gchar *readme;
gchar *icon;
int row;
} ThemeEntry;
void md(char *s);
@ -50,12 +51,12 @@ void mkdirs(char *s);
void
free_theme_list(ThemeEntry *list, gint number);
ThemeEntry *
list_themes(gchar *dir, gint *number);
ThemeEntry *
list_system_themes(gint *number);
ThemeEntry *
list_user_themes(gint *number);
GList*
list_themes(gchar *dir);
GList*
list_system_themes(void);
GList*
list_user_themes(void);
GtkWidget *
make_main(void);
void

View file

@ -15,10 +15,10 @@ static GtkWidget *capplet_widget;
static GtkWidget *theme_list;
static GtkWidget *auto_preview;
static GtkWidget *current_theme = NULL;
static GtkWidget *current_global_theme = NULL;
static GtkWidget *initial_theme = NULL;
static GtkWidget *last_theme = NULL;
static ThemeEntry *current_theme = NULL;
static ThemeEntry *current_global_theme = NULL;
static ThemeEntry *initial_theme = NULL;
static ThemeEntry *last_theme = NULL;
static GtkWidget *font_sel;
static GtkWidget *font_cbox;
static gboolean initial_preview;
@ -36,9 +36,8 @@ click_ok(GtkWidget *widget, gpointer data);
static void
click_revert(GtkWidget *widget, gpointer data);
static void
click_entry(GtkWidget *widget, gpointer data);
static void
delete_entry(GtkWidget *widget, gpointer data);
click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event,
gpointer data);
static void
auto_callback (GtkWidget *widget, gpointer data)
@ -202,11 +201,14 @@ make_main(void)
/* List of available themes
*/
theme_list = gtk_list_new();
gtk_list_set_selection_mode(GTK_LIST(theme_list), GTK_SELECTION_BROWSE);
theme_list = gtk_clist_new (1);
gtk_signal_connect (GTK_OBJECT (theme_list), "select_row", click_entry,
NULL);
gtk_clist_set_selection_mode(GTK_CLIST(theme_list), GTK_SELECTION_BROWSE);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), theme_list);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,
gtk_container_add (GTK_CONTAINER(sw), theme_list);
/* Mysterious allocation bug keeps shrinking hscrollbar during browse */
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_widget_set_usize (sw, 120, -1);
@ -340,7 +342,7 @@ click_preview(GtkWidget *widget, gpointer data)
if (!current_theme) {
return;
}
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(current_theme), "rc");
rc = current_theme->rc;
if (GTK_TOGGLE_BUTTON (font_cbox)->active)
test_theme(rc,
gnome_font_picker_get_font_name (GNOME_FONT_PICKER (font_sel)));
@ -379,12 +381,12 @@ click_try(GtkWidget *widget, gpointer data)
/* if (current_theme == current_global_theme)
return;*/
widget = current_theme;
if (!widget)
if (!current_theme)
return;
current_global_theme = current_theme;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
dir = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "dir");
rc = current_theme->rc;
dir = current_theme->dir;
/* hack for enlightenment only!!!! */
/* FIXME: restart what ever windowmanager you have! */
@ -411,7 +413,7 @@ click_ok(GtkWidget *widget, gpointer data)
{
click_try (widget, data);
gnome_config_set_bool ("/theme-switcher-capplet/settings/auto",GTK_TOGGLE_BUTTON (auto_preview)->active);
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name"));
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", current_theme->name);
gnome_config_set_bool ("/theme-switcher-capplet/settings/use_theme_font",
GTK_TOGGLE_BUTTON (font_cbox)->active);
gnome_config_set_string ("/theme-switcher-capplet/settings/font",
@ -423,14 +425,13 @@ click_revert(GtkWidget *widget, gpointer data)
{
gchar *rc;
widget = initial_theme;
if (!widget)
if (!initial_theme)
/* we hope this doesn't happen, but it could if things
* are mis-installed -jrb */
/* Damn, I hate this code... )-: */
return;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
rc = initial_theme->rc;
if ((current_global_theme != initial_theme) ||
(initial_font_cbox != GTK_TOGGLE_BUTTON (font_cbox)->active) ||
@ -448,7 +449,7 @@ click_revert(GtkWidget *widget, gpointer data)
gdk_flush();
gdk_error_warnings = 1;
}
current_global_theme = widget;
current_global_theme = initial_theme;
ignore_change = TRUE;
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (auto_preview),
initial_preview);
@ -458,7 +459,7 @@ click_revert(GtkWidget *widget, gpointer data)
if (initial_font)
gnome_font_picker_set_font_name (GNOME_FONT_PICKER (font_sel),
initial_font);
gtk_list_select_child (GTK_LIST (theme_list), initial_theme);
gtk_clist_select_row (GTK_CLIST (theme_list), initial_theme->row, -1);
test_theme(rc, initial_font);
send_reread();
if (!GTK_TOGGLE_BUTTON (font_cbox)->active)
@ -468,14 +469,11 @@ click_revert(GtkWidget *widget, gpointer data)
ignore_change = FALSE;
current_theme = initial_theme;
}
static void
click_entry(GtkWidget *widget, gpointer data)
click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event,
gpointer data)
{
gchar *rc, *name;
name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name");
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
/* Load in the README file */
#if 0
if (readme_current)
@ -501,7 +499,7 @@ click_entry(GtkWidget *widget, gpointer data)
#endif
if (!ignore_change)
{
current_theme = widget;
current_theme = gtk_clist_get_row_data (GTK_CLIST (clist), row);
if (initial_theme)
capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE);
@ -509,112 +507,94 @@ click_entry(GtkWidget *widget, gpointer data)
capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), FALSE);
if (GTK_TOGGLE_BUTTON (auto_preview)->active)
click_preview (widget,NULL);
click_preview (NULL,NULL);
}
}
static void
delete_entry(GtkWidget *widget, gpointer data)
item_destroy_notify (gpointer data)
{
gchar *rc, *name, *icon, *dir;
ThemeEntry *item = data;
name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name");
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
dir = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "dir");
icon = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "icon");
g_free(name);
g_free(rc);
g_free(dir);
g_free(icon);
g_free(item->name);
g_free(item->rc);
g_free(item->dir);
g_free(item->icon);
if (current_theme == widget)
if (current_theme == item)
current_theme = NULL;
g_free (item);
}
static gint sort_alpha(const void *a, const void *b)
{
GtkBin *A, *B;
const ThemeEntry *A, *B;
A = GTK_BIN (a);
B = GTK_BIN (b);
A = a;
B = b;
return strcmp((char *)GTK_LABEL (A->child)->label, (char *)GTK_LABEL (B->child)->label);
return strcmp(A->name, B->name);
}
static void
add_theme_list (GtkWidget *disp_list, GList *themes, gchar *d_theme, gchar *current_name)
{
ThemeEntry *item;
GList *l;
for (l = themes; l != NULL; l = l->next)
{
gchar *text[1] = { NULL };
item = l->data;
text[0] = item->name;
item->row = gtk_clist_append (GTK_CLIST(disp_list), text);
gtk_clist_set_row_data_full (GTK_CLIST(disp_list), item->row, item,
item_destroy_notify);
if (strcmp (d_theme, item->name) == 0)
{
current_global_theme = item;
initial_theme = item;
}
if (current_name && (strcmp (current_name, item->name) == 0))
{
current_theme = item;
}
}
}
void
update_theme_entries(GtkWidget *disp_list)
{
ThemeEntry *te;
gint num;
GList *list;
int i;
GtkWidget *item;
GList *themes;
gchar *d_theme = gnome_config_get_string ("/theme-switcher-capplet/settings/theme=Default");
gchar *current_name = NULL;
if (current_theme)
current_name = g_strdup(gtk_object_get_data(GTK_OBJECT(current_theme), "name"));
current_name = g_strdup (current_theme->name);
else
current_name = d_theme;
current_theme = NULL;
initial_theme = NULL;
list = NULL;
gtk_list_clear_items(GTK_LIST(disp_list), 0, -1);
te = list_system_themes(&num);
for (i = 0; i < num; i++)
{
item = gtk_list_item_new_with_label(te[i].name);
gtk_widget_show(item);
if (strcmp (d_theme, te[i].name) == 0)
{
current_global_theme = item;
initial_theme = item;
}
if (current_name && (strcmp (current_name, te[i].name) == 0))
{
current_theme = item;
}
gtk_object_set_data(GTK_OBJECT(item), "name", g_strdup(te[i].name));
gtk_object_set_data(GTK_OBJECT(item), "rc", g_strdup(te[i].rc));
gtk_object_set_data(GTK_OBJECT(item), "dir", g_strdup(te[i].dir));
gtk_object_set_data(GTK_OBJECT(item), "icon", g_strdup(te[i].icon));
gtk_signal_connect(GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(click_entry), NULL);
gtk_signal_connect(GTK_OBJECT(item), "destroy",
GTK_SIGNAL_FUNC(delete_entry), NULL);
list = g_list_insert_sorted(list, item, sort_alpha);
}
free_theme_list(te, num);
te = list_user_themes(&num);
for (i = 0; i < num; i++)
{
item = gtk_list_item_new_with_label(te[i].name);
gtk_widget_show(item);
if (strcmp (d_theme, te[i].name) == 0)
initial_theme = item;
if (current_name && (strcmp (current_name, te[i].name) == 0))
current_theme = item;
gtk_object_set_data(GTK_OBJECT(item), "name", g_strdup(te[i].name));
gtk_object_set_data(GTK_OBJECT(item), "rc", g_strdup(te[i].rc));
gtk_object_set_data(GTK_OBJECT(item), "dir", g_strdup(te[i].dir));
gtk_object_set_data(GTK_OBJECT(item), "icon", g_strdup(te[i].icon));
gtk_signal_connect(GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(click_entry), NULL);
gtk_signal_connect(GTK_OBJECT(item), "destroy",
GTK_SIGNAL_FUNC(delete_entry), NULL);
list = g_list_insert_sorted(list, item, sort_alpha);
}
free_theme_list(te, num);
/* Suppress an update here, because the BROWSE mode will
* cause a false initial selection
*/
ignore_change = TRUE;
gtk_list_append_items(GTK_LIST(disp_list), list);
gtk_clist_clear (GTK_CLIST(disp_list));
themes = list_system_themes();
themes = g_list_sort (themes, sort_alpha);
add_theme_list (disp_list, themes, d_theme, current_name);
themes = list_user_themes();
themes = g_list_sort (themes, sort_alpha);
add_theme_list (disp_list, themes, d_theme, current_name);
ignore_change = FALSE;
if (!current_theme)
@ -626,15 +606,15 @@ update_theme_entries(GtkWidget *disp_list)
if (current_theme)
{
if (current_name &&
strcmp (gtk_object_get_data(GTK_OBJECT(current_theme), "name"),
strcmp (current_theme->name,
current_name) != 0)
{
gtk_list_select_child (GTK_LIST (disp_list), current_theme);
gtk_clist_select_row (GTK_CLIST (disp_list), current_theme->row, 0);
}
else
{
ignore_change = TRUE;
gtk_list_select_child (GTK_LIST (disp_list), current_theme);
gtk_clist_select_row (GTK_CLIST (disp_list), current_theme->row, 0);
ignore_change = FALSE;
}
}

View file

@ -15,10 +15,10 @@ static GtkWidget *capplet_widget;
static GtkWidget *theme_list;
static GtkWidget *auto_preview;
static GtkWidget *current_theme = NULL;
static GtkWidget *current_global_theme = NULL;
static GtkWidget *initial_theme = NULL;
static GtkWidget *last_theme = NULL;
static ThemeEntry *current_theme = NULL;
static ThemeEntry *current_global_theme = NULL;
static ThemeEntry *initial_theme = NULL;
static ThemeEntry *last_theme = NULL;
static GtkWidget *font_sel;
static GtkWidget *font_cbox;
static gboolean initial_preview;
@ -36,9 +36,8 @@ click_ok(GtkWidget *widget, gpointer data);
static void
click_revert(GtkWidget *widget, gpointer data);
static void
click_entry(GtkWidget *widget, gpointer data);
static void
delete_entry(GtkWidget *widget, gpointer data);
click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event,
gpointer data);
static void
auto_callback (GtkWidget *widget, gpointer data)
@ -202,11 +201,14 @@ make_main(void)
/* List of available themes
*/
theme_list = gtk_list_new();
gtk_list_set_selection_mode(GTK_LIST(theme_list), GTK_SELECTION_BROWSE);
theme_list = gtk_clist_new (1);
gtk_signal_connect (GTK_OBJECT (theme_list), "select_row", click_entry,
NULL);
gtk_clist_set_selection_mode(GTK_CLIST(theme_list), GTK_SELECTION_BROWSE);
sw = gtk_scrolled_window_new(NULL, NULL);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(sw), theme_list);
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_AUTOMATIC,
gtk_container_add (GTK_CONTAINER(sw), theme_list);
/* Mysterious allocation bug keeps shrinking hscrollbar during browse */
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER,
GTK_POLICY_AUTOMATIC);
gtk_widget_set_usize (sw, 120, -1);
@ -340,7 +342,7 @@ click_preview(GtkWidget *widget, gpointer data)
if (!current_theme) {
return;
}
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(current_theme), "rc");
rc = current_theme->rc;
if (GTK_TOGGLE_BUTTON (font_cbox)->active)
test_theme(rc,
gnome_font_picker_get_font_name (GNOME_FONT_PICKER (font_sel)));
@ -379,12 +381,12 @@ click_try(GtkWidget *widget, gpointer data)
/* if (current_theme == current_global_theme)
return;*/
widget = current_theme;
if (!widget)
if (!current_theme)
return;
current_global_theme = current_theme;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
dir = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "dir");
rc = current_theme->rc;
dir = current_theme->dir;
/* hack for enlightenment only!!!! */
/* FIXME: restart what ever windowmanager you have! */
@ -411,7 +413,7 @@ click_ok(GtkWidget *widget, gpointer data)
{
click_try (widget, data);
gnome_config_set_bool ("/theme-switcher-capplet/settings/auto",GTK_TOGGLE_BUTTON (auto_preview)->active);
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", gtk_object_get_data (GTK_OBJECT (current_theme), "name"));
gnome_config_set_string ("/theme-switcher-capplet/settings/theme", current_theme->name);
gnome_config_set_bool ("/theme-switcher-capplet/settings/use_theme_font",
GTK_TOGGLE_BUTTON (font_cbox)->active);
gnome_config_set_string ("/theme-switcher-capplet/settings/font",
@ -423,14 +425,13 @@ click_revert(GtkWidget *widget, gpointer data)
{
gchar *rc;
widget = initial_theme;
if (!widget)
if (!initial_theme)
/* we hope this doesn't happen, but it could if things
* are mis-installed -jrb */
/* Damn, I hate this code... )-: */
return;
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
rc = initial_theme->rc;
if ((current_global_theme != initial_theme) ||
(initial_font_cbox != GTK_TOGGLE_BUTTON (font_cbox)->active) ||
@ -448,7 +449,7 @@ click_revert(GtkWidget *widget, gpointer data)
gdk_flush();
gdk_error_warnings = 1;
}
current_global_theme = widget;
current_global_theme = initial_theme;
ignore_change = TRUE;
gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (auto_preview),
initial_preview);
@ -458,7 +459,7 @@ click_revert(GtkWidget *widget, gpointer data)
if (initial_font)
gnome_font_picker_set_font_name (GNOME_FONT_PICKER (font_sel),
initial_font);
gtk_list_select_child (GTK_LIST (theme_list), initial_theme);
gtk_clist_select_row (GTK_CLIST (theme_list), initial_theme->row, -1);
test_theme(rc, initial_font);
send_reread();
if (!GTK_TOGGLE_BUTTON (font_cbox)->active)
@ -468,14 +469,11 @@ click_revert(GtkWidget *widget, gpointer data)
ignore_change = FALSE;
current_theme = initial_theme;
}
static void
click_entry(GtkWidget *widget, gpointer data)
click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event,
gpointer data)
{
gchar *rc, *name;
name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name");
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
/* Load in the README file */
#if 0
if (readme_current)
@ -501,7 +499,7 @@ click_entry(GtkWidget *widget, gpointer data)
#endif
if (!ignore_change)
{
current_theme = widget;
current_theme = gtk_clist_get_row_data (GTK_CLIST (clist), row);
if (initial_theme)
capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), TRUE);
@ -509,112 +507,94 @@ click_entry(GtkWidget *widget, gpointer data)
capplet_widget_state_changed(CAPPLET_WIDGET (capplet_widget), FALSE);
if (GTK_TOGGLE_BUTTON (auto_preview)->active)
click_preview (widget,NULL);
click_preview (NULL,NULL);
}
}
static void
delete_entry(GtkWidget *widget, gpointer data)
item_destroy_notify (gpointer data)
{
gchar *rc, *name, *icon, *dir;
ThemeEntry *item = data;
name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name");
rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc");
dir = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "dir");
icon = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "icon");
g_free(name);
g_free(rc);
g_free(dir);
g_free(icon);
g_free(item->name);
g_free(item->rc);
g_free(item->dir);
g_free(item->icon);
if (current_theme == widget)
if (current_theme == item)
current_theme = NULL;
g_free (item);
}
static gint sort_alpha(const void *a, const void *b)
{
GtkBin *A, *B;
const ThemeEntry *A, *B;
A = GTK_BIN (a);
B = GTK_BIN (b);
A = a;
B = b;
return strcmp((char *)GTK_LABEL (A->child)->label, (char *)GTK_LABEL (B->child)->label);
return strcmp(A->name, B->name);
}
static void
add_theme_list (GtkWidget *disp_list, GList *themes, gchar *d_theme, gchar *current_name)
{
ThemeEntry *item;
GList *l;
for (l = themes; l != NULL; l = l->next)
{
gchar *text[1] = { NULL };
item = l->data;
text[0] = item->name;
item->row = gtk_clist_append (GTK_CLIST(disp_list), text);
gtk_clist_set_row_data_full (GTK_CLIST(disp_list), item->row, item,
item_destroy_notify);
if (strcmp (d_theme, item->name) == 0)
{
current_global_theme = item;
initial_theme = item;
}
if (current_name && (strcmp (current_name, item->name) == 0))
{
current_theme = item;
}
}
}
void
update_theme_entries(GtkWidget *disp_list)
{
ThemeEntry *te;
gint num;
GList *list;
int i;
GtkWidget *item;
GList *themes;
gchar *d_theme = gnome_config_get_string ("/theme-switcher-capplet/settings/theme=Default");
gchar *current_name = NULL;
if (current_theme)
current_name = g_strdup(gtk_object_get_data(GTK_OBJECT(current_theme), "name"));
current_name = g_strdup (current_theme->name);
else
current_name = d_theme;
current_theme = NULL;
initial_theme = NULL;
list = NULL;
gtk_list_clear_items(GTK_LIST(disp_list), 0, -1);
te = list_system_themes(&num);
for (i = 0; i < num; i++)
{
item = gtk_list_item_new_with_label(te[i].name);
gtk_widget_show(item);
if (strcmp (d_theme, te[i].name) == 0)
{
current_global_theme = item;
initial_theme = item;
}
if (current_name && (strcmp (current_name, te[i].name) == 0))
{
current_theme = item;
}
gtk_object_set_data(GTK_OBJECT(item), "name", g_strdup(te[i].name));
gtk_object_set_data(GTK_OBJECT(item), "rc", g_strdup(te[i].rc));
gtk_object_set_data(GTK_OBJECT(item), "dir", g_strdup(te[i].dir));
gtk_object_set_data(GTK_OBJECT(item), "icon", g_strdup(te[i].icon));
gtk_signal_connect(GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(click_entry), NULL);
gtk_signal_connect(GTK_OBJECT(item), "destroy",
GTK_SIGNAL_FUNC(delete_entry), NULL);
list = g_list_insert_sorted(list, item, sort_alpha);
}
free_theme_list(te, num);
te = list_user_themes(&num);
for (i = 0; i < num; i++)
{
item = gtk_list_item_new_with_label(te[i].name);
gtk_widget_show(item);
if (strcmp (d_theme, te[i].name) == 0)
initial_theme = item;
if (current_name && (strcmp (current_name, te[i].name) == 0))
current_theme = item;
gtk_object_set_data(GTK_OBJECT(item), "name", g_strdup(te[i].name));
gtk_object_set_data(GTK_OBJECT(item), "rc", g_strdup(te[i].rc));
gtk_object_set_data(GTK_OBJECT(item), "dir", g_strdup(te[i].dir));
gtk_object_set_data(GTK_OBJECT(item), "icon", g_strdup(te[i].icon));
gtk_signal_connect(GTK_OBJECT(item), "select",
GTK_SIGNAL_FUNC(click_entry), NULL);
gtk_signal_connect(GTK_OBJECT(item), "destroy",
GTK_SIGNAL_FUNC(delete_entry), NULL);
list = g_list_insert_sorted(list, item, sort_alpha);
}
free_theme_list(te, num);
/* Suppress an update here, because the BROWSE mode will
* cause a false initial selection
*/
ignore_change = TRUE;
gtk_list_append_items(GTK_LIST(disp_list), list);
gtk_clist_clear (GTK_CLIST(disp_list));
themes = list_system_themes();
themes = g_list_sort (themes, sort_alpha);
add_theme_list (disp_list, themes, d_theme, current_name);
themes = list_user_themes();
themes = g_list_sort (themes, sort_alpha);
add_theme_list (disp_list, themes, d_theme, current_name);
ignore_change = FALSE;
if (!current_theme)
@ -626,15 +606,15 @@ update_theme_entries(GtkWidget *disp_list)
if (current_theme)
{
if (current_name &&
strcmp (gtk_object_get_data(GTK_OBJECT(current_theme), "name"),
strcmp (current_theme->name,
current_name) != 0)
{
gtk_list_select_child (GTK_LIST (disp_list), current_theme);
gtk_clist_select_row (GTK_CLIST (disp_list), current_theme->row, 0);
}
else
{
ignore_change = TRUE;
gtk_list_select_child (GTK_LIST (disp_list), current_theme);
gtk_clist_select_row (GTK_CLIST (disp_list), current_theme->row, 0);
ignore_change = FALSE;
}
}

View file

@ -154,53 +154,51 @@ free_theme_list(ThemeEntry *list, gint number)
g_free(list);
}
ThemeEntry *
list_themes(gchar *dir, gint *number)
GList *
list_themes(gchar *dir)
{
gchar **dir_listing = NULL, tmp[4096];
ThemeEntry *list = NULL;
gint i = 0, j = 0, num = 0;
gchar **dir_listing = NULL, *tmp;
GList *list = NULL;
gint i = 0, num = 0;
dir_listing = ls(dir, &num);
for(i = 0; i < num; i++)
{
g_snprintf(tmp, sizeof(tmp), "%s/%s/gtk/gtkrc", dir, dir_listing[i]);
tmp = g_strdup_printf ("%s/%s/gtk/gtkrc", dir, dir_listing[i]);
if (isfile(tmp))
{
list = g_realloc(list, sizeof(ThemeEntry) * ++j);
list[j - 1].name = g_strdup(dir_listing[i]);
list[j - 1].rc = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s", dir, dir_listing[i]);
list[j - 1].dir = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s/README.html", dir, dir_listing[i]);
list[j - 1].readme = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s/ICON.png", dir, dir_listing[i]);
list[j - 1].icon = g_strdup(tmp);
ThemeEntry *item = g_new0 (ThemeEntry, 1);
item->name = g_strdup(dir_listing[i]);
item->rc = g_strdup (tmp);
item->dir = g_strdup_printf ("%s/%s", dir, dir_listing[i]);
item->readme = g_strdup_printf ("%s/%s/README.html", dir, dir_listing[i]);
item->icon = g_strdup_printf ("%s/%s/ICON.png", dir, dir_listing[i]);
list = g_list_prepend (list, item);
}
g_free (tmp);
}
freestrlist(dir_listing, num);
*number = j;
return list;
return g_list_reverse (list);
}
ThemeEntry *
list_system_themes(gint *number)
GList *
list_system_themes(void)
{
gchar *theme_dir = NULL;
ThemeEntry *list = NULL;
GList *list = NULL;
theme_dir = gtk_rc_get_theme_dir();
list = list_themes(theme_dir, number);
list = list_themes(theme_dir);
g_free(theme_dir);
return list;
}
ThemeEntry *
list_user_themes(gint *number)
GList *
list_user_themes()
{
gchar *home = NULL;
gchar *theme_dir = NULL;
ThemeEntry *list = NULL;
GList *list = NULL;
home = g_get_home_dir ();
if (!home)
@ -211,7 +209,7 @@ list_user_themes(gint *number)
theme_dir = g_malloc(strlen(home) + strlen("/.themes") + 1);
sprintf(theme_dir, "%s%s", home, "/.themes");
list = list_themes(theme_dir, number);
list = list_themes(theme_dir);
g_free(theme_dir);
return list;
}

View file

@ -154,53 +154,51 @@ free_theme_list(ThemeEntry *list, gint number)
g_free(list);
}
ThemeEntry *
list_themes(gchar *dir, gint *number)
GList *
list_themes(gchar *dir)
{
gchar **dir_listing = NULL, tmp[4096];
ThemeEntry *list = NULL;
gint i = 0, j = 0, num = 0;
gchar **dir_listing = NULL, *tmp;
GList *list = NULL;
gint i = 0, num = 0;
dir_listing = ls(dir, &num);
for(i = 0; i < num; i++)
{
g_snprintf(tmp, sizeof(tmp), "%s/%s/gtk/gtkrc", dir, dir_listing[i]);
tmp = g_strdup_printf ("%s/%s/gtk/gtkrc", dir, dir_listing[i]);
if (isfile(tmp))
{
list = g_realloc(list, sizeof(ThemeEntry) * ++j);
list[j - 1].name = g_strdup(dir_listing[i]);
list[j - 1].rc = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s", dir, dir_listing[i]);
list[j - 1].dir = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s/README.html", dir, dir_listing[i]);
list[j - 1].readme = g_strdup(tmp);
g_snprintf(tmp, sizeof(tmp), "%s/%s/ICON.png", dir, dir_listing[i]);
list[j - 1].icon = g_strdup(tmp);
ThemeEntry *item = g_new0 (ThemeEntry, 1);
item->name = g_strdup(dir_listing[i]);
item->rc = g_strdup (tmp);
item->dir = g_strdup_printf ("%s/%s", dir, dir_listing[i]);
item->readme = g_strdup_printf ("%s/%s/README.html", dir, dir_listing[i]);
item->icon = g_strdup_printf ("%s/%s/ICON.png", dir, dir_listing[i]);
list = g_list_prepend (list, item);
}
g_free (tmp);
}
freestrlist(dir_listing, num);
*number = j;
return list;
return g_list_reverse (list);
}
ThemeEntry *
list_system_themes(gint *number)
GList *
list_system_themes(void)
{
gchar *theme_dir = NULL;
ThemeEntry *list = NULL;
GList *list = NULL;
theme_dir = gtk_rc_get_theme_dir();
list = list_themes(theme_dir, number);
list = list_themes(theme_dir);
g_free(theme_dir);
return list;
}
ThemeEntry *
list_user_themes(gint *number)
GList *
list_user_themes()
{
gchar *home = NULL;
gchar *theme_dir = NULL;
ThemeEntry *list = NULL;
GList *list = NULL;
home = g_get_home_dir ();
if (!home)
@ -211,7 +209,7 @@ list_user_themes(gint *number)
theme_dir = g_malloc(strlen(home) + strlen("/.themes") + 1);
sprintf(theme_dir, "%s%s", home, "/.themes");
list = list_themes(theme_dir, number);
list = list_themes(theme_dir);
g_free(theme_dir);
return list;
}