diff --git a/capplets/theme-switcher/ChangeLog b/capplets/theme-switcher/ChangeLog index 055cec599..a330d8655 100644 --- a/capplets/theme-switcher/ChangeLog +++ b/capplets/theme-switcher/ChangeLog @@ -1,3 +1,20 @@ +2001-09-29 Richard Hestilow + + * 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 * RELEASE : 1.5.2 diff --git a/capplets/theme-switcher/da.h b/capplets/theme-switcher/da.h index ecd4e1dd4..9620fc915 100644 --- a/capplets/theme-switcher/da.h +++ b/capplets/theme-switcher/da.h @@ -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 diff --git a/capplets/theme-switcher/da.h-67648 b/capplets/theme-switcher/da.h-67648 index ecd4e1dd4..9620fc915 100644 --- a/capplets/theme-switcher/da.h-67648 +++ b/capplets/theme-switcher/da.h-67648 @@ -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 diff --git a/capplets/theme-switcher/gui.c b/capplets/theme-switcher/gui.c index 1cfe375ac..ae088f2a2 100644 --- a/capplets/theme-switcher/gui.c +++ b/capplets/theme-switcher/gui.c @@ -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) - return; + 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) -{ - gchar *rc, *name; - - name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name"); - rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc"); +static void +click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event, + gpointer data) +{ /* 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; } } diff --git a/capplets/theme-switcher/gui.c-6060 b/capplets/theme-switcher/gui.c-6060 index 1cfe375ac..ae088f2a2 100644 --- a/capplets/theme-switcher/gui.c-6060 +++ b/capplets/theme-switcher/gui.c-6060 @@ -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) - return; + 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) -{ - gchar *rc, *name; - - name = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "name"); - rc = (gchar *)gtk_object_get_data(GTK_OBJECT(widget), "rc"); +static void +click_entry(GtkWidget *clist, gint row, gint col, GdkEvent *event, + gpointer data) +{ /* 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; } } diff --git a/capplets/theme-switcher/lister.c b/capplets/theme-switcher/lister.c index c35236900..1e624e003 100644 --- a/capplets/theme-switcher/lister.c +++ b/capplets/theme-switcher/lister.c @@ -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; } diff --git a/capplets/theme-switcher/lister.c-42011 b/capplets/theme-switcher/lister.c-42011 index c35236900..1e624e003 100644 --- a/capplets/theme-switcher/lister.c-42011 +++ b/capplets/theme-switcher/lister.c-42011 @@ -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; }