changeset 2215:0264fabf471d trunk

[svn] equalizer.c: port from GtkCTree to GtkTreeView. Patch by external contributer Michael Farber <01mf02 -at- gmail.com>
author kiyoshi
date Tue, 26 Dec 2006 02:36:33 -0800
parents a62767c3c4e3
children f8e68d1aadd0
files ChangeLog audacious/equalizer.c doc/libaudacious/libaudacious-decl-list.txt doc/libaudacious/libaudacious-decl.txt doc/libaudacious/libaudacious-undocumented.txt doc/libaudacious/libaudacious-unused.txt doc/libaudacious/tmpl/libaudacious-unused.sgml doc/libaudacious/tmpl/vfs.sgml
diffstat 8 files changed, 365 insertions(+), 483 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Mon Dec 25 14:50:15 2006 -0800
+++ b/ChangeLog	Tue Dec 26 02:36:33 2006 -0800
@@ -1,3 +1,11 @@
+2006-12-25 22:50:15 +0000  Jerome Poulin <ticpu@ticpu.net>
+  revision [3433]
+  Fixed ro.po to compile, added charset UTF-8 and a missing \n.
+  
+  trunk/po/ro.po |    4 ++--
+  1 file changed, 2 insertions(+), 2 deletions(-)
+
+
 2006-12-25 18:28:32 +0000  William Pitcock <nenolod@nenolod.net>
   revision [3431]
   - new Romanian translator: Daniel Patriche
--- a/audacious/equalizer.c	Mon Dec 25 14:50:15 2006 -0800
+++ b/audacious/equalizer.c	Tue Dec 26 02:36:33 2006 -0800
@@ -68,9 +68,9 @@
 static GtkWidget *equalizerwin_load_window = NULL;
 static GtkWidget *equalizerwin_load_auto_window = NULL;
 static GtkWidget *equalizerwin_save_window = NULL;
-static GtkWidget *equalizerwin_save_entry;
+static GtkWidget *equalizerwin_save_entry = NULL;
 static GtkWidget *equalizerwin_save_auto_window = NULL;
-static GtkWidget *equalizerwin_save_auto_entry;
+static GtkWidget *equalizerwin_save_auto_entry = NULL;
 static GtkWidget *equalizerwin_delete_window = NULL;
 static GtkWidget *equalizerwin_delete_auto_window = NULL;
 
@@ -1157,6 +1157,50 @@
     return list;
 }
 
+static void
+equalizerwin_delete_selected_presets(GtkTreeView *view, gchar *filename)
+{
+	gchar *text;
+
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+	GtkTreeModel *model = gtk_tree_view_get_model(view);
+
+	/*
+	 * first we are making a list of the selected rows, then we convert this
+	 * list into a list of GtkTreeRowReferences, so that when you delete an
+	 * item you can still access the other items
+	 * finally we iterate through all GtkTreeRowReferences, convert them to
+	 * GtkTreeIters and delete those one after the other
+	 */
+
+	GList *list = gtk_tree_selection_get_selected_rows(selection, &model);
+	GList *rrefs = NULL;
+	GList *litr;
+
+	for (litr = list; litr; litr = litr->next)
+	{
+		GtkTreePath *path = litr->data;
+		rrefs = g_list_append(rrefs, gtk_tree_row_reference_new(model, path));
+	}
+
+	for (litr = rrefs; litr; litr = litr->next)
+	{
+		GtkTreeRowReference *ref = litr->data;
+		GtkTreePath *path = gtk_tree_row_reference_get_path(ref);
+		GtkTreeIter iter;
+		gtk_tree_model_get_iter(model, &iter, path);
+
+		gtk_tree_model_get(model, &iter, 0, &text, -1);
+
+		if (filename == "eq.preset")
+			equalizer_presets = equalizerwin_delete_preset(equalizer_presets, text, filename);
+		else if (filename == "eq.auto_preset")
+			equalizer_auto_presets = equalizerwin_delete_preset(equalizer_auto_presets, text, filename);
+
+		gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+	}
+}
+
 
 static GList *
 import_winamp_eqf(VFSFile * file)
