Revision: 1678
http://gtkpod.svn.sourceforge.net/gtkpod/?rev=1678&view=rev
Author: phantom_sf
Date: 2007-08-15 15:05:50 -0700 (Wed, 15 Aug 2007)
Log Message:
-----------
* Thumbnail view created and thumbnails displayed based on album selected in
album_view.
* Photo toolbar created with buttons for <Create Album>, <Add Image>, <Add
Image Directory>.
* Callback for <Create Album> plumbed into photo window.
Modified Paths:
--------------
gtkpod/branches/photo_support_branch/data/gtkpod.glade
gtkpod/branches/photo_support_branch/src/display_photo.c
gtkpod/branches/photo_support_branch/src/display_photo.h
Modified: gtkpod/branches/photo_support_branch/data/gtkpod.glade
===================================================================
--- gtkpod/branches/photo_support_branch/data/gtkpod.glade 2007-08-09
14:28:52 UTC (rev 1677)
+++ gtkpod/branches/photo_support_branch/data/gtkpod.glade 2007-08-15
22:05:50 UTC (rev 1678)
@@ -20567,13 +20567,76 @@
<property name="spacing">0</property>
<child>
+ <widget class="GtkToolbar" id="toolbar1">
+ <property name="visible">True</property>
+ <property name="orientation">GTK_ORIENTATION_HORIZONTAL</property>
+ <property name="toolbar_style">GTK_TOOLBAR_BOTH</property>
+ <property name="tooltips">True</property>
+ <property name="show_arrow">True</property>
+
+ <child>
+ <widget class="GtkToolButton" id="photo_add_album_button">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Add Album</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-new</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolButton" id="photo_add_image_button">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Add Image</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-file</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+
+ <child>
+ <widget class="GtkToolButton" id="photo_add_image_dir_button">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes">Add Image
Directory</property>
+ <property name="use_underline">True</property>
+ <property name="stock_id">gtk-directory</property>
+ <property name="visible_horizontal">True</property>
+ <property name="visible_vertical">True</property>
+ <property name="is_important">False</property>
+ </widget>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">False</property>
+ </packing>
+ </child>
+
+ <child>
<widget class="GtkHBox" id="hbox214">
<property name="visible">True</property>
<property name="homogeneous">True</property>
<property name="spacing">0</property>
<child>
- <widget class="GtkScrolledWindow" id="photoalbum_window">
+ <widget class="GtkScrolledWindow" id="photo_album_window">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property
name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
@@ -20582,14 +20645,7 @@
<property
name="window_placement">GTK_CORNER_TOP_LEFT</property>
<child>
- <widget class="GtkViewport" id="photo_album_viewport">
- <property name="visible">True</property>
- <property name="shadow_type">GTK_SHADOW_IN</property>
-
- <child>
- <placeholder/>
- </child>
- </widget>
+ <placeholder/>
</child>
</widget>
<packing>
@@ -20600,33 +20656,25 @@
</child>
<child>
- <widget class="GtkLabel" id="label467">
+ <widget class="GtkImage" id="photo_preview_image">
+ <property name="width_request">230</property>
+ <property name="height_request">186</property>
<property name="visible">True</property>
- <property name="label" translatable="yes">This is the
photo_panel</property>
- <property name="use_underline">False</property>
- <property name="use_markup">False</property>
- <property name="justify">GTK_JUSTIFY_LEFT</property>
- <property name="wrap">False</property>
- <property name="selectable">False</property>
<property name="xalign">0.5</property>
<property name="yalign">0.5</property>
<property name="xpad">0</property>
<property name="ypad">0</property>
- <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
- <property name="width_chars">-1</property>
- <property name="single_line_mode">False</property>
- <property name="angle">0</property>
</widget>
<packing>
- <property name="padding">0</property>
+ <property name="padding">2</property>
<property name="expand">False</property>
- <property name="fill">False</property>
+ <property name="fill">True</property>
</packing>
</child>
</widget>
<packing>
- <property name="padding">0</property>
- <property name="expand">True</property>
+ <property name="padding">2</property>
+ <property name="expand">False</property>
<property name="fill">True</property>
</packing>
</child>
Modified: gtkpod/branches/photo_support_branch/src/display_photo.c
===================================================================
--- gtkpod/branches/photo_support_branch/src/display_photo.c 2007-08-09
14:28:52 UTC (rev 1677)
+++ gtkpod/branches/photo_support_branch/src/display_photo.c 2007-08-15
22:05:50 UTC (rev 1678)
@@ -28,29 +28,61 @@
#include "display_photo.h"
#include "display_private.h"
#include "prefs.h"
+#include <glib/gprintf.h>
/* Array recording the current pages of the sorttabs so they can be redisplayed
* if another playlist is selected.
*/
static gint sorttab_pages [SORT_TAB_MAX];
+
+/* ipod database */
+static iTunesDB *ipod_itdb;
+/* Photo Database of selected ipod */
+static PhotoDB *photodb;
+/* Itdb Device for use with getting pixbufs from the database */
+static Itdb_Device *device;
/* Main viewport containing all of the photo related components */
static GtkWidget *photo_viewport = NULL;
/* Window displaying the list of albums */
-static GtkWidget *photo_album_viewport = NULL;
+static GtkWidget *photo_album_window = NULL;
/* Window displaying the thumbnails of the photos */
static GtkWidget *photo_thumb_window = NULL;
/* pointer to the treeview for the photo album display */
-static GtkTreeView *album_listview = NULL;
+static GtkTreeView *album_view = NULL;
+/* pointer to the treeview for the photo thumbnail display */
+static GtkIconView *thumbnail_view = NULL;
+/* pointer to the gtkimage that holds the preview image */
+static GtkImage *photo_preview_image = NULL;
+/* Button on the photo toolbar */
+static GtkToolButton *photo_add_album_button = NULL;
+static GtkToolButton *photo_add_image_button = NULL;
+static GtkToolButton *photo_add_image_dir_button = NULL;
/* Declarations */
-void gp_create_albumview (iTunesDB *itdb);
+static void gp_create_albumview ();
+static void gp_create_thumbnailview ();
+static void gp_build_thumbnail_model (gchar *album_name);
+static void gp_photodb_album_selection_changed (GtkTreeSelection *selection,
gpointer user_data);
+static void gp_photodb_thumb_selection_changed (GtkIconView *iconview,
gpointer user_data);
+static void gp_display_photo_preview (Artwork *artwork);
+void on_photodb_add_album_button_clicked (GtkButton *button, gpointer
user_data);
+void on_photodb_add_image_button_clicked (GtkButton *button, gpointer
user_data);
+void on_photodb_add_image_dir_button_clicked (GtkButton *button, gpointer
user_data);
enum
{
COL_ALBUM_NAME = 0,
- NUM_COLUMNS
+ NUM_ALBUM_COLUMNS
} ;
+enum
+{
+ COL_THUMB_NAIL = 0,
+ COL_THUMB_FILENAME,
+ COL_THUMB_ARTWORK,
+ NUM_THUMB_COLUMNS
+} ;
+
static void debug_list_photos (iTunesDB *itdb)
{
ExtraiTunesDBData *eitdb;
@@ -184,12 +216,26 @@
*/
void gp_photodb_display_photo_window (iTunesDB *itdb)
{
+ ExtraiTunesDBData *eitdb;
+
+ ipod_itdb = itdb;
printf ("Displaying photo window\n");
debug_list_photos (itdb);
+ eitdb = itdb->userdata;
+ photodb = eitdb->photodb;
+ device = itdb->device;
+
+ if (! photodb)
+ {
+ gtkpod_warning (_("Could not access the ipod's photo
database."));
+ return;
+ }
+
gp_photodb_change_to_photo_window (TRUE);
- gp_create_albumview (itdb);
+ gp_create_albumview ();
+ gp_create_thumbnailview ();
}
/**
@@ -242,6 +288,7 @@
gtk_widget_hide_all (coverpanel);
gtk_widget_hide_all (controlbox);
gtk_widget_show (upbutton);
+ /* Hide menu entries and buttons */
gtk_widget_set_sensitive (upbutton, FALSE);
gtk_widget_set_sensitive (addfilesbutton, FALSE);
gtk_widget_set_sensitive (adddirsbutton, FALSE);
@@ -262,11 +309,19 @@
{
photo_xml = glade_xml_new (xml_file, "photo_panel",
NULL);
photowin = gtkpod_xml_get_widget (photo_xml,
"photo_panel");
- photo_album_viewport = gtkpod_xml_get_widget
(photo_xml, "photo_album_viewport");
+ photo_album_window = gtkpod_xml_get_widget (photo_xml,
"photo_album_window");
photo_thumb_window = gtkpod_xml_get_widget (photo_xml,
"photo_thumbnail_window");
+ photo_preview_image = GTK_IMAGE (gtkpod_xml_get_widget
(photo_xml, "photo_preview_image"));
+ photo_add_album_button = GTK_TOOL_BUTTON
(gtkpod_xml_get_widget (photo_xml, "photo_add_album_button"));
+ photo_add_image_button = GTK_TOOL_BUTTON
(gtkpod_xml_get_widget (photo_xml, "photo_add_image_button"));
+ photo_add_image_dir_button = GTK_TOOL_BUTTON
(gtkpod_xml_get_widget (photo_xml, "photo_add_image_dir_button"));
photo_viewport = gtkpod_xml_get_widget (photo_xml,
"photo_viewport");
- g_object_ref (photo_album_viewport);
+ g_object_ref (photo_album_window);
g_object_ref (photo_thumb_window);
+ g_object_ref (photo_preview_image);
+ g_object_ref (photo_add_album_button);
+ g_object_ref (photo_add_image_button);
+ g_object_ref (photo_add_image_dir_button);
g_object_ref (photo_viewport);
gtk_container_remove (GTK_CONTAINER (photowin),
photo_viewport);
/* we don't need this any more */
@@ -275,6 +330,16 @@
if ( gtk_widget_get_parent (photo_viewport) == NULL)
gtk_container_add (GTK_CONTAINER (main_vbox),
photo_viewport);
+
+ /* Bring the toolbar buttons to life */
+ g_signal_connect (G_OBJECT(photo_add_album_button), "clicked",
+
G_CALLBACK(on_photodb_add_album_button_clicked), NULL);
+
+ g_signal_connect (G_OBJECT(photo_add_image_button), "clicked",
+
G_CALLBACK(on_photodb_add_image_button_clicked), NULL);
+
+ g_signal_connect (G_OBJECT(photo_add_image_dir_button),
"clicked",
+
G_CALLBACK(on_photodb_add_image_dir_button_clicked), NULL);
}
else
{
@@ -321,39 +386,33 @@
}
}
-/* Create playlist listview */
-void gp_create_albumview (iTunesDB *itdb)
+/* Create album listview */
+static void gp_create_albumview ()
{
GtkListStore *model;
GtkTreeSelection *selection;
GtkTreeIter iter;
GtkCellRenderer *renderer;
- ExtraiTunesDBData *eitdb;
- PhotoDB *photodb;
GList *gl_album;
-
- eitdb = itdb->userdata;
- photodb = eitdb->photodb;
- g_return_if_fail (photodb);
-
+
/* destroy old listview */
- if (album_listview)
+ if (album_view)
{
- model = GTK_LIST_STORE (gtk_tree_view_get_model
(album_listview));
+ model = GTK_LIST_STORE (gtk_tree_view_get_model (album_view));
g_return_if_fail (model);
g_object_unref (model);
- gtk_widget_destroy (GTK_WIDGET (album_listview));
- album_listview = NULL;
+ gtk_widget_destroy (GTK_WIDGET (album_view));
+ album_view = NULL;
}
/* === Create New One === */
/* create tree view */
- album_listview = GTK_TREE_VIEW (gtk_tree_view_new ());
+ album_view = GTK_TREE_VIEW (gtk_tree_view_new ());
renderer = gtk_cell_renderer_text_new ();
gtk_tree_view_insert_column_with_attributes (
- album_listview,
+ album_view,
-1,
_("Photo Albums"),
renderer,
@@ -361,7 +420,7 @@
NULL);
/* create model */
- model = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING);
+ model = gtk_list_store_new (NUM_ALBUM_COLUMNS, G_TYPE_STRING);
for (gl_album=photodb->photoalbums; gl_album; gl_album=gl_album->next)
{
PhotoAlbum *album = gl_album->data;
@@ -377,23 +436,23 @@
}
/* set tree model */
- gtk_tree_view_set_model (album_listview, GTK_TREE_MODEL (model));
- gtk_tree_view_set_rules_hint (album_listview, TRUE);
+ gtk_tree_view_set_model (album_view, GTK_TREE_MODEL (model));
+ gtk_tree_view_set_rules_hint (album_view, TRUE);
-
gtk_tree_selection_set_mode (
- gtk_tree_view_get_selection (album_listview),
+ gtk_tree_view_get_selection (album_view),
GTK_SELECTION_SINGLE);
- gtk_container_add (GTK_CONTAINER (photo_album_viewport),
GTK_WIDGET(album_listview));
- gtk_widget_show_all (photo_album_viewport);
+ gtk_container_add (GTK_CONTAINER (photo_album_window),
GTK_WIDGET(album_view));
+ gtk_widget_show_all (photo_album_window);
+ /* function to be enacted when the album is changed */
+ selection = gtk_tree_view_get_selection (album_view);
+ g_signal_connect (G_OBJECT (selection), "changed",
+ G_CALLBACK (gp_photodb_album_selection_changed),
NULL);
+
// gtk_widget_set_events (tree, GDK_KEY_RELEASE_MASK);
-//
-// selection = gtk_tree_view_get_selection (album_listview);
-// g_signal_connect (G_OBJECT (selection), "changed",
-// G_CALLBACK (pm_selection_changed), NULL);
-//
+//
// gtk_drag_source_set (GTK_WIDGET (playlist_treeview),
// GDK_BUTTON1_MASK,
// pm_drag_types, TGNR (pm_drag_types),
@@ -441,3 +500,225 @@
// g_signal_connect (G_OBJECT (playlist_treeview), "button-press-event",
// G_CALLBACK (pm_button_press), model);
}
+
+/* Create thumbnail view */
+static void gp_create_thumbnailview ()
+{
+ /* destroy old listview */
+ if (thumbnail_view)
+ {
+ gtk_widget_destroy (GTK_WIDGET (thumbnail_view));
+ thumbnail_view = NULL;
+ }
+
+ /* === Create New One === */
+ gp_build_thumbnail_model (NULL);
+
+ gtk_container_add (GTK_CONTAINER (photo_thumb_window),
GTK_WIDGET(thumbnail_view));
+ gtk_widget_show_all (photo_thumb_window);
+}
+
+/* Build the thumbnail model */
+static void gp_build_thumbnail_model (gchar *album_name)
+{
+ GtkListStore *model;
+ GtkTreeIter iter;
+ PhotoAlbum *album;
+ GList *photos;
+ Thumb *thumb;
+ GdkPixbuf *pixbuf;
+ gint i;
+
+ if (thumbnail_view == NULL)
+ thumbnail_view = GTK_ICON_VIEW (gtk_icon_view_new ());
+
+ model = GTK_LIST_STORE (gtk_icon_view_get_model (thumbnail_view));
+ if (model)
+ gtk_list_store_clear (model);
+ else
+ {
+ /* create model */
+ model = gtk_list_store_new (NUM_THUMB_COLUMNS, GDK_TYPE_PIXBUF,
G_TYPE_STRING, G_TYPE_POINTER);
+ }
+
+ /* Get currently selected album from photo database */
+ album = itdb_photodb_photoalbum_by_name (photodb, album_name);;
+ g_return_if_fail (album);
+
+ for (i = 0, photos = album->members; i < g_list_length (photos); ++i)
+ {
+ Artwork *photo = g_list_nth_data (photos, i);
+ g_return_if_fail (photo);
+
+ thumb = itdb_artwork_get_thumb_by_type (photo,
ITDB_THUMB_PHOTO_LARGE);
+ if (thumb)
+ {
+ pixbuf = itdb_thumb_get_gdk_pixbuf (device, thumb);
+ g_return_if_fail (pixbuf);
+
+ gchar *index = NULL;
+ index = (gchar *) g_malloc (sizeof(gint));
+ g_sprintf (index, "%d", i);
+
+ /* Add a new row to the model */
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter,
+
COL_THUMB_NAIL, pixbuf,
+
COL_THUMB_FILENAME, index,
+
COL_THUMB_ARTWORK, photo,
+ -1);
+ g_free (index);
+ }
+
+ /* On creation of the model, place the first image into the
preview pane */
+ if (i == 0)
+ gp_display_photo_preview (photo);
+ }
+
+ gtk_icon_view_set_model (thumbnail_view, GTK_TREE_MODEL(model));
+ gtk_icon_view_set_pixbuf_column (thumbnail_view, 0);
+ gtk_icon_view_set_text_column (thumbnail_view, 1);
+ gtk_icon_view_set_selection_mode (thumbnail_view,
GTK_SELECTION_MULTIPLE);
+ gtk_icon_view_set_columns (thumbnail_view, 0);
+ gtk_icon_view_set_item_width(thumbnail_view, -1); // let the model
decide how wide
+
+ /* function to be enacted when the thumbnail is changed */
+ g_signal_connect (thumbnail_view, "selection-changed",
+ G_CALLBACK
(gp_photodb_thumb_selection_changed), NULL);
+}
+
+/* Callback when the selection of the album is changed */
+static void gp_photodb_album_selection_changed (GtkTreeSelection *selection,
gpointer user_data)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *album_name = NULL;
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter) == TRUE)
+ { /* handle new selection */
+ gtk_tree_model_get (model, &iter,
+
COL_ALBUM_NAME, &album_name,
+
-1);
+
+ g_return_if_fail (album_name);
+ }
+
+ gp_build_thumbnail_model (album_name);
+}
+
+/* Callback when the selection of a thumbnail image is changed */
+static void gp_photodb_thumb_selection_changed (GtkIconView *iconview,
gpointer user_data)
+{
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ Artwork *artwork;
+ GList *selected_items = NULL;
+
+ selected_items = gtk_icon_view_get_selected_items (iconview);
+
+ if(selected_items == NULL || g_list_length (selected_items) == 0)
+ return;
+
+ model = gtk_icon_view_get_model (iconview);
+ gtk_tree_model_get_iter (model, &iter, selected_items->data);
+ gtk_tree_model_get (model, &iter,
+
COL_THUMB_ARTWORK, &artwork,
+
-1);
+ g_return_if_fail (artwork);
+ gp_display_photo_preview (artwork);
+}
+
+/* Display the selected thumbnail image in the preview window */
+static void gp_display_photo_preview (Artwork *artwork)
+{
+ Thumb *thumb;
+ GdkPixbuf *pixbuf, *scaled;
+ gint width, height;
+ gdouble ratio;
+
+ g_return_if_fail (artwork);
+
+ thumb = itdb_artwork_get_thumb_by_type (artwork,
ITDB_THUMB_PHOTO_FULL_SCREEN);
+ if (thumb)
+ {
+ pixbuf = itdb_thumb_get_gdk_pixbuf (device, thumb);
+ g_return_if_fail (pixbuf);
+
+ /* Size of the preview GtkImage is set to 220x176, technically the
same as PHOTO_FULL_SCREEN */
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ ratio = (gdouble) width / (gdouble) height;
+
+ if (height > PHOTO_FULL_SCREEN_HEIGHT)
+ {
+ height = PHOTO_FULL_SCREEN_HEIGHT;
+ width = ratio * height;
+ }
+
+ if (width > PHOTO_FULL_SCREEN_WIDTH)
+ {
+ width = PHOTO_FULL_SCREEN_WIDTH;
+ height = width / ratio;
+ }
+
+ scaled = gdk_pixbuf_scale_simple (pixbuf, width, height,
GDK_INTERP_NEAREST);
+ gdk_pixbuf_unref (pixbuf);
+
+ gtk_image_set_from_pixbuf (photo_preview_image, scaled);
+ }
+}
+
+/* Callbacks for the toolbar buttons in the photo window */
+void on_photodb_add_album_button_clicked (GtkButton *button, gpointer
user_data)
+{
+ PhotoAlbum *new_album;
+ GtkTreeIter iter;
+ GtkListStore *model;
+ ExtraiTunesDBData *eitdb;
+
+ printf("album button clicked\n");
+ gchar *album_name = get_user_string (
+ _("New Photo Album"),
+ _("Please enter a name for the new photo album"),
+ NULL,
+ NULL,
+ NULL);
+
+ if (album_name == NULL)
+ return;
+
+ /* Check an album with this name doesnt already exist */
+ new_album = itdb_photodb_photoalbum_by_name (photodb, album_name);
+ if (new_album != NULL)
+ {
+ gtkpod_warning (_("An album with that name already exists."));
+ return;
+ }
+
+ /* Album doesn't exist so create it */
+ new_album = itdb_photodb_photoalbum_create (photodb, album_name, -1);
+ if (new_album == NULL)
+ {
+ gtkpod_warning (_("The new album failed to be created."));
+ return;
+ }
+
+ model = GTK_LIST_STORE (gtk_tree_view_get_model (album_view));
+ gtk_list_store_append (model, &iter);
+ gtk_list_store_set (model, &iter,
+
COL_ALBUM_NAME, album_name,
+ -1);
+
+ eitdb = ipod_itdb->userdata;
+ eitdb->data_changed = TRUE;
+}
+
+void on_photodb_add_image_button_clicked (GtkButton *button, gpointer
user_data)
+{
+ printf("image button clicked");
+}
+
+void on_photodb_add_image_dir_button_clicked (GtkButton *button, gpointer
user_data)
+{
+ printf("image dir button clicked");
+}
Modified: gtkpod/branches/photo_support_branch/src/display_photo.h
===================================================================
--- gtkpod/branches/photo_support_branch/src/display_photo.h 2007-08-09
14:28:52 UTC (rev 1677)
+++ gtkpod/branches/photo_support_branch/src/display_photo.h 2007-08-15
22:05:50 UTC (rev 1678)
@@ -41,6 +41,9 @@
* purposes only.
*/
#define GP_PL_TYPE_PHOTO 2
+/* The values set in itdb_artwork.c for the width and height of
ITDB_THUMB_PHOTO_FULL_SCREEN */
+#define PHOTO_FULL_SCREEN_WIDTH 220
+#define PHOTO_FULL_SCREEN_HEIGHT 176
void gp_photodb_load_photodb (iTunesDB *itdb);
gboolean gp_photodb_ipod_supports_photos (iTunesDB *itdb);
@@ -50,12 +53,4 @@
-
-
-
-
-
-
-
-
#endif /*DISPLAY_PHOTO_H_*/
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2