@@ -1245,79 +1289,66 @@
 }
 
 static void
-equalizerwin_save_select(GtkCList * clist, gint row,
-                         gint column, GdkEventButton * event, gpointer data)
+equalizerwin_save_select(GtkTreeView *treeview, GtkTreePath *path,
+						 GtkTreeViewColumn *col, gpointer data)
 {
     gchar *text;
 
-    gtk_clist_get_text(clist, row, 0, &text);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_entry), text);
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_save_ok(NULL, NULL);
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_entry), text);
+			equalizerwin_save_ok(NULL, NULL);
 
+			g_free(text);
+		}
+	}
 }
 
 static void
-equalizerwin_load_ok(GtkWidget * widget, gpointer data)
+equalizerwin_load_ok(GtkWidget *widget, gpointer data)
 {
     gchar *text;
-    GtkCList *clist = GTK_CLIST(data);
+
+	GtkTreeView* view = GTK_TREE_VIEW(data);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    if (clist && clist->selection) {
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(clist->selection->data),
-                           0, &text);
-        equalizerwin_load_preset(equalizer_presets, text);
-    }
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			equalizerwin_load_preset(equalizer_presets, text);
+
+			g_free(text);
+		}
+	}
     gtk_widget_destroy(equalizerwin_load_window);
 }
 
 static void
-equalizerwin_load_apply(GtkWidget * widget, gpointer data)
+equalizerwin_load_select(GtkTreeView *treeview, GtkTreePath *path,
+						 GtkTreeViewColumn *col, gpointer data)
 {
-    gchar *text;
-    GtkCList *clist = GTK_CLIST(data);
-
-    if (clist && clist->selection) {
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(clist->selection->data),
-                           0, &text);
-        equalizerwin_load_preset(equalizer_presets, text);
-    }
-}
-
-
-static void
-equalizerwin_load_select(GtkCList * widget, gint row,
-                         gint column, GdkEventButton * event, gpointer data)
-{
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_load_ok(NULL, widget);
+	equalizerwin_load_ok(NULL, treeview);
 }
 
 static void
-equalizerwin_delete_delete(GtkWidget * widget, gpointer data)
+equalizerwin_delete_delete(GtkWidget *widget, gpointer data)
 {
-    gchar *text;
-    GList *list, *next;
-    GtkCList *clist = GTK_CLIST(data);
-
-    g_return_if_fail(clist != NULL);
-
-    list = clist->selection;
-    gtk_clist_freeze(clist);
-    while (list) {
-        next = g_list_next(list);
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(list->data), 0, &text);
-        equalizer_auto_presets =
-            equalizerwin_delete_preset(equalizer_presets, text, "eq.preset");
-        gtk_clist_remove(clist, GPOINTER_TO_INT(list->data));
-        list = next;
-    }
-    gtk_clist_thaw(clist);
+	equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.preset");
 }
 
 static void
-equalizerwin_save_auto_ok(GtkWidget * widget, gpointer data)
+equalizerwin_save_auto_ok(GtkWidget *widget, gpointer data)
 {
     const gchar *text;
 
@@ -1330,64 +1361,62 @@
 }
 
 static void
-equalizerwin_save_auto_select(GtkCList * clist, gint row,
-                              gint column,
-                              GdkEventButton * event, gpointer data)
+equalizerwin_save_auto_select(GtkTreeView *treeview, GtkTreePath *path,
+							  GtkTreeViewColumn *col, gpointer data)
 {
     gchar *text;
 
-    gtk_clist_get_text(clist, row, 0, &text);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry), text);
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_save_auto_ok(NULL, NULL);
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry), text);
+			equalizerwin_save_auto_ok(NULL, NULL);
 
+			g_free(text);
+		}
+	}
 }
 
 static void
-equalizerwin_load_auto_ok(GtkWidget * widget, gpointer data)
+equalizerwin_load_auto_ok(GtkWidget *widget, gpointer data)
 {
     gchar *text;
-    GtkCList *clist = GTK_CLIST(data);
+
+	GtkTreeView *view = GTK_TREE_VIEW(data);
+	GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
 
-    if (clist && clist->selection) {
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(clist->selection->data),
-                           0, &text);
-        equalizerwin_load_preset(equalizer_auto_presets, text);
-    }
+	if (selection)
+	{
+		if (gtk_tree_selection_get_selected(selection, &model, &iter))
+		{
+			gtk_tree_model_get(model, &iter, 0, &text, -1);
+			equalizerwin_load_preset(equalizer_auto_presets, text);
+
+			g_free(text);
+		}
+	}
     gtk_widget_destroy(equalizerwin_load_auto_window);
 }
 
 static void
-equalizerwin_load_auto_select(GtkWidget * widget, gint row,
-                              gint column,
-                              GdkEventButton * event, gpointer data)
+equalizerwin_load_auto_select(GtkTreeView *treeview, GtkTreePath *path,
+							  GtkTreeViewColumn *col, gpointer data)
 {
-    if (event->type == GDK_2BUTTON_PRESS)
-        equalizerwin_load_auto_ok(NULL, widget);
+	equalizerwin_load_auto_ok(NULL, treeview);
 }
 
 static void
-equalizerwin_delete_auto_delete(GtkWidget * widget, gpointer data)
+equalizerwin_delete_auto_delete(GtkWidget *widget, gpointer data)
 {
-    gchar *text;
-    GList *list, *next;
-    GtkCList *clist = GTK_CLIST(data);
-
-    g_return_if_fail(clist != NULL);
-
-    list = clist->selection;
-    gtk_clist_freeze(clist);
-    while (list) {
-        next = g_list_next(list);
-        gtk_clist_get_text(clist, GPOINTER_TO_INT(list->data), 0, &text);
-        equalizer_auto_presets =
-            equalizerwin_delete_preset(equalizer_auto_presets, text,
-                                       "eq.auto_preset");
-        gtk_clist_remove(clist, GPOINTER_TO_INT(list->data));
-        list = next;
-    }
-    gtk_clist_thaw(clist);
+	equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.auto_preset");
 }
 
 
@@ -1585,20 +1614,26 @@
 
 
 static GtkWidget *
-equalizerwin_create_list_window(GList * preset_list,
-                                const gchar * title,
-                                GtkWidget ** window,
+equalizerwin_create_list_window(GList *preset_list,
+                                const gchar *title,
+                                GtkWidget **window,
                                 GtkSelectionMode sel_mode,
-                                GtkWidget ** entry,
-                                const gchar * btn2_stock_name,
-                                const gchar * btn1_stock_name,
-                                GCallback btn2_func,
+                                GtkWidget **entry,
+                                const gchar *action_name,
+                                GCallback action_func,
                                 GCallback select_row_func)
 {
-    GtkWidget *vbox, *scrolled_window, *bbox, *btn1, *btn2, *btn3, *clist;
-    gchar *preset_text[1];
+    GtkWidget *vbox, *scrolled_window, *bbox, *button_cancel, *button_action, *view;
     GList *node;
 
+	GtkListStore *store;
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	GtkCellRenderer *renderer;
+	GtkTreeSelection *selection;
+
+
+
     *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
     gtk_window_set_title(GTK_WINDOW(*window), title);
     gtk_window_set_type_hint(GTK_WINDOW(*window), GDK_WINDOW_TYPE_HINT_DIALOG);
@@ -1617,27 +1652,39 @@
     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
                                    GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
 
-    preset_text[0] = _("Presets");
-    clist = gtk_clist_new_with_titles(1, preset_text);
-    if (select_row_func)
-        g_signal_connect(clist, "select_row",
-                         G_CALLBACK(select_row_func), NULL);
-    gtk_clist_column_titles_passive(GTK_CLIST(clist));
-    gtk_clist_set_selection_mode(GTK_CLIST(clist), sel_mode);
+
+	/* fill the store with the names of all available presets */
+	store = gtk_list_store_new(1, G_TYPE_STRING);
+	for (node = preset_list; node; node = g_list_next(node))
+	{
+		gtk_list_store_append(store, &iter);
+		gtk_list_store_set(store, &iter,
+						   0, ((EqualizerPreset*)node->data)->name,
+						   -1);
+	}
+	model = GTK_TREE_MODEL(store);
+
 
-    for (node = preset_list; node; node = g_list_next(node)) {
-        gtk_clist_append(GTK_CLIST(clist),
-                         &((EqualizerPreset *) node->data)->name);
-    }
-    gtk_clist_set_compare_func(GTK_CLIST(clist), equalizerwin_list_sort_func);
-    gtk_clist_sort(GTK_CLIST(clist));
+	view = gtk_tree_view_new();
+	renderer = gtk_cell_renderer_text_new();
+	gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1,
+												_("Presets"), renderer,
+												"text", 0, NULL);
+	gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
+	g_object_unref(model);
 
-    gtk_container_add(GTK_CONTAINER(scrolled_window), clist);
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+	gtk_tree_selection_set_mode(selection, sel_mode);
+
+
+
+
+	gtk_container_add(GTK_CONTAINER(scrolled_window), view);
     gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
 
     if (entry) {
         *entry = gtk_entry_new();
-        g_signal_connect(*entry, "activate", btn2_func, NULL);
+        g_signal_connect(*entry, "activate", action_func, NULL);
         gtk_box_pack_start(GTK_BOX(vbox), *entry, FALSE, FALSE, 0);
     }
 
@@ -1646,19 +1693,23 @@
     gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
     gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
 
-    btn1 = gtk_button_new_from_stock(btn1_stock_name);
-    g_signal_connect_swapped(btn1, "clicked",
+    button_cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+    g_signal_connect_swapped(button_cancel, "clicked",
                              G_CALLBACK(gtk_widget_destroy),
                              GTK_OBJECT(*window));
-    gtk_box_pack_start(GTK_BOX(bbox), btn1, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(bbox), button_cancel, TRUE, TRUE, 0);
+
+    button_action = gtk_button_new_from_stock(action_name);
+    g_signal_connect(button_action, "clicked", G_CALLBACK(action_func), view);
+    GTK_WIDGET_SET_FLAGS(button_action, GTK_CAN_DEFAULT);
 
-    btn2 = gtk_button_new_from_stock(btn2_stock_name);
-    g_signal_connect(btn2, "clicked", G_CALLBACK(btn2_func), clist);
-    GTK_WIDGET_SET_FLAGS(btn2, GTK_CAN_DEFAULT);
+	if (select_row_func)
+		g_signal_connect(view, "row-activated", G_CALLBACK(select_row_func), NULL);
+
         
-    gtk_box_pack_start(GTK_BOX(bbox), btn2, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(bbox), button_action, TRUE, TRUE, 0);
 
-    gtk_widget_grab_default(btn2);
+    gtk_widget_grab_default(button_action);
 
 
     gtk_widget_show_all(*window);
@@ -1749,7 +1800,7 @@
                                     Q_("Load preset"),
                                     &equalizerwin_load_window,
                                     GTK_SELECTION_SINGLE, NULL,
-                                    GTK_STOCK_OK, GTK_STOCK_CANCEL,
+                                    GTK_STOCK_OK,
                                     G_CALLBACK(equalizerwin_load_ok),
                                     G_CALLBACK(equalizerwin_load_select));
 }
@@ -1766,7 +1817,7 @@
                                     Q_("Load auto-preset"),
                                     &equalizerwin_load_auto_window,
                                     GTK_SELECTION_SINGLE, NULL,
-                                    GTK_STOCK_OK, GTK_STOCK_CANCEL,
+                                    GTK_STOCK_OK,
                                     G_CALLBACK(equalizerwin_load_auto_ok),
                                     G_CALLBACK(equalizerwin_load_auto_select));
 }
@@ -1835,7 +1886,7 @@
                                     &equalizerwin_save_window,
                                     GTK_SELECTION_SINGLE,
                                     &equalizerwin_save_entry,
-                                    GTK_STOCK_OK, GTK_STOCK_CANCEL,
+                                    GTK_STOCK_OK,
                                     G_CALLBACK(equalizerwin_save_ok),
                                     G_CALLBACK(equalizerwin_save_select));
 }
@@ -1847,18 +1898,17 @@
     Playlist *playlist = playlist_get_active();
 
     if (equalizerwin_save_auto_window)
+        gtk_window_present(GTK_WINDOW(equalizerwin_save_auto_window));
+    else
         equalizerwin_create_list_window(equalizer_auto_presets,
                                         Q_("Save auto-preset"),
                                         &equalizerwin_save_auto_window,
                                         GTK_SELECTION_SINGLE,
                                         &equalizerwin_save_auto_entry,
                                         GTK_STOCK_OK,
-                                        GTK_STOCK_CANCEL,
                                         G_CALLBACK(equalizerwin_save_auto_ok),
                                         G_CALLBACK(equalizerwin_save_auto_select));
-    else
-        gtk_window_present(GTK_WINDOW(equalizerwin_save_auto_window));
-        
+
     name = playlist_get_filename(playlist, playlist_get_position(playlist));
     if (name) {
         gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry),
@@ -1921,7 +1971,6 @@
                                     &equalizerwin_delete_window,
                                     GTK_SELECTION_EXTENDED, NULL,
                                     GTK_STOCK_DELETE,
-                                    GTK_STOCK_CLOSE,
                                     G_CALLBACK(equalizerwin_delete_delete),
                                     NULL);
 }
@@ -1939,7 +1988,6 @@
                                     &equalizerwin_delete_auto_window,
                                     GTK_SELECTION_EXTENDED, NULL,
                                     GTK_STOCK_DELETE,
-                                    GTK_STOCK_CLOSE,
                                     G_CALLBACK(equalizerwin_delete_auto_delete),
                                     NULL);
 }
--- a/doc/libaudacious/libaudacious-decl-list.txt	Mon Dec 25 14:50:15 2006 -0800
+++ b/doc/libaudacious/libaudacious-decl-list.txt	Tue Dec 26 02:36:33 2006 -0800
@@ -1,25 +1,3 @@
-<SECTION>
-<FILE>vfs</FILE>
-VFSFile
-VFSConstructor
-vfs_fopen
-vfs_fclose
-vfs_fread
-vfs_fwrite
-vfs_getc
-vfs_ungetc
-vfs_fgets
-vfs_fseek
-vfs_rewind
-vfs_ftell
-vfs_feof
-vfs_file_test
-vfs_is_writeable
-vfs_truncate
-vfs_fprintf
-vfs_register_transport
-</SECTION>
-
 <SECTION>
 <FILE>configdb</FILE>
 ConfigDb
@@ -139,6 +117,7 @@
 xmms_remote_playlist_prev
 xmms_remote_playlist_next
 xmms_remote_playlist_add_url_string
+xmms_remote_playlist_enqueue_to_temp
 xmms_remote_is_running
 xmms_remote_toggle_repeat
 xmms_remote_toggle_shuffle
@@ -177,10 +156,3 @@
 xmms_urldecode_plain
 </SECTION>
 
-<SECTION>
-<FILE>vfs_buffer</FILE>
-VFSBuffer
-vfs_buffer_new
-vfs_buffer_new_from_string
-</SECTION>
-
--- a/doc/libaudacious/libaudacious-decl.txt	Mon Dec 25 14:50:15 2006 -0800
+++ b/doc/libaudacious/libaudacious-decl.txt	Tue Dec 26 02:36:33 2006 -0800
@@ -1,117 +1,3 @@
-<STRUCT>
-<NAME>VFSFile</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>VFSConstructor</NAME>
-</STRUCT>
-<STRUCT>
-<NAME>VFSFile</NAME>
-struct _VFSFile {
-	gchar *uri;
-	gpointer handle;
-	VFSConstructor *base;
-};
-</STRUCT>
-<STRUCT>
-<NAME>VFSConstructor</NAME>
-struct _VFSConstructor {
-	gchar *uri_id;
-	VFSFile *(*vfs_fopen_impl)(const gchar *path,
-		const gchar *mode);
-	gint (*vfs_fclose_impl)(VFSFile * file);
-	size_t (*vfs_fread_impl)(gpointer ptr, size_t size,
-		size_t nmemb, VFSFile *file);
-	size_t (*vfs_fwrite_impl)(gconstpointer ptr, size_t size,
-		size_t nmemb, VFSFile *file);
-	gint (*vfs_getc_impl)(VFSFile *stream);
-	gint (*vfs_ungetc_impl)(gint c, VFSFile *stream);
-	gint (*vfs_fseek_impl)(VFSFile *file, glong offset, gint whence);
-	void (*vfs_rewind_impl)(VFSFile *file);
-	glong (*vfs_ftell_impl)(VFSFile *file);
-	gboolean (*vfs_feof_impl)(VFSFile *file);
-	gboolean (*vfs_truncate_impl)(VFSFile *file, glong length);
-};
-</STRUCT>
-<FUNCTION>
-<NAME>vfs_fopen</NAME>
-<RETURNS>VFSFile *</RETURNS>
-const gchar * path,const gchar * mode
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_fclose</NAME>
-<RETURNS>gint </RETURNS>
-VFSFile * file
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_fread</NAME>
-<RETURNS>size_t </RETURNS>
-gpointer ptr,size_t size,size_t nmemb,VFSFile * file
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_fwrite</NAME>
-<RETURNS>size_t </RETURNS>
-gconstpointer ptr,size_t size,size_t nmemb,VFSFile *file
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_getc</NAME>
-<RETURNS>gint </RETURNS>
-VFSFile *stream
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_ungetc</NAME>
-<RETURNS>gint </RETURNS>
-gint c,VFSFile *stream
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_fgets</NAME>
-<RETURNS>gchar *</RETURNS>
-gchar *s,gint n,VFSFile *stream
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_fseek</NAME>
-<RETURNS>gint </RETURNS>
-VFSFile * file,glong offset,gint whence
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_rewind</NAME>
-<RETURNS>void </RETURNS>
-VFSFile * file
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_ftell</NAME>
-<RETURNS>glong </RETURNS>
-VFSFile * file
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_feof</NAME>
-<RETURNS>gboolean </RETURNS>
-VFSFile * file
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_file_test</NAME>
-<RETURNS>gboolean </RETURNS>
-const gchar * path,GFileTest test
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_is_writeable</NAME>
-<RETURNS>gboolean </RETURNS>
-const gchar * path
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_truncate</NAME>
-<RETURNS>gboolean </RETURNS>
-VFSFile * file, glong length
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_fprintf</NAME>
-<RETURNS>int </RETURNS>
-VFSFile *stream, gchar const *format, ...
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_register_transport</NAME>
-<RETURNS>gboolean </RETURNS>
-VFSConstructor *vtable
-</FUNCTION>
 <STRUCT>
 <NAME>ConfigDb</NAME>
 </STRUCT>
@@ -574,6 +460,11 @@
 gint session, gchar * string
 </FUNCTION>
 <FUNCTION>
+<NAME>xmms_remote_playlist_enqueue_to_temp</NAME>
+<RETURNS>void </RETURNS>
+gint session, gchar * string
+</FUNCTION>
+<FUNCTION>
 <NAME>xmms_remote_is_running</NAME>
 <RETURNS>gboolean </RETURNS>
 gint session
@@ -733,22 +624,3 @@
 <RETURNS>gchar *</RETURNS>
 const gchar *
 </FUNCTION>
-<STRUCT>
-<NAME>VFSBuffer</NAME>
-typedef struct {
-	guchar *data;
-	guchar *iter;
-	guchar *end;
-	gsize   size;
-} VFSBuffer;
-</STRUCT>
-<FUNCTION>
-<NAME>vfs_buffer_new</NAME>
-<RETURNS>VFSFile *</RETURNS>
-gpointer data, gsize size
-</FUNCTION>
-<FUNCTION>
-<NAME>vfs_buffer_new_from_string</NAME>
-<RETURNS>VFSFile *</RETURNS>
-gchar *str
-</FUNCTION>
--- a/doc/libaudacious/libaudacious-undocumented.txt	Mon Dec 25 14:50:15 2006 -0800
+++ b/doc/libaudacious/libaudacious-undocumented.txt	Tue Dec 26 02:36:33 2006 -0800
@@ -1,5 +1,5 @@
 100% symbol docs coverage.
-155 symbols documented.
+137 symbols documented.
 0 symbols incomplete.
 0 not documented.
 
--- a/doc/libaudacious/libaudacious-unused.txt	Mon Dec 25 14:50:15 2006 -0800
+++ b/doc/libaudacious/libaudacious-unused.txt	Tue Dec 26 02:36:33 2006 -0800
@@ -1,5 +1,3 @@
-VFSBuffer
-vfs_buffer_new
-vfs_buffer_new_from_string
+xmms_remote_playlist_enqueue_to_temp
 xmms_urldecode_path
 xmms_urldecode_plain
--- a/doc/libaudacious/tmpl/libaudacious-unused.sgml	Mon Dec 25 14:50:15 2006 -0800
+++ b/doc/libaudacious/tmpl/libaudacious-unused.sgml	Tue Dec 26 02:36:33 2006 -0800
@@ -22,6 +22,33 @@
 xml_document
 
 
+<!-- ##### STRUCT VFSConstructor ##### -->
+<para>
+
+</para>
+
+@uri_id: 
+@vfs_fopen_impl: 
+@vfs_fclose_impl: 
+@vfs_fread_impl: 
+@vfs_fwrite_impl: 
+@vfs_getc_impl: 
+@vfs_ungetc_impl: 
+@vfs_fseek_impl: 
+@vfs_rewind_impl: 
+@vfs_ftell_impl: 
+@vfs_feof_impl: 
+@vfs_truncate_impl: 
+
+<!-- ##### STRUCT VFSFile ##### -->
+<para>
+
+</para>
+
+@uri: 
+@handle: 
+@base: 
+
 <!-- ##### STRUCT XmmsEntry ##### -->
 <para>
 
@@ -35,6 +62,108 @@
 </para>
 
 
+<!-- ##### FUNCTION vfs_fclose ##### -->
+<para>
+
+</para>
+
+@file: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_feof ##### -->
+<para>
+
+</para>
+
+@file: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_fgets ##### -->
+<para>
+
+</para>
+
+@s: 
+@n: 
+@stream: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_file_test ##### -->
+<para>
+
+</para>
+
+@path: 
+@test: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_fopen ##### -->
+<para>
+
+</para>
+
+@path: 
+@mode: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_fprintf ##### -->
+<para>
+
+</para>
+
+@stream: 
+@format: 
+@Varargs: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_fread ##### -->
+<para>
+
+</para>
+
+@ptr: 
+@size: 
+@nmemb: 
+@file: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_fseek ##### -->
+<para>
+
+</para>
+
+@file: 
+@offset: 
+@whence: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_ftell ##### -->
+<para>
+
+</para>
+
+@file: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_fwrite ##### -->
+<para>
+
+</para>
+
+@ptr: 
+@size: 
+@nmemb: 
+@file: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_getc ##### -->
+<para>
+
+</para>
+
+@stream: 
+@Returns: 
+
 <!-- ##### FUNCTION vfs_init ##### -->
 <para>
 
@@ -42,6 +171,47 @@
 
 @Returns: 
 
+<!-- ##### FUNCTION vfs_is_writeable ##### -->
+<para>
+
+</para>
+
+@path: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_register_transport ##### -->
+<para>
+
+</para>
+
+@vtable: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_rewind ##### -->
+<para>
+
+</para>
+
+@file: 
+
+<!-- ##### FUNCTION vfs_truncate ##### -->
+<para>
+
+</para>
+
+@file: 
+@length: 
+@Returns: 
+
+<!-- ##### FUNCTION vfs_ungetc ##### -->
+<para>
+
+</para>
+
+@c: 
+@stream: 
+@Returns: 
+
 <!-- ##### FUNCTION xmms_entry_new ##### -->
 <para>
 
--- a/doc/libaudacious/tmpl/vfs.sgml	Mon Dec 25 14:50:15 2006 -0800
+++ b/doc/libaudacious/tmpl/vfs.sgml	Tue Dec 26 02:36:33 2006 -0800
@@ -18,189 +18,3 @@
 <!-- ##### SECTION Stability_Level ##### -->
 
 
-<!-- ##### STRUCT VFSFile ##### -->
-<para>
-
-</para>
-
-@uri: 
-@handle: 
-@base: 
-
-<!-- ##### STRUCT VFSConstructor ##### -->
-<para>
-
-</para>
-
-@uri_id: 
-@vfs_fopen_impl: 
-@vfs_fclose_impl: 
-@vfs_fread_impl: 
-@vfs_fwrite_impl: 
-@vfs_getc_impl: 
-@vfs_ungetc_impl: 
-@vfs_fseek_impl: 
-@vfs_rewind_impl: 
-@vfs_ftell_impl: 
-@vfs_feof_impl: 
-@vfs_truncate_impl: 
-
-<!-- ##### FUNCTION vfs_fopen ##### -->
-<para>
-
-</para>
-
-@path: 
-@mode: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_fclose ##### -->
-<para>
-
-</para>
-
-@file: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_fread ##### -->
-<para>
-
-</para>
-
-@ptr: 
-@size: 
-@nmemb: 
-@file: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_fwrite ##### -->
-<para>
-
-</para>
-
-@ptr: 
-@size: 
-@nmemb: 
-@file: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_getc ##### -->
-<para>
-
-</para>
-
-@stream: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_ungetc ##### -->
-<para>
-
-</para>
-
-@c: 
-@stream: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_fgets ##### -->
-<para>
-
-</para>
-
-@s: 
-@n: 
-@stream: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_fseek ##### -->
-<para>
-
-</para>
-
-@file: 
-@offset: 
-@whence: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_rewind ##### -->
-<para>
-
-</para>
-
-@file: 
-
-
-<!-- ##### FUNCTION vfs_ftell ##### -->
-<para>
-
-</para>
-
-@file: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_feof ##### -->
-<para>
-
-</para>
-
-@file: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_file_test ##### -->
-<para>
-
-</para>
-
-@path: 
-@test: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_is_writeable ##### -->
-<para>
-
-</para>
-
-@path: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_truncate ##### -->
-<para>
-
-</para>
-
-@file: 
-@length: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_fprintf ##### -->
-<para>
-
-</para>
-
-@stream: 
-@format: 
-@Varargs: 
-@Returns: 
-
-
-<!-- ##### FUNCTION vfs_register_transport ##### -->
-<para>
-
-</para>
-
-@vtable: 
-@Returns: 
-
-