<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:syn="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/">
  <channel rdf:about="http://blog.gmane.org/gmane.comp.ipod.gtkpod.cvs">
    <title>gmane.comp.ipod.gtkpod.cvs</title>
    <link>http://blog.gmane.org/gmane.comp.ipod.gtkpod.cvs</link>
    <description/>
    <syn:updatePeriod>hourly</syn:updatePeriod>
    <syn:updateFrequency>1</syn:updateFrequency>
    <syn:updateBase>1901-01-01T00:00+00:00</syn:updateBase>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3649"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3648"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3647"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3646"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3645"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3644"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3643"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3642"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3641"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3640"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3639"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3638"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3637"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3636"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3635"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3634"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3633"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3632"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3631"/>
        <rdf:li rdf:resource="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3630"/>
      </rdf:Seq>
    </items>
    <image rdf:resource="http://gmane.org/img/gmane-25t.png"/>
    <textinput rdf:resource=""/>
  </channel>
  <image rdf:about="http://gmane.org/img/gmane-25t.png">
    <title>Gmane</title>
    <url>http://gmane.org/img/gmane-25t.png</url>
    <link>http://gmane.org</link>
  </image>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3649">
    <title>[gtpd-cvs] [gtkpod] Fix showing tracks of selected artist on 64-bitsystems</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3649</link>
    <description>&lt;pre&gt;commit 665fe093cb053559deef0a9bc6c8d41e7ad6ca08
Author: Daniele Forsi &amp;lt;daniele&amp;lt; at &amp;gt;forsi.it&amp;gt;
Date:   Thu Feb 28 22:07:14 2013 +0100

    Fix showing tracks of selected artist on 64-bit systems
    
    The return value of gdk_threads_add_idle_full() is guint and is
    greater than 0; see
    http://developer.gnome.org/gdk/2.22/gdk-Threads.html#gdk-threads-add-idle-full
    
    Bug reported in http://sourceforge.net/mailarchive/message.php?msg_id=30490385

 plugins/sorttab_display/normal_sorttab_page.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
---
diff --git a/plugins/sorttab_display/normal_sorttab_page.c b/plugins/sorttab_display/normal_sorttab_page.c
index ee00304..00d9c11 100644
--- a/plugins/sorttab_display/normal_sorttab_page.c
+++ b/plugins/sorttab_display/normal_sorttab_page.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -41,7 +41,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "normal_sorttab_page.h"
 #include "sorttab_display_context_menu.h"
 
-#define NO_IDLE_SELECTION_CALLBACK -1
+#define NO_IDLE_SELECTION_CALLBACK 0
 
 G_DEFINE_TYPE( NormalSortTabPage, normal_sort_tab_page, GTK_TYPE_TREE_VIEW);
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -570,7 +570,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static gboolean _st_selection_changed_cb(gpointer data) {
 static void _st_selection_changed(GtkTreeSelection *selection, gpointer user_data) {
 
     NormalSortTabPage *self = NORMAL_SORT_TAB_PAGE(user_data);
-    gulong idleId = NO_IDLE_SELECTION_CALLBACK;
+    guint idleId = NO_IDLE_SELECTION_CALLBACK;
 
     if (self) {
         NormalSortTabPagePrivate *priv = NORMAL_SORT_TAB_PAGE_GET_PRIVATE(self);

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
&lt;/pre&gt;</description>
    <dc:creator>dforsi</dc:creator>
    <dc:date>2013-02-28T21:11:13</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3648">
    <title>[gtpd-cvs] [gtkpod] Revert "Fix showing tracks of selected artiston 64-bit systems"</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3648</link>
    <description>&lt;pre&gt;commit d4e665b59a73d43a8a8be7d428cb1ccef9e80d96
Author: Daniele Forsi &amp;lt;daniele&amp;lt; at &amp;gt;forsi.it&amp;gt;
Date:   Thu Feb 28 21:57:58 2013 +0100

    Revert "Fix showing tracks of selected artist on 64-bit systems"
    
    This reverts commit 3732944d096943125e4a51f753644a00726acc68.

 plugins/sorttab_display/normal_sorttab_page.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/plugins/sorttab_display/normal_sorttab_page.c b/plugins/sorttab_display/normal_sorttab_page.c
index 0fb3286..ee00304 100644
--- a/plugins/sorttab_display/normal_sorttab_page.c
+++ b/plugins/sorttab_display/normal_sorttab_page.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,7 +66,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _NormalSortTabPagePrivate {
      * Handler id of the idle callback when the selection
      * changed callback is executed
      */
-    gulong selection_changed_idle_id;
+    guint selection_changed_idle_id;
 
     /* name of entry last selected */
     GList *last_selection;

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_feb
&lt;/pre&gt;</description>
    <dc:creator>dforsi</dc:creator>
    <dc:date>2013-02-28T21:11:07</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3647">
    <title>[gtpd-cvs] [gtkpod] Fix showing tracks of selected artist on 64-bitsystems</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3647</link>
    <description>&lt;pre&gt;commit 3732944d096943125e4a51f753644a00726acc68
Author: Benno &amp;lt;fwxx&amp;lt; at &amp;gt;rocketmail.com&amp;gt;
Date:   Fri Feb 15 18:27:24 2013 +0100

    Fix showing tracks of selected artist on 64-bit systems
    
    The handler_id is of type gulong (while signal_id is guint); see
    http://developer.gnome.org/gobject/unstable/gobject-Signals.html
    
    Bug reported in http://sourceforge.net/mailarchive/message.php?msg_id=30490385

 plugins/sorttab_display/normal_sorttab_page.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/plugins/sorttab_display/normal_sorttab_page.c b/plugins/sorttab_display/normal_sorttab_page.c
index ee00304..0fb3286 100644
--- a/plugins/sorttab_display/normal_sorttab_page.c
+++ b/plugins/sorttab_display/normal_sorttab_page.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -66,7 +66,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _NormalSortTabPagePrivate {
      * Handler id of the idle callback when the selection
      * changed callback is executed
      */
-    guint selection_changed_idle_id;
+    gulong selection_changed_idle_id;
 
     /* name of entry last selected */
     GList *last_selection;

------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
&lt;/pre&gt;</description>
    <dc:creator>dforsi</dc:creator>
    <dc:date>2013-02-15T17:34:26</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3646">
    <title>[gtpd-cvs] [gtkpod] Fix possible crasher</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3646</link>
    <description>&lt;pre&gt;commit 881b49115e4e37174b5250fe7e4780a536762ef2
Author: Daniele Forsi &amp;lt;daniele&amp;lt; at &amp;gt;forsi.it&amp;gt;
Date:   Fri Feb 15 12:14:24 2013 +0100

    Fix possible crasher
    
    When opening the About dialog for the second time, a variable pointed
    to freed memory.
    
    Fixes:
    (lt-gtkpod:13277): Gtk-WARNING **: Failed to set text from markup due to error parsing markup: Error on line 1 char 36: Invalid UTF-8 encoded text in name - not valid ' \xc5\xc5h\xdd\xc3'
    
    (lt-gtkpod:13277): Pango-WARNING **: Invalid UTF-8 string passed to pango_layout_set_text()

 src/anjuta-about.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
---
diff --git a/src/anjuta-about.c b/src/anjuta-about.c
index 112bbd5..988ff1b 100644
--- a/src/anjuta-about.c
+++ b/src/anjuta-about.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -142,6 +142,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void about_free_credit(void) {
         g_free(ptr[i]);
 
     g_free(translators);
+    translators = NULL;
 }
 
 GtkWidget *about_box_new(GtkWindow *parent) {

------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
&lt;/pre&gt;</description>
    <dc:creator>dforsi</dc:creator>
    <dc:date>2013-02-15T11:54:20</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3645">
    <title>[gtpd-cvs] [gtkpod] Fix tabs</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3645</link>
    <description>&lt;pre&gt;commit 0fae682cd063a62ecbf004b71a2c86e36ca5df04
Author: Daniele Forsi &amp;lt;daniele&amp;lt; at &amp;gt;forsi.it&amp;gt;
Date:   Fri Feb 15 11:37:41 2013 +0100

    Fix tabs

 AUTHORS |   18 +++++++++---------
 1 files changed, 9 insertions(+), 9 deletions(-)
---
diff --git a/AUTHORS b/AUTHORS
index aa4912d..f9c096e 100644
--- a/AUTHORS
+++ b/AUTHORS
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -69,7 +69,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; esJavier Kohen &amp;lt;jkohen at users.sourceforge.net&amp;gt;
 
 svStefan Asserhall &amp;lt;stefan.asserhall at comhem dot se&amp;gt;
 
-zh_CNTan Zhixin &amp;lt;tanzhxin&amp;lt; at &amp;gt;gmail.com&amp;gt;
+zh_CNTan Zhixin &amp;lt;tanzhxin&amp;lt; at &amp;gt;gmail.com&amp;gt;
   Américo Wang &amp;lt;xiyou.wangcong at gmail.com&amp;gt;
 
 Website:
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -81,17 +81,17 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; Paul Richardson &amp;lt;phantom_sf at users dot sourceforge dot net&amp;gt;
 Note:
 -------------------------------------------------------------------------------
 This program borrows code from the following projects
-gnutools- mktunes.pl, ported to C, reading and writing 
- of iTunesDB  &amp;lt;http://www.gnu.org/software/gnupod/&amp;gt;
-
+gnutools- mktunes.pl, ported to C, reading and writing 
+  of iTunesDB  &amp;lt;http://www.gnu.org/software/gnupod/&amp;gt;
+
 iPod.cpp/h- by Samuel Wood &amp;lt;sam dot wood at gmail dot com&amp;gt; 
-some code for smart playlists is based on his C++-classes.
-
+  some code for smart playlists is based on his C++-classes.
+
 mp3info- mp3 playlength detection &amp;lt;http://ibiblio.org/mp3info/&amp;gt;
-
+
 xmms- dirbrowser, mp3 playlength detection &amp;lt;http://www.xmms.org&amp;gt;
-
-sound-juicer - by Ross Burton &amp;lt;ross&amp;lt; at &amp;gt;burtonini.com&amp;gt; &amp;lt;http://http://live.gnome.org/SoundJuicer&amp;gt;
+
+sound-juicer- by Ross Burton &amp;lt;ross&amp;lt; at &amp;gt;burtonini.com&amp;gt; &amp;lt;http://live.gnome.org/SoundJuicer&amp;gt;
 
 The GUI was created with the help of glade &amp;lt;http://glade.gnome.org/&amp;gt; and anjuta &amp;lt;http://projects.gnome.org/anjuta&amp;gt;.
 

------------------------------------------------------------------------------
Free Next-Gen Firewall Hardware Offer
Buy your Sophos next-gen firewall before the end March 2013 
and get the hardware for free! Learn more.
http://p.sf.net/sfu/sophos-d2d-feb
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2&amp;lt; at &amp;gt;lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2
&lt;/pre&gt;</description>
    <dc:creator>dforsi</dc:creator>
    <dc:date>2013-02-15T11:54:14</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3644">
    <title>[gtpd-cvs] [gtkpod] Update Italian translation</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3644</link>
    <description>&lt;pre&gt;commit 5490dee7df08b604b0b4df47bbd9c1bce93b05e7
Author: Daniele Forsi &amp;lt;daniele&amp;lt; at &amp;gt;forsi.it&amp;gt;
Date:   Tue Dec 4 22:56:12 2012 +0100

    Update Italian translation

 po/it.po |  171 ++++++++++++++++++++++++++++++++++++--------------------------
 1 files changed, 100 insertions(+), 71 deletions(-)
---
diff --git a/po/it.po b/po/it.po
index 61a3af3..981ca1b 100644
--- a/po/it.po
+++ b/po/it.po
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -16,8 +16,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid ""
 msgstr ""
 "Project-Id-Version: gtkpod\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-07-14 00:09+0200\n"
-"PO-Revision-Date: 2012-07-13 22:48+0200\n"
+"POT-Creation-Date: 2012-12-04 22:09+0100\n"
+"PO-Revision-Date: 2012-12-04 22:22+0100\n"
 "Last-Translator: Daniele Forsi &amp;lt;dforsi&amp;lt; at &amp;gt;gmail.com&amp;gt;\n"
 "Language-Team: Italian &amp;lt;tp&amp;lt; at &amp;gt;lists.linux.it&amp;gt;\n"
 "Language: it\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -674,7 +674,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "Testi non scritti, tipo del file non determinabile (%s).\n"
 "\n"
 
-#: ../libgtkpod/file.c:2185
+#: ../libgtkpod/file.c:2185 ../libgtkpod/file.c:2190
 #, c-format
 msgid ""
 "Lyrics not written due to the error:\n"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -685,15 +685,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "\n"
 "%s"
 
-#: ../libgtkpod/file.c:2190
-#, c-format
-msgid ""
-"Lyrics not written due to the error:\n"
-"%s"
-msgstr ""
-"Testi non scritti a causa dell'errore:\n"
-"%s"
-
 #: ../libgtkpod/file_convert.c:419
 msgid "errors"
 msgstr "errori"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1449,7 +1440,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr[0] "Rimuovere la traccia dal database locale?"
 msgstr[1] "Rimuovere le tracce dal database locale?"
 
 #: ../libgtkpod/misc_conversion.c:60
-#: ../plugins/sorttab_display/normal_sorttab_page.c:934
+#: ../plugins/sorttab_display/normal_sorttab_page.c:965
 msgid "All"
 msgstr "Tutti"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1457,7 +1448,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Tutti"
 #: ../libgtkpod/misc_conversion.c:61
 #: ../plugins/core_preferences/core_prefs.xml.h:116
 #: ../plugins/playlist_display/playlist_display_spl.c:78
-#: ../plugins/sorttab_display/sorttab_widget.c:241
+#: ../plugins/sorttab_display/sorttab_widget.c:243
 #: ../plugins/sjcd/egg-play-preview.c:199
 msgid "Album"
 msgstr "Album"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1465,7 +1456,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Album"
 #: ../libgtkpod/misc_conversion.c:62
 #: ../plugins/core_preferences/core_prefs.xml.h:112
 #: ../plugins/playlist_display/playlist_display_spl.c:79
-#: ../plugins/sorttab_display/sorttab_widget.c:238
+#: ../plugins/sorttab_display/sorttab_widget.c:240
 #: ../plugins/sjcd/egg-play-preview.c:189 ../plugins/sjcd/sj-main.c:521
 #: ../plugins/sjcd/sj-main.c:1527
 msgid "Artist"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1474,7 +1465,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Artista"
 #: ../libgtkpod/misc_conversion.c:63
 #: ../plugins/core_preferences/core_prefs.xml.h:113
 #: ../plugins/playlist_display/playlist_display_spl.c:77
-#: ../plugins/sorttab_display/sorttab_widget.c:250
+#: ../plugins/sorttab_display/sorttab_widget.c:252
 #: ../plugins/sjcd/egg-play-preview.c:179 ../plugins/sjcd/sj-main.c:515
 #: ../plugins/sjcd/sj-main.c:1518
 msgid "Title"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1483,7 +1474,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Titolo"
 #: ../libgtkpod/misc_conversion.c:64
 #: ../plugins/core_preferences/core_prefs.xml.h:114
 #: ../plugins/playlist_display/playlist_display_spl.c:83
-#: ../plugins/sorttab_display/sorttab_widget.c:244
+#: ../plugins/sorttab_display/sorttab_widget.c:246
 msgid "Genre"
 msgstr "Genere"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1521,7 +1512,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid "Track Nr (#)"
 msgstr "Numero traccia"
 
 #: ../libgtkpod/misc_conversion.c:72
-#: ../plugins/track_display/display_tracks.c:1851
+#: ../plugins/track_display/display_tracks.c:1894
 msgid "Transferred"
 msgstr "Trasferito"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1556,7 +1547,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Contatore riproduzioni"
 
 #: ../libgtkpod/misc_conversion.c:79
 #: ../plugins/playlist_display/playlist_display_spl.c:95
-#: ../plugins/track_display/display_tracks.c:1839
+#: ../plugins/track_display/display_tracks.c:1882
 msgid "Rating"
 msgstr "Voto"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1586,8 +1577,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Ver. livello sonoro"
 
 #: ../libgtkpod/misc_conversion.c:85
 #: ../plugins/playlist_display/playlist_display_spl.c:82
-#: ../plugins/sorttab_display/sorttab_widget.c:253
-#: ../plugins/track_display/display_tracks.c:1887
+#: ../plugins/sorttab_display/sorttab_widget.c:255
+#: ../plugins/track_display/display_tracks.c:1930
 msgid "Year"
 msgstr "Anno"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2497,12 +2488,20 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 "«%s» ha restituito il seguente output:\n"
 "%s\n"
 
-#: ../libs/atomic-parsley/AtomicParsleyBridge.cpp:465
+# Titolo di ripiego se non è stato letto uno dal file 
+#. chapter title couldn't be found; create our own titles (and some ipods don't display them anyway).
+#. Translators: this string is used to create a chapter title when no chapter title could be found
+#: ../libs/atomic-parsley/AtomicParsleyBridge.cpp:266
+#, c-format
+msgid "Chapter %3d"
+msgstr "Capitolo %3d"
+
+#: ../libs/atomic-parsley/AtomicParsleyBridge.cpp:636
 #, c-format
 msgid "ERROR %s is not itunes style."
 msgstr "ERRORE %s non è nello stile di iTunes."
 
-#: ../libs/atomic-parsley/AtomicParsleyBridge.cpp:664
+#: ../libs/atomic-parsley/AtomicParsleyBridge.cpp:853
 #, c-format
 msgid "ERROR failed to change track file's artwork."
 msgstr "ERRORE impossibile cambiare il file con la copertina della traccia."
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2897,7 +2896,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid "&amp;lt;b&amp;gt;On-the-fly Conversion&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Conversione al volo&amp;lt;/b&amp;gt;"
 
 #. Register actions
-#: ../plugins/core_preferences/core_prefs.xml.h:107 ../src/anjuta-app.c:511
+#: ../plugins/core_preferences/core_prefs.xml.h:107 ../src/anjuta-app.c:516
 msgid "Music"
 msgstr "Musica"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3060,6 +3059,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "&amp;lt;b&amp;gt;Riquadro delle copertine&amp;lt;/b&amp;gt;"
 #: ../plugins/cover_display/cover_display.xml.h:8
 #: ../plugins/playlist_display/playlist_display.xml.h:4
 #: ../plugins/sorttab_display/sorttab_display.xml.h:18
+#: ../plugins/track_display/track_display.xml.h:7
 #: ../plugins/clarity/clarity.xml.h:6
 msgid "&amp;lt;b&amp;gt;Ascending&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Crescente&amp;lt;/b&amp;gt;"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3067,6 +3067,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "&amp;lt;b&amp;gt;Crescente&amp;lt;/b&amp;gt;"
 #: ../plugins/cover_display/cover_display.xml.h:9
 #: ../plugins/playlist_display/playlist_display.xml.h:5
 #: ../plugins/sorttab_display/sorttab_display.xml.h:19
+#: ../plugins/track_display/track_display.xml.h:8
 #: ../plugins/clarity/clarity.xml.h:7
 msgid "&amp;lt;b&amp;gt;Descending&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Decrescente&amp;lt;/b&amp;gt;"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3074,6 +3075,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "&amp;lt;b&amp;gt;Decrescente&amp;lt;/b&amp;gt;"
 #: ../plugins/cover_display/cover_display.xml.h:10
 #: ../plugins/playlist_display/playlist_display.xml.h:6
 #: ../plugins/sorttab_display/sorttab_display.xml.h:20
+#: ../plugins/track_display/track_display.xml.h:13
 #: ../plugins/clarity/clarity.xml.h:8
 msgid "&amp;lt;b&amp;gt;None&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Nessuno&amp;lt;/b&amp;gt;"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -3081,7 +3083,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "&amp;lt;b&amp;gt;Nessuno&amp;lt;/b&amp;gt;"
 #: ../plugins/cover_display/cover_display.xml.h:11
 #: ../plugins/playlist_display/playlist_display.xml.h:7
 #: ../plugins/sorttab_display/sorttab_display.xml.h:21
-#: ../plugins/track_display/track_display.xml.h:7
+#: ../plugins/track_display/track_display.xml.h:14
 #: ../plugins/clarity/clarity.xml.h:9
 msgid "Case sensitive sorting"
 msgstr "Distinguere MAIUSCOLE/minuscole nell'ordinamento"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4380,7 +4382,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr ""
 
 #. display message in statusbar
 #: ../plugins/playlist_display/display_playlists.c:487
-#: ../plugins/track_display/display_tracks.c:345
+#: ../plugins/track_display/display_tracks.c:391
 #, c-format
 msgid "Copied one track"
 msgid_plural "Copied %d tracks"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4427,7 +4429,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Ignora le regole"
 
 #: ../plugins/playlist_display/playlist_display.xml.h:8
 #: ../plugins/sorttab_display/sorttab_display.xml.h:22
-#: ../plugins/track_display/track_display.xml.h:8
+#: ../plugins/track_display/track_display.xml.h:15
 msgid ""
 "If checked, sorting will be case sensitive. Please note that case sensitive "
 "sorting will not work well with most charsets."
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -4977,7 +4979,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid "Add playlist to selected iPod"
 msgstr "Aggiunge una playlist all'iPod selezionato"
 
 #: ../plugins/playlist_display/plugin.c:124
-#: ../plugins/track_display/plugin.c:219
+#: ../plugins/track_display/plugin.c:216
 msgid "Normalize"
 msgstr "Normalizza"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5611,7 +5613,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid "Last Modified"
 msgstr "Ultima modifica"
 
 #: ../plugins/sorttab_display/sorttab_display.xml.h:14
-#: ../plugins/track_display/display_tracks.c:1881
+#: ../plugins/track_display/display_tracks.c:1924
 msgid "Added"
 msgstr "Aggiunto"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5815,20 +5817,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Copia"
 msgid "Copy selected track(s) to"
 msgstr "Copia tracce selezionate su"
 
-#: ../plugins/sorttab_display/normal_sorttab_page.c:961
+#: ../plugins/sorttab_display/normal_sorttab_page.c:992
 msgid "Compilations"
 msgstr "Compilation"
 
-#: ../plugins/sorttab_display/sorttab_widget.c:247
+#: ../plugins/sorttab_display/normal_sorttab_page.c:995
+msgid "No Metadata Value"
+msgstr "Nessun valore per il metadato"
+
+#: ../plugins/sorttab_display/sorttab_widget.c:249
 msgid "Comp."
 msgstr "Comp."
 
-#: ../plugins/sorttab_display/sorttab_widget.c:256
+#: ../plugins/sorttab_display/sorttab_widget.c:258
 msgid "Special"
 msgstr "Speciale"
 
 #. no tracks selected
-#: ../plugins/sorttab_display/sorttab_widget.c:716
+#: ../plugins/sorttab_display/sorttab_widget.c:718
 msgid "No tracks selected."
 msgstr "Nessuna traccia selezionata."
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5852,59 +5858,59 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Plugin linguette ordinamento"
 msgid "Filter Track View"
 msgstr "Visualizza e filtra le tracce"
 
-#: ../plugins/track_display/display_tracks.c:341
+#: ../plugins/track_display/display_tracks.c:387
 #, c-format
 msgid "Moved one track"
 msgid_plural "Moved %d tracks"
 msgstr[0] "Spostata una traccia"
 msgstr[1] "Spostate %d tracce"
 
-#: ../plugins/track_display/display_tracks.c:1842
+#: ../plugins/track_display/display_tracks.c:1885
 msgid "#"
 msgstr "N°"
 
-#: ../plugins/track_display/display_tracks.c:1845
+#: ../plugins/track_display/display_tracks.c:1888
 msgid "CD"
 msgstr "CD"
 
-#: ../plugins/track_display/display_tracks.c:1848
+#: ../plugins/track_display/display_tracks.c:1891
 msgid "ID"
 msgstr "ID"
 
-#: ../plugins/track_display/display_tracks.c:1862
+#: ../plugins/track_display/display_tracks.c:1905
 msgid "Cmpl"
 msgstr "Cmpl"
 
-#: ../plugins/track_display/display_tracks.c:1869
+#: ../plugins/track_display/display_tracks.c:1912
 msgid "Time"
 msgstr "Durata"
 
-#: ../plugins/track_display/display_tracks.c:1872
+#: ../plugins/track_display/display_tracks.c:1915
 msgid "Plycnt"
 msgstr "Conta rip."
 
-#: ../plugins/track_display/display_tracks.c:1875
+#: ../plugins/track_display/display_tracks.c:1918
 msgid "Played"
 msgstr "Riprodotto"
 
-#: ../plugins/track_display/display_tracks.c:1878
+#: ../plugins/track_display/display_tracks.c:1921
 msgid "Modified"
 msgstr "Modificato"
 
-#: ../plugins/track_display/display_tracks.c:1884
+#: ../plugins/track_display/display_tracks.c:1927
 msgid "Released"
 msgstr "Pubblicato"
 
-#: ../plugins/track_display/display_tracks.c:1890
+#: ../plugins/track_display/display_tracks.c:1933
 msgid "Vol."
 msgstr "Vol."
 
-#: ../plugins/track_display/display_tracks.c:1893
+#: ../plugins/track_display/display_tracks.c:1936
 msgid "Sndchk."
 msgstr "Ver. liv. sonoro"
 
-#: ../plugins/track_display/plugin.c:47 ../plugins/track_display/plugin.c:113
-#: ../plugins/track_display/track_display.xml.h:13
+#: ../plugins/track_display/plugin.c:47 ../plugins/track_display/plugin.c:110
+#: ../plugins/track_display/track_display.xml.h:21
 msgid "Track Display"
 msgstr "Mostra tracce"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5920,7 +5926,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Tracce selezionate dal database"
 msgid "Selected Tracks from Device"
 msgstr "Tracce selezionate dall'iPod"
 
-#: ../plugins/track_display/plugin.c:137
+#: ../plugins/track_display/plugin.c:134
 msgid "  Playlist Tracks"
 msgstr "  Tracce playlist"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5941,35 +5947,51 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgid "&amp;lt;b&amp;gt;Displayed Columns&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Colonne visualizzate&amp;lt;/b&amp;gt;"
 
 #: ../plugins/track_display/track_display.xml.h:5
-msgid "Modify selected tracks sort order in selected playlist"
+msgid "Automatically sort selected tracks in selected playlist"
 msgstr ""
-"Modificare l'ordinamento delle tracce selezionate nella playlist selezionata"
+"Ordinare automaticamente le tracce selezionate nella playlist selezionata"
 
 #: ../plugins/track_display/track_display.xml.h:6
 msgid ""
-"if checked, the sort order of the displayed tracks will be applied to the "
-"selected playlist."
+"if checked, the sort order (defined below) will be applied to the selected "
+"playlist."
 msgstr ""
-"Se selezionata, l'ordinamento delle tracce visualizzate sarà applicato alla "
-"playlist selezionata."
+"Se selezionata, l'ordinamento definito sotto sarà applicato alla playlist "
+"selezionata."
 
 #: ../plugins/track_display/track_display.xml.h:9
+msgid ""
+"Sort order applied to displayed tracks.\n"
+"\n"
+"This is only applied if the 'auto sort tracks' \n"
+"checkbox (above) is checked."
+msgstr ""
+"L'ordinamento applicato alle tracce visualizzate.\n"
+"\n"
+"È applicato solo se la casella «Ordinare automaticamente»\n"
+"precedente è selezionata."
+
+#: ../plugins/track_display/track_display.xml.h:16
+msgid "&amp;lt;b&amp;gt;Track Display Sort Order&amp;lt;/b&amp;gt;"
+msgstr "&amp;lt;b&amp;gt;Ordinamento mostra tracce&amp;lt;/b&amp;gt;"
+
+#: ../plugins/track_display/track_display.xml.h:17
 msgid "&amp;lt;b&amp;gt;Sorting Options&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Opzioni di ordinamento&amp;lt;/b&amp;gt;"
 
-#: ../plugins/track_display/track_display.xml.h:10
+#: ../plugins/track_display/track_display.xml.h:18
 msgid "Ignore these words when at the beginning of the following fields:"
 msgstr "Ignorare queste parole quando sono all'inizio dei campi seguenti:"
 
-#: ../plugins/track_display/track_display.xml.h:11
+#: ../plugins/track_display/track_display.xml.h:19
 msgid "&amp;lt;b&amp;gt;Ignore Frequent Words&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Parole comuni da ignorare&amp;lt;/b&amp;gt;"
 
-#: ../plugins/track_display/track_display.xml.h:12
+#: ../plugins/track_display/track_display.xml.h:20
 msgid "&amp;lt;b&amp;gt;Preferred Track Execution Command&amp;lt;/b&amp;gt;"
 msgstr "&amp;lt;b&amp;gt;Comando preferito per eseguire le tracce&amp;lt;/b&amp;gt;"
 
-#: ../plugins/track_display/track_display.xml.h:14
+#: ../plugins/track_display/track_display.xml.h:22
 msgid "&amp;lt;span weight='bold' size='larger'&amp;gt;No playlist selected&amp;lt;/span&amp;gt;"
 msgstr "&amp;lt;span weight='bold' size='larger'&amp;gt;Nessuna playlist selezionata&amp;lt;/span&amp;gt;"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -5985,15 +6007,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Plugin mostra tracce"
 msgid "Track View"
 msgstr "Mostra tracce"
 
-#: ../plugins/track_display/track_display_preferences.c:235
+#: ../plugins/track_display/track_display_preferences.c:236
 msgid "New Word to Ignore"
 msgstr "Nuova parola da ignorare"
 
-#: ../plugins/track_display/track_display_preferences.c:235
+#: ../plugins/track_display/track_display_preferences.c:236
 msgid "Please enter a word for sorting functions to ignore"
 msgstr "Inserire una parola da ignorare nelle funzioni di ordinamento"
 
-#: ../plugins/track_display/track_display_preferences.c:254
+#: ../plugins/track_display/track_display_preferences.c:255
 #, c-format
 msgid "The word %s is already in the \"Ignored Frequent Word\" list"
 msgstr "La parola «%s» è già nell'elenco di «Parole comuni da ignorare»"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6845,44 +6867,44 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Informazioni sui _plugin esterni"
 msgid "About third party gtkpod plugins"
 msgstr "Informazioni sui plugin di gtkpod di terze parti"
 
-#: ../src/anjuta-app.c:512
+#: ../src/anjuta-app.c:517
 msgid "Edit"
 msgstr "Modifica"
 
-#: ../src/anjuta-app.c:513 ../src/anjuta-app.c:514
+#: ../src/anjuta-app.c:518 ../src/anjuta-app.c:519
 msgid "View"
 msgstr "Visualizza"
 
-#: ../src/anjuta-app.c:515
+#: ../src/anjuta-app.c:520
 msgid "Tools"
 msgstr "Strumenti"
 
-#: ../src/anjuta-app.c:516
+#: ../src/anjuta-app.c:521
 msgid "Help"
 msgstr "Aiuto"
 
-#: ../src/anjuta-app.c:729
+#: ../src/anjuta-app.c:734
 msgid " Plugins"
 msgstr " Plugin"
 
-#: ../src/anjuta-app.c:741
+#: ../src/anjuta-app.c:746
 msgid "Installed plugins"
 msgstr "Plugin installati"
 
-#: ../src/anjuta-app.c:742
+#: ../src/anjuta-app.c:747
 msgid "Preferred plugins"
 msgstr "Plugin preferiti"
 
-#: ../src/anjuta-app.c:743
+#: ../src/anjuta-app.c:748
 msgid "Shortcuts"
 msgstr "Scorciatoie"
 
-#: ../src/anjuta-app.c:802
+#: ../src/anjuta-app.c:807
 #, c-format
 msgid "Value doesn't exist"
 msgstr "Il valore non esiste"
 
-#: ../src/anjuta-app.c:1420
+#: ../src/anjuta-app.c:1425
 msgid "Confirmation"
 msgstr "Conferma"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -6894,6 +6916,13 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; msgstr "Sessione caricata"
 msgid "- Interface with your iPod"
 msgstr "- Interfaccia per iPod"
 
+#~ msgid ""
+#~ "Lyrics not written due to the error:\n"
+#~ "%s"
+#~ msgstr ""
+#~ "Testi non scritti a causa dell'errore:\n"
+#~ "%s"
+
 #~ msgid "Press button to abort."
 #~ msgstr "Premere il pulsante per interrompere."
 

------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2&amp;lt; at &amp;gt;lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2
&lt;/pre&gt;</description>
    <dc:creator>dforsi</dc:creator>
    <dc:date>2012-12-04T21:58:35</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3643">
    <title>[gtpd-cvs] [gtkpod] make MP4 generated chapter names translateable</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3643</link>
    <description>&lt;pre&gt;commit 474b4287771b95a6e8407b72c39c15d700e206d4
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Mon Nov 12 16:36:11 2012 -0700

    make MP4 generated chapter names translateable
    
    Thanks to Daniele Forsi for the suggestion

 libs/atomic-parsley/AtomicParsleyBridge.cpp |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)
---
diff --git a/libs/atomic-parsley/AtomicParsleyBridge.cpp b/libs/atomic-parsley/AtomicParsleyBridge.cpp
index 25ba8af..4841af2 100644
--- a/libs/atomic-parsley/AtomicParsleyBridge.cpp
+++ b/libs/atomic-parsley/AtomicParsleyBridge.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -261,9 +261,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
                 }
                 else
                 {
-                    // chapter title couldn't be found; create our own titles
-                    // (and some ipods don't display them anyway)
-                    title = g_strdup_printf("Chapter %3d", i);
+                    // chapter title couldn't be found; create our own titles (and some ipods don't display them anyway).
+                    // Translators: this string is used to create a chapter title when no chapter title could be found
+                    title = g_strdup_printf(_("Chapter %3d"), i);
                 }
 
                 if (!timescale) // assume 1000, also, don't divide by 0

------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-13T01:46:39</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3642">
    <title>[gtpd-cvs] [gtkpod] MP4 text tags are already UTF-8. Remove UTF-8conversion.</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3642</link>
    <description>&lt;pre&gt;commit 0fd91b5fe7e93e5b2409b7b5a36e9dd052042237
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Mon Nov 12 16:12:58 2012 -0700

    MP4 text tags are already UTF-8. Remove UTF-8 conversion.

 libs/atomic-parsley/AtomicParsleyBridge.cpp |   28 +++++++++++++-------------
 1 files changed, 14 insertions(+), 14 deletions(-)
---
diff --git a/libs/atomic-parsley/AtomicParsleyBridge.cpp b/libs/atomic-parsley/AtomicParsleyBridge.cpp
index 74930a1..25ba8af 100644
--- a/libs/atomic-parsley/AtomicParsleyBridge.cpp
+++ b/libs/atomic-parsley/AtomicParsleyBridge.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -296,49 +296,49 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 Title
         value = find_atom_value(TITLE);
         if (value) {
-            track-&amp;gt;title = charset_to_utf8(value);
+            track-&amp;gt;title = g_strdup(value);
             free(value);
         }
 
         // MP4 Artist
         value = find_atom_value(ARTIST);
         if (value) {
-            track-&amp;gt;artist = charset_to_utf8(value);
+            track-&amp;gt;artist = g_strdup(value);
             free(value);
         }
 
         // MP4 Album Artist
         value = find_atom_value(ALBUM_ARTIST);
         if (value) {
-            track-&amp;gt;albumartist = charset_to_utf8(value);
+            track-&amp;gt;albumartist = g_strdup(value);
             free(value);
         }
 
         // MP4 Composer
         value = find_atom_value(COMPOSER);
         if (value) {
-            track-&amp;gt;composer = charset_to_utf8(value);
+            track-&amp;gt;composer = g_strdup(value);
             free(value);
         }
 
         // MP4 Comment
         value = find_atom_value(COMMENT);
         if (value) {
-            track-&amp;gt;comment = charset_to_utf8(value);
+            track-&amp;gt;comment = g_strdup(value);
             free(value);
         }
 
         // MP4 Description
         value = find_atom_value(DESCRIPTION);
         if (value) {
-            track-&amp;gt;description = charset_to_utf8(value);
+            track-&amp;gt;description = g_strdup(value);
             free(value);
         }
 
         // MP4 Keywords
         value = find_atom_value(KEYWORD);
         if (value) {
-            track-&amp;gt;keywords = charset_to_utf8(value);
+            track-&amp;gt;keywords = g_strdup(value);
             free(value);
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -352,7 +352,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 Album
         value = find_atom_value(ALBUM);
         if (value) {
-            track-&amp;gt;album = charset_to_utf8(value);
+            track-&amp;gt;album = g_strdup(value);
             free(value);
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -391,7 +391,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 Grouping
         value = find_atom_value(GROUPING);
         if (value) {
-            track-&amp;gt;grouping = charset_to_utf8(value);
+            track-&amp;gt;grouping = g_strdup(value);
             free(value);
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -406,7 +406,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
             // custom genre
             value = find_atom_value(CUSTOM_GENRE);
             if (value) {
-                track-&amp;gt;genre = charset_to_utf8(value);
+                track-&amp;gt;genre = g_strdup(value);
                 free(value);
             }
         }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -428,14 +428,14 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 TV Show
         value = find_atom_value(TV_SHOW);
         if (value) {
-            track-&amp;gt;tvshow = charset_to_utf8(value);
+            track-&amp;gt;tvshow = g_strdup(value);
             free(value);
         }
 
         // MP4 TV Episode
         value = find_atom_value(TV_EPISODE);
         if (value) {
-            track-&amp;gt;tvepisode = charset_to_utf8(value);
+            track-&amp;gt;tvepisode = g_strdup(value);
             free(value);
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -449,7 +449,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 TV Network
         value = find_atom_value(TV_NETWORK_NAME);
         if (value) {
-            track-&amp;gt;tvnetwork = charset_to_utf8(value);
+            track-&amp;gt;tvnetwork = g_strdup(value);
             free(value);
         }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -481,7 +481,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 Category
         value = find_atom_value(CATEGORY);
         if (value) {
-            track-&amp;gt;category = charset_to_utf8(value);
+            track-&amp;gt;category = g_strdup(value);
             free(value);
         }
 

------------------------------------------------------------------------------
Monitor your physical, virtual and cloud infrastructure from a single
web console. Get in-depth insight into apps, servers, databases, vmware,
SAP, cloud infrastructure, etc. Download 30-day Free Trial.
Pricing starts from $795 for 25 servers or applications!
http://p.sf.net/sfu/zoho_dev2dev_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-13T01:46:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3641">
    <title>[gtpd-cvs] [gtkpod] fix mp4 tag crash on tempo (BPM) values above 99</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3641</link>
    <description>&lt;pre&gt;commit 7684c22d7665e47a125e54ba03e2b1552791dfd0
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Sat Nov 10 19:11:48 2012 -0700

    fix mp4 tag crash on tempo (BPM) values above 99
    
    As reported here:
    http://sourceforge.net/tracker/index.php?func=detail&amp;amp;aid=3575205&amp;amp;group_id=67873&amp;amp;atid=519273

 libs/atomic-parsley/AtomicParsley.cpp |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
---
diff --git a/libs/atomic-parsley/AtomicParsley.cpp b/libs/atomic-parsley/AtomicParsley.cpp
index 69830d5..868d1f0 100644
--- a/libs/atomic-parsley/AtomicParsley.cpp
+++ b/libs/atomic-parsley/AtomicParsley.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1816,7 +1816,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; char* APar_ExtractDataAtom(int this_atom_number) {
                     }
                 }
                 case 2: { //tmpo
-                    char* result = (char*) malloc(sizeof(char) * 4);
+                    char* result = (char*) malloc(sizeof(char) * 7); // 5 for tempo value, up to 65535, 2 for \n\0
                     sprintf(result, "%hu\n", UInt16FromBigEndian(data_payload));
                     return result;
                 }

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-11T02:32:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3640">
    <title>[gtpd-cvs] [gtkpod] fix compilation flag and media type tag for mp4files</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3640</link>
    <description>&lt;pre&gt;commit dbbadb72e33f99edd610f7392b6926c168ee5fef
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Thu Nov 8 16:16:11 2012 -0700

    fix compilation flag and media type tag for mp4 files

 libs/atomic-parsley/AtomicParsleyBridge.cpp |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)
---
diff --git a/libs/atomic-parsley/AtomicParsleyBridge.cpp b/libs/atomic-parsley/AtomicParsleyBridge.cpp
index 704fd3b..74930a1 100644
--- a/libs/atomic-parsley/AtomicParsleyBridge.cpp
+++ b/libs/atomic-parsley/AtomicParsleyBridge.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -32,6 +32,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "AtomicParsley.h"
 #include "AP_AtomExtracts.h"
 #include "AtomicParsleyBridge.h"
+#include "AtomicParsley_genres.h"
 
 extern "C" {
 #include &amp;lt;glib/gstdio.h&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -462,14 +463,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
         // MP4 Media Type
         value = find_atom_value(MEDIA_TYPE);
         if (value) {
-            track-&amp;gt;mediatype = mediaTypeTagToMediaType(atoi(value));
+            stiks * stik = MatchStikString(value);
+            if (stik)
+            {
+                track-&amp;gt;mediatype = mediaTypeTagToMediaType(stik-&amp;gt;stik_number);
+            }
             // Should not free standard media types
         }
 
         // MP4 Compilation flag
         value = find_atom_value(COMPILATION);
         if (value) {
-            track-&amp;gt;compilation = atoi(value);
+            track-&amp;gt;compilation = !g_strcmp0("true", value);
             free(value);
         }
 

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-11T02:32:48</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3639">
    <title>[gtpd-cvs] [gtkpod] add mp4 chapter reading support to AtomicParsley bridge</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3639</link>
    <description>&lt;pre&gt;commit 3fbdec07724f4806f88dd93ac3927162b2cdaabd
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Thu Nov 8 14:23:35 2012 -0700

    add mp4 chapter reading support to Atomic Parsley bridge

 libs/atomic-parsley/AtomicParsleyBridge.cpp |  125 +++++++++++++++++++++++++--
 1 files changed, 119 insertions(+), 6 deletions(-)
---
diff --git a/libs/atomic-parsley/AtomicParsleyBridge.cpp b/libs/atomic-parsley/AtomicParsleyBridge.cpp
index ef1a182..704fd3b 100644
--- a/libs/atomic-parsley/AtomicParsleyBridge.cpp
+++ b/libs/atomic-parsley/AtomicParsleyBridge.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -146,7 +146,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
     FILE *mp4File;
     Trackage *trackage;
     uint8_t track_cur;
+    uint8_t txttrack_cur;
     gboolean audio_or_video_found = FALSE;
+    gboolean has_quicktime_chaps = FALSE;
+    uint32_t timescale = 0;
 
     APar_ScanAtoms(filePath, true);
     mp4File = openSomeFile(filePath, true);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -156,11 +159,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
     for (track_cur = 0; track_cur &amp;lt; trackage-&amp;gt;total_tracks; ++track_cur) {
         TrackInfo *info = trackage-&amp;gt;infos[track_cur];
 
-        // FIXME no chapter information implemented yet
-
-        if (info-&amp;gt;track_type &amp;amp;&amp;amp; audio_or_video_found == FALSE
-                &amp;amp;&amp;amp; ((info-&amp;gt;track_type &amp;amp; AUDIO_TRACK) || (info-&amp;gt;track_type &amp;amp; VIDEO_TRACK)
-                        || (info-&amp;gt;track_type &amp;amp; DRM_PROTECTED_TRACK))) {
+        if ((info-&amp;gt;type_of_track &amp;amp; AUDIO_TRACK) || (info-&amp;gt;type_of_track &amp;amp; VIDEO_TRACK)
+                        || (info-&amp;gt;type_of_track &amp;amp; DRM_PROTECTED_TRACK)) {
 
             /*
              * the info-&amp;gt;duration is in the track's timescale units so must be divided by that
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -171,10 +171,123 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
 
             track-&amp;gt;bitrate = APar_calculate_bitrate(info);
             track-&amp;gt;samplerate = info-&amp;gt;media_sample_rate;
+            audio_or_video_found = TRUE;
+            break;
+        }
+    }
+    for (txttrack_cur = 0; audio_or_video_found &amp;amp;&amp;amp; txttrack_cur &amp;lt; trackage-&amp;gt;total_tracks; ++txttrack_cur) {
+        TrackInfo *txtinfo = trackage-&amp;gt;infos[txttrack_cur];
+        char buf[128];
+        // search for chapter track
+        if (!(txtinfo-&amp;gt;type_of_track &amp;amp; TEXT_TRACK))
+            continue;
+        // see if the AV track's chap refers to this text track
+        // chap: 0: atom size  4: 'chap'  8,12,...,8+(N-1)*4: (0: referenced track ID)
+        snprintf(buf, sizeof(buf), "moov.trak[%u].tref.chap", track_cur + 1);
+        AtomicInfo* chapAtom = APar_FindAtom(buf, false, SIMPLE_ATOM, 0);
+        if (!chapAtom)
+            continue;
+        int entry_count = (chapAtom-&amp;gt;AtomicLength - 8) / 4;
+        for (int i = 0; i &amp;lt; entry_count; ++i) {
+            if (APar_read32(buf, mp4File, chapAtom-&amp;gt;AtomicStart + 8 + i * 4) == txtinfo-&amp;gt;track_id) {
+                has_quicktime_chaps = TRUE;
+                timescale = txtinfo-&amp;gt;media_sample_rate;
+                break;
+            }
         }
+        if (has_quicktime_chaps)
+            break;
+    }
+    if (has_quicktime_chaps) {
+        // found a chapter... now get the chapter data from the text track
+        char buf[128];
+
+        // stts: 0: atom size  4: 'stts'  8: version  12: entry count  16,24,...,16+(N-1)*8: (0: frame count 4: duration)
+        snprintf(buf, sizeof(buf), "moov.trak[%u].mdia.minf.stbl.stts", txttrack_cur + 1);
+        AtomicInfo* sampleAtom = APar_FindAtom(buf, false, VERSIONED_ATOM, 0);
+
+        // stsz: 0: atom size  4: 'stsz'  8: version  12: size of all (or 0)  16: entry count  20,24,...,20+(N-1)*4: (0: sample size)
+        snprintf(buf, sizeof(buf), "moov.trak[%u].mdia.minf.stbl.stsz", txttrack_cur + 1);
+        AtomicInfo* sampleSizeAtom = APar_FindAtom(buf, false, VERSIONED_ATOM, 0);
+
+        // stco: 0: atom size  4: 'stco'  8: version  12: entry count  16,20,...,16+(N-1)*4: (0: sample byte offset)
+        snprintf(buf, sizeof(buf), "moov.trak[%u].mdia.minf.stbl.stco", txttrack_cur + 1);
+        AtomicInfo* sampleOffsetAtom = APar_FindAtom(buf, false, VERSIONED_ATOM, 0);
+
+        // We must have a valid sampleAtom to know chapter times. If sampleSizeAtom or sampleOffsetAtom is invalid,
+        // we can do without them (and instead create a default chapter name).
+        if (sampleAtom &amp;amp;&amp;amp; sampleAtom-&amp;gt;AtomicLength &amp;gt;= 16) {
+            Itdb_Chapterdata *chapterdata = itdb_chapterdata_new();
+            uint32_t stts_entry_count = APar_read32(buf, mp4File, sampleAtom-&amp;gt;AtomicStart + 12);
+            uint32_t stsz_entry_count = !sampleSizeAtom || sampleSizeAtom-&amp;gt;AtomicLength &amp;lt; 20 ? 0 :
+                APar_read32(buf, mp4File, sampleSizeAtom-&amp;gt;AtomicStart + 16);
+            uint32_t stco_entry_count = !sampleOffsetAtom || sampleOffsetAtom-&amp;gt;AtomicLength &amp;lt; 16 ? 0 :
+                APar_read32(buf, mp4File, sampleOffsetAtom-&amp;gt;AtomicStart + 12);
+            uint32_t stsz_all_size = !sampleSizeAtom || sampleSizeAtom-&amp;gt;AtomicLength &amp;lt; 16 ? 0 :
+                APar_read32(buf, mp4File, sampleSizeAtom-&amp;gt;AtomicStart + 12);
+
+            uint32_t start_time = 0;
+
+            u_int32_t max_frame_size = stsz_all_size; // if stsz_all_size specified, use only that size
+            for (int i = 0; !stsz_all_size &amp;amp;&amp;amp; i &amp;lt; stsz_entry_count; ++i) {
+                uint32_t chap_name_len = APar_read32(buf, mp4File, sampleSizeAtom-&amp;gt;AtomicStart + 20 + i * 4);
+                if (chap_name_len &amp;gt; max_frame_size)
+                    max_frame_size = chap_name_len;
+            }
+            max_frame_size += 1; // for trailing '\0' (unneeded?), and to make sure that malloc() gets passed at least 1
+            char * namebuf = (char *)malloc(max_frame_size * sizeof(char));
+            for (int i = 0; i &amp;lt; stts_entry_count; ++i) {
+                gchar *title = NULL;
+                uint32_t chap_name_len = stsz_all_size;
+                uint32_t chap_offset = 0;
+                if (stsz_all_size == 0 &amp;amp;&amp;amp; i &amp;lt; stsz_entry_count)
+                    chap_name_len = APar_read32(buf, mp4File, sampleSizeAtom-&amp;gt;AtomicStart + 20 + i * 4);
+                if (i &amp;lt; stco_entry_count)
+                    chap_offset = APar_read32(buf, mp4File, sampleOffsetAtom-&amp;gt;AtomicStart + 16 + i * 4);
+                if (chap_offset != 0)
+                    APar_readX(namebuf, mp4File, chap_offset, chap_name_len);
+                else // If the location of the chapter name is unknown, trigger default chapter naming
+                    chap_name_len = 0;
+                if (chap_name_len &amp;gt; 2) {
+                    int titlelength = (namebuf[0] &amp;lt;&amp;lt; 8) + namebuf[1];
+                    // if the stsz atom and the title value disagree, use the smaller one for safety
+                    titlelength = (titlelength &amp;gt; chap_name_len) ? chap_name_len : titlelength;
+                    // If a title begins with 0xFFFE, it's a UTF-16 title
+                    if (titlelength &amp;gt;= 2 &amp;amp;&amp;amp; namebuf[2] == 0xff &amp;amp;&amp;amp; namebuf[3] == 0xfe)
+                        title = g_utf16_to_utf8((const gunichar2 *) &amp;amp;namebuf[4], titlelength - 2, NULL, NULL, NULL);
+                    else
+                        title = g_strndup(&amp;amp;namebuf[2], titlelength);
+                }
+                else
+                {
+                    // chapter title couldn't be found; create our own titles
+                    // (and some ipods don't display them anyway)
+                    title = g_strdup_printf("Chapter %3d", i);
+                }
+
+                if (!timescale) // assume 1000, also, don't divide by 0
+                    timescale = 1000;
+                double duration_ms = (double)start_time * 1000.0 / (double)timescale;
+
+                itdb_chapterdata_add_chapter(chapterdata, duration_ms, title);
+                g_free(title);
 
-        audio_or_video_found = TRUE;
+                if (i &amp;lt; (stts_entry_count - 1)) // skip this stage after the last chapter has been added
+                {
+                    uint32_t frame_count = APar_read32(buf, mp4File, sampleAtom-&amp;gt;AtomicStart + 16 + i * 8);
+                    uint32_t duration = APar_read32(buf, mp4File, sampleAtom-&amp;gt;AtomicStart + 20 + i * 8);
+                    start_time += frame_count * duration;
+                }
+            }
+            if (namebuf)
+                free(namebuf);
+            if (track-&amp;gt;chapterdata) // if there was already chapter data, don't leak it
+                itdb_chapterdata_free(track-&amp;gt;chapterdata);
+            track-&amp;gt;chapterdata = itdb_chapterdata_duplicate(chapterdata);
+            itdb_chapterdata_free(chapterdata);
+        }
     }
+    // TODO: add support for Nero-style mp4 chapters
 
     if (prefs_get_int("readtags")) {
         char* value = NULL;

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-11T02:32:42</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3638">
    <title>[gtpd-cvs] [gtkpod] add track ID field to AtomicParseley library</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3638</link>
    <description>&lt;pre&gt;commit dced7b42629f74561fd31c4f7881bc7f769fcf46
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Sun Nov 4 00:00:05 2012 -0600

    add track ID field to AtomicParseley library

 libs/atomic-parsley/AP_AtomExtracts.cpp |   13 +++++++++++++
 libs/atomic-parsley/AP_AtomExtracts.h   |    1 +
 2 files changed, 14 insertions(+), 0 deletions(-)
---
diff --git a/libs/atomic-parsley/AP_AtomExtracts.cpp b/libs/atomic-parsley/AP_AtomExtracts.cpp
index d4e0544..039eda8 100644
--- a/libs/atomic-parsley/AP_AtomExtracts.cpp
+++ b/libs/atomic-parsley/AP_AtomExtracts.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1070,8 +1070,21 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void APar_ExtractTrackDetails(char* uint32_buffer, FILE* isofile, Trackage* trac
                 + 12);
         track_info-&amp;gt;modified_time = APar_read32(uint32_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart
                 + 16);
+        track_info-&amp;gt;track_id = APar_read32(uint32_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 20);
         track_info-&amp;gt;duration = APar_read32(uint32_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 28);
     }
+    else if (APar_read8(isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 8) == 1) {
+        if (APar_read8(isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 11) &amp;amp; 1) {
+            track_info-&amp;gt;track_enabled = true;
+        }
+        //version 1 has 64-bit creation/modified times which AP currently doesn't support
+        //track_info-&amp;gt;creation_time = APar_read64(uint64_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart
+        //        + 12);
+        //track_info-&amp;gt;modified_time = APar_read32(uint64_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart
+        //        + 20);
+        track_info-&amp;gt;track_id = APar_read32(uint32_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 28);
+        track_info-&amp;gt;duration = APar_read32(uint32_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 36);
+    }
 
     //language code
     APar_TrackLevelInfo(track, "mdhd");
diff --git a/libs/atomic-parsley/AP_AtomExtracts.h b/libs/atomic-parsley/AP_AtomExtracts.h
index bd9cb26..3292aa5 100644
--- a/libs/atomic-parsley/AP_AtomExtracts.h
+++ b/libs/atomic-parsley/AP_AtomExtracts.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -35,6 +35,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct { //if any of these are unused, they are set to 0xFF
 struct _TrackInfo {
     uint32_t creation_time;
     uint32_t modified_time;
+    uint32_t track_id;
     uint32_t duration;
     bool track_enabled;
     uint32_t media_sample_rate;

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-11T02:32:36</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3637">
    <title>[gtpd-cvs] [gtkpod] add text track type to AtomicParseley library</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3637</link>
    <description>&lt;pre&gt;commit 7f966953fc5b0ba6a8a46d0a936fd02a9faf1b19
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Sat Nov 3 23:57:29 2012 -0600

    add text track type to AtomicParseley library

 libs/atomic-parsley/AP_AtomExtracts.cpp |   14 +++++++++++---
 libs/atomic-parsley/AP_AtomExtracts.h   |    2 +-
 2 files changed, 12 insertions(+), 4 deletions(-)
---
diff --git a/libs/atomic-parsley/AP_AtomExtracts.cpp b/libs/atomic-parsley/AP_AtomExtracts.cpp
index 3b7a967..d4e0544 100644
--- a/libs/atomic-parsley/AP_AtomExtracts.cpp
+++ b/libs/atomic-parsley/AP_AtomExtracts.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1085,11 +1085,19 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void APar_ExtractTrackDetails(char* uint32_buffer, FILE* isofile, Trackage* trac
     APar_TrackLevelInfo(track, "hdlr");
     memset(uint32_buffer, 0, 5);
     track_info-&amp;gt;track_type = APar_read32(uint32_buffer, isofile, parsedAtoms[track-&amp;gt;track_atom].AtomicStart + 16);
-    if (track_info-&amp;gt;track_type == 0x736F756E) { //soun
+    switch (track_info-&amp;gt;track_type)
+    {
+    case 0x736F756E: //soun
         track_info-&amp;gt;type_of_track = AUDIO_TRACK;
-    }
-    else if (track_info-&amp;gt;track_type == 0x76696465) { //vide
+        break;
+    case 0x76696465: //vide
         track_info-&amp;gt;type_of_track = VIDEO_TRACK;
+        break;
+    case 0x74657874: //text
+        track_info-&amp;gt;type_of_track = TEXT_TRACK;
+        break;
+    default:
+        break;
     }
     if (parsedAtoms[track-&amp;gt;track_atom].AtomicLength &amp;gt; 34) {
         memset(track_info-&amp;gt;track_hdlr_name, 0, 100);
diff --git a/libs/atomic-parsley/AP_AtomExtracts.h b/libs/atomic-parsley/AP_AtomExtracts.h
index 255bb97..bd9cb26 100644
--- a/libs/atomic-parsley/AP_AtomExtracts.h
+++ b/libs/atomic-parsley/AP_AtomExtracts.h
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -105,7 +105,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; typedef struct {
 } ap_time;
 
 enum {
-    UNKNOWN_TRACK = 0, VIDEO_TRACK = 2, AUDIO_TRACK = 4, DRM_PROTECTED_TRACK = 8, OTHER_TRACK = 16
+    UNKNOWN_TRACK = 0, VIDEO_TRACK = 2, AUDIO_TRACK = 4, DRM_PROTECTED_TRACK = 8, OTHER_TRACK = 16, TEXT_TRACK = 32
 };
 
 enum {

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-11T02:32:30</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3636">
    <title>[gtpd-cvs] [gtkpod] add track sort fields read/write support to APlibrary</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3636</link>
    <description>&lt;pre&gt;commit 39fd186bb70b1e2650498ccef7aa109f3e0b1818
Author: Joel Smith &amp;lt;jsf-lists.gtkpod&amp;lt; at &amp;gt;jk1.net&amp;gt;
Date:   Sat Nov 3 22:16:05 2012 -0600

    add track sort fields read/write support to AP library

 libs/atomic-parsley/AtomicParsleyBridge.cpp |   66 +++++++++++++++++++++++++++
 1 files changed, 66 insertions(+), 0 deletions(-)
---
diff --git a/libs/atomic-parsley/AtomicParsleyBridge.cpp b/libs/atomic-parsley/AtomicParsleyBridge.cpp
index 052f47f..ef1a182 100644
--- a/libs/atomic-parsley/AtomicParsleyBridge.cpp
+++ b/libs/atomic-parsley/AtomicParsleyBridge.cpp
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -72,6 +72,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; extern "C" {
 #define PODCAST_URL "purl"
 #define ARTWORK "covr"
 #define GAPLESS_FLAG "pgap"
+#define SORT_TITLE "sonm"
+#define SORT_ARTIST "soar"
+#define SORT_ALBUM_ARTIST "soaa"
+#define SORT_COMPOSER "soco"
+#define SORT_ALBUM "soal"
+#define SORT_TV_SHOW "sosn"
 
 static guint32 mediaTypeTagToMediaType(guint8 media_type) {
     switch (media_type) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -374,6 +380,48 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_read_metadata(const char *filePath, Track *track) {
             free(value);
         }
 
+        // MP4 Sort Title
+        value = find_atom_value(SORT_TITLE);
+        if (value) {
+            track-&amp;gt;sort_title = g_strdup(value);
+            free(value);
+        }
+
+        // MP4 Sort Artist
+        value = find_atom_value(SORT_ARTIST);
+        if (value) {
+            track-&amp;gt;sort_artist = g_strdup(value);
+            free(value);
+        }
+
+        // MP4 Sort Album Artist
+        value = find_atom_value(SORT_ALBUM_ARTIST);
+        if (value) {
+            track-&amp;gt;sort_albumartist = g_strdup(value);
+            free(value);
+        }
+
+        // MP4 Sort Composer
+        value = find_atom_value(SORT_COMPOSER);
+        if (value) {
+            track-&amp;gt;sort_composer = g_strdup(value);
+            free(value);
+        }
+
+        // MP4 Sort Album
+        value = find_atom_value(SORT_ALBUM);
+        if (value) {
+            track-&amp;gt;sort_album = g_strdup(value);
+            free(value);
+        }
+
+        // MP4 Sort TV Show
+        value = find_atom_value(SORT_TV_SHOW);
+        if (value) {
+            track-&amp;gt;sort_tvshow = g_strdup(value);
+            free(value);
+        }
+
         if (prefs_get_int("coverart_apic")) {
             gchar *tmp_file_prefix = g_build_filename(g_get_tmp_dir(), "ttt", NULL);
             gchar *tmp_file;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -649,6 +697,24 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void AP_write_metadata(Track *track, const char *filePath, GError **error) {
     }
     g_free(atom);
 
+    // Sort Title
+    set_limited_text_atom_value(SORT_TITLE, track-&amp;gt;sort_title);
+
+    // Sort Artist
+    set_limited_text_atom_value(SORT_ARTIST, track-&amp;gt;sort_artist);
+
+    // Sort Album Artist
+    set_limited_text_atom_value(SORT_ALBUM_ARTIST, track-&amp;gt;sort_albumartist);
+
+    // Sort Composer
+    set_limited_text_atom_value(SORT_COMPOSER, track-&amp;gt;sort_composer);
+
+    // Sort Album
+    set_limited_text_atom_value(SORT_ALBUM, track-&amp;gt;sort_album);
+
+    // Sort TV Show
+    set_limited_text_atom_value(SORT_TV_SHOW, track-&amp;gt;sort_tvshow);
+
     if (prefs_get_int("coverart_apic")) {
         GdkPixbuf *pixbuf = (GdkPixbuf*) itdb_artwork_get_pixbuf(track-&amp;gt;itdb-&amp;gt;device, track-&amp;gt;artwork, -1, -1);
         if (!pixbuf) {

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>Joel Smith</dc:creator>
    <dc:date>2012-11-11T02:32:24</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3635">
    <title>[gtpd-cvs] [gtkpod] Mitigate possibility of sort tab category wheretrack has no value</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3635</link>
    <description>&lt;pre&gt;commit 055b183183636dd172c710c72fac161df708cb36
Author: phantomjinx &amp;lt;p.g.richardson&amp;lt; at &amp;gt;phantomjinx.co.uk&amp;gt;
Date:   Sat Nov 10 21:27:03 2012 +0000

    Mitigate possibility of sort tab category where track has no value
    
    * Possible that a track is used to display a sort tab category but that
      the track has no metadata value for the category.
    
    * Replaces with a hard constant to avoid null pointer crashes
    
    Thanks to j.neuschaefer at gmx.net for reporting and debugging

 plugins/sorttab_display/normal_sorttab_page.c |    6 +++++-
 1 files changed, 5 insertions(+), 1 deletions(-)
---
diff --git a/plugins/sorttab_display/normal_sorttab_page.c b/plugins/sorttab_display/normal_sorttab_page.c
index ea64cf7..ee00304 100644
--- a/plugins/sorttab_display/normal_sorttab_page.c
+++ b/plugins/sorttab_display/normal_sorttab_page.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -990,8 +990,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void normal_sort_tab_page_add_track(NormalSortTabPage *self, Track *track, gbool
             entry = g_malloc0(sizeof(TabEntry));
             if (group_track)
                 entry-&amp;gt;name = g_strdup(_("Compilations"));
-            else
+            else {
+                if (! entryname)
+                    entryname = g_strdup(_("No Metadata Value"));
+
                 entry-&amp;gt;name = g_strdup(entryname);
+            }
 
             _st_build_sortkeys(entry);
             entry-&amp;gt;compilation = group_track;

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_nov
&lt;/pre&gt;</description>
    <dc:creator>phantomjinx</dc:creator>
    <dc:date>2012-11-10T21:40:34</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3634">
    <title>[gtpd-cvs] [gtkpod] Solve the confusing sorting of the track display</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3634</link>
    <description>&lt;pre&gt;commit 53184951574a6033fec619eb1072ba8dc939118e
Author: phantomjinx &amp;lt;p.g.richardson&amp;lt; at &amp;gt;phantomjinx.co.uk&amp;gt;
Date:   Tue Oct 23 23:14:27 2012 +0100

    Solve the confusing sorting of the track display
    
    * The track display has traditionally been based on the list of displayed
      tracks. This list comes from the filters, which may have been sorted.
      Thus, despite turning off sorting in the track display, the tracks can
      still end up sorted asc/desc due to sorting in the filters
    
    * Makes the track display sorting independent by fetching the tracks from
      the playlist and only displaying those contained in the displayed list.
      Thus, the track display adopts the tracks from the filter but not their
      order.
    
    * Redefines the tm_autostore preference in that only if it is switched on
      will the track display sort order be applied automatically to any selected
      playlist's displayed tracks. Turning this off means tracks will only ever
      be sorted manually on a per playlist basis by the user.
    
    * Adds sort order radio buttons to the track display preferences to make the
      sort order more prominent. Adds tooltips to explain what the auto checkbox
      and the sort order radio buttons are for.

 plugins/track_display/display_tracks.c            |  249 +++++++++++----------
 plugins/track_display/plugin.c                    |    3 -
 plugins/track_display/track_display.xml           |  244 +++++++++++++++++++--
 plugins/track_display/track_display_preferences.c |   38 +++
 4 files changed, 400 insertions(+), 134 deletions(-)
---
diff --git a/plugins/track_display/display_tracks.c b/plugins/track_display/display_tracks.c
index f98f723..122e3a8 100644
--- a/plugins/track_display/display_tracks.c
+++ b/plugins/track_display/display_tracks.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -142,6 +142,52 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static gboolean filter_tracks(GtkTreeModel *model, GtkTreeIter *iter, gpointer e
     return result;
 }
 
+static gboolean _is_auto_sort_on() {
+    return prefs_get_int("tm_autostore");
+}
+
+static void _sort_trackview() {
+    GtkTreeModel *model = NULL;
+
+    g_return_if_fail (track_treeview);
+
+    gint column = prefs_get_int("tm_sortcol");
+    gint order = prefs_get_int("tm_sort");
+
+    if (order == SORT_NONE) {
+        return;
+    }
+
+    model = gtk_tree_view_get_model(track_treeview);
+    g_return_if_fail (model);
+
+    if (GTK_IS_TREE_MODEL_FILTER (model)) {
+        model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
+    }
+
+    gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), column, order);
+}
+
+static void _unsort_trackview() {
+    GtkTreeModel *model = NULL;
+
+    g_return_if_fail (track_treeview);
+
+    gint order = prefs_get_int("tm_sort");
+    if (order != SORT_NONE) {
+        return;
+    }
+
+    model = gtk_tree_view_get_model(track_treeview);
+    g_return_if_fail (model);
+
+    if (GTK_IS_TREE_MODEL_FILTER (model)) {
+        model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
+    }
+
+    gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+}
+
 static GtkListStore *get_model_as_store(GtkTreeModel *model) {
     if (!GTK_IS_TREE_MODEL_FILTER (model))
         return GTK_LIST_STORE (model);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1086,22 +1132,45 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static gint comp_int(gconstpointer a, gconstpointer b) {
     return (GPOINTER_TO_INT(a) - (GPOINTER_TO_INT(b)));
 }
 
-/* Redisplays the tracks in the track view according to the order
- * stored in the sort tab view. This only works if the track view is
- * not sorted --&amp;gt; skip if sorted */
+/*
+ * Redisplays the tracks in the track view according to the order
+ * stored in the current playlist.
+ */
+static void tm_adopt_order(GList *tracks) {
+    // Clear the track view
+    tm_remove_all_tracks();
 
-static void tm_adopt_order(void) {
-    if (prefs_get_int("tm_sort") == SORT_NONE) {
-        GList *gl, *tracks = NULL;
+    // Unsort the track view to improve performance
+    _unsort_trackview();
 
-        /* retrieve the currently displayed tracks (non ordered) from
-         the last sort tab or from the selected playlist if no sort
-         tabs are being used */
-        tm_remove_all_tracks();
-        tracks = gtkpod_get_displayed_tracks();
-        for (gl = tracks; gl; gl = gl-&amp;gt;next)
-            tm_add_track_to_track_model((Track *) gl-&amp;gt;data, NULL);
+    GHashTable *track_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
+    GList *dt = tracks;
+    while (dt != NULL) { /* add display track to hash */
+        Track *track = dt-&amp;gt;data;
+        g_hash_table_insert(track_hash, track, track);
+        dt = dt-&amp;gt;next;
     }
+
+    /*
+     * add playlist tracks to model in the order they
+     * appear in the playlist rather than the displayed
+     * list.
+     */
+    Playlist *cp = gtkpod_get_current_playlist();
+    GList *pt = cp-&amp;gt;members;
+    GtkTreeModel *model = gtk_tree_view_get_model(track_treeview);
+    while (pt != NULL) {
+        Track *track = pt-&amp;gt;data;
+        ExtraTrackData *etr = track-&amp;gt;userdata;
+
+        if (g_hash_table_lookup(track_hash, track))
+            gtk_list_store_insert_with_values (get_model_as_store(model), NULL, -1, READOUT_COL, track, -1);
+
+        pt = pt-&amp;gt;next;
+    }
+
+    g_hash_table_destroy(track_hash);
+    track_hash = NULL;
 }
 
 /**
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1538,7 +1607,15 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gboolean tm_search_equal_func(GtkTreeModel *model, gint column, const gchar *key
     }
     return cmp;
 }
-;
+
+/* Function used to compare tracks by their sort index */
+static gint _compare_track_sort_index(Track* trk1, Track* trk2) {
+    ExtraTrackData *etr1 = trk1-&amp;gt;userdata;
+    ExtraTrackData *etr2 = trk2-&amp;gt;userdata;
+    g_return_val_if_fail (etr1 &amp;amp;&amp;amp; etr2, 0);
+
+    return etr1-&amp;gt;sortindex - etr2-&amp;gt;sortindex;
+}
 
 /* Function used to compare two cells during sorting (track view) */
 gint tm_data_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1559,10 +1636,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gint tm_data_compare_func(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, g
     /* implement stable sorting: if two items are the same, revert to
      the last relative positition */
     if (result == 0) {
-        ExtraTrackData *etr1 = track1-&amp;gt;userdata;
-        ExtraTrackData *etr2 = track2-&amp;gt;userdata;
-        g_return_val_if_fail (etr1 &amp;amp;&amp;amp; etr2, 0);
-        result = etr1-&amp;gt;sortindex - etr2-&amp;gt;sortindex;
+        return _compare_track_sort_index(track1, track2);
     }
     return result;
 }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1584,27 +1658,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gint tm_sort_counter(gint inc) {
     return cnt;
 }
 
-/* redisplay the contents of the track view in it's unsorted order */
-static void tm_unsort(void) {
-    if (track_treeview) {
-        GtkTreeModel *model = gtk_tree_view_get_model(track_treeview);
-
-        if (GTK_IS_TREE_MODEL_FILTER (model)) {
-            model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
-        }
-
-        prefs_set_int("tm_sort", SORT_NONE);
-
-        /* no need to comment this out -- searching still works, but for lack
-             of a ctrl-g only the first occurence will be found */
-        /*    gtk_tree_view_set_enable_search (GTK_TREE_VIEW
-         * (track_treeview), FALSE);*/
-        gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
-        tm_adopt_order();
-        tm_sort_counter(-1);
-    }
-}
-
 static void tm_set_search_column(TM_item newcol) {
     /*     printf ("track_treeview: %p, col: %d\n", track_treeview, newcol); */
     g_return_if_fail (track_treeview);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1669,6 +1722,23 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void tm_set_search_column(TM_item newcol) {
     prefs_set_int(TM_PREFS_SEARCH_COLUMN, newcol);
 }
 
+/*
+ * Sorts and unsorts the track view according to the given order
+ */
+static void tm_sort(TM_item col, enum GtkPodSortTypes order) {
+    prefs_set_int("tm_sortcol", col);
+    prefs_set_int("tm_sort", order);
+
+    if (order == SORT_NONE) {
+        _unsort_trackview();
+        tm_adopt_order(gtkpod_get_displayed_tracks());
+        tm_sort_counter(-1);
+    }
+    else {
+        _sort_trackview();
+    }
+}
+
 /* This is called before when changing the sort order or the sort
  column, and before doing the sorting */
 static void tm_sort_column_changed(GtkTreeSortable *ts, gpointer user_data) {
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1701,7 +1771,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void tm_sort_column_changed(GtkTreeSortable *ts, gpointer user_data) {
     }
 
     if (tm_sort_counter(1) &amp;gt;= 3) { /* after clicking three times, reset sort order! */
-        tm_unsort(); /* also resets sort counter */
+        tm_sort(prefs_get_int("tm_sortcol"), SORT_NONE); /* also resets sort counter */
     }
     else {
         prefs_set_int("tm_sort", order);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1710,14 +1780,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void tm_sort_column_changed(GtkTreeSortable *ts, gpointer user_data) {
 
     tm_set_search_column(newcol);
 
-    if (prefs_get_int("tm_autostore")) {
-        /*
-         * Once this signal callback has finished will the model
-         * be resorted. At that point will we updated the
-         * selected playlist with the new track order.
-         */
-        gdk_threads_add_idle(tm_rows_reordered_idle_callback, NULL);
-    }
+    /*
+     * Once this signal callback has finished will the model
+     * be resorted. At that point will we updated the
+     * selected playlist with the new track order.
+     */
+    gdk_threads_add_idle(tm_rows_reordered_idle_callback, NULL);
 
     /* stable sorting: index original order */
     tracks = tm_get_all_tracks();
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -1744,31 +1812,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void tm_sort_column_changed(GtkTreeSortable *ts, gpointer user_data) {
     g_list_free(tracks);
 }
 
-void tm_sort(TM_item col, enum GtkPodSortTypes order) {
-    if (track_treeview) {
-        GtkTreeModel *model = gtk_tree_view_get_model(track_treeview);
-
-        if (GTK_IS_TREE_MODEL_FILTER (model)) {
-            model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
-        }
-
-        if (order != SORT_NONE) {
-            gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), col, order);
-        }
-        else { /* only unsort if treeview is sorted */
-            gint column;
-            GtkSortType order;
-            if (gtk_tree_sortable_get_sort_column_id(GTK_TREE_SORTABLE (model), &amp;amp;column, &amp;amp;order)) {
-                /* column == -2 actually is not defined, but it means
-                 that the model is unsorted. The sortable interface
-                 is badly implemented in gtk 2.4 */
-                if (column != -2)
-                    tm_unsort();
-            }
-        }
-    }
-}
-
 /* Adds the columns to our track_treeview */
 static GtkTreeViewColumn *tm_add_column(TM_item tm_item, gint pos) {
     GtkTreeModel *model = gtk_tree_view_get_model(track_treeview);
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2243,35 +2286,25 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static TM_item tm_lookup_col_id(GtkTreeViewColumn *column) {
 void tm_enable_disable_view_sort(gboolean enable) {
     static gint disable_count = 0;
 
+    /*
+     * Sorting will only have been automatic if the preference
+     * has been set. Otherwise, sorting is a totally manual
+     * process with the user sorting the displayed tracks.
+     */
+    if(! _is_auto_sort_on())
+        return;
+
     if (enable) {
         disable_count--;
         if (disable_count &amp;lt; 0)
             fprintf(stderr, "Programming error: disable_count &amp;lt; 0\n");
         if (disable_count == 0 &amp;amp;&amp;amp; track_treeview) {
-            if (prefs_get_int("tm_sort") != SORT_NONE) {
-                /* Re-enable sorting */
-                GtkTreeModel *model = gtk_tree_view_get_model(track_treeview);
-
-                if (GTK_IS_TREE_MODEL_FILTER (model)) {
-                    model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
-                }
-
-                gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), prefs_get_int("tm_sortcol"), prefs_get_int("tm_sort"));
-            }
+            _sort_trackview();
         }
     }
     else {
         if (disable_count == 0 &amp;amp;&amp;amp; track_treeview) {
-            if (prefs_get_int("tm_sort") != SORT_NONE) {
-                /* Disable sorting */
-                GtkTreeModel *model = gtk_tree_view_get_model(track_treeview);
-
-                if (GTK_IS_TREE_MODEL_FILTER (model)) {
-                    model = gtk_tree_model_filter_get_model(GTK_TREE_MODEL_FILTER(model));
-                }
-
-                gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, prefs_get_int("tm_sort"));
-            }
+            _unsort_trackview();
         }
         disable_count++;
     }
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2375,28 +2408,18 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; gboolean tm_add_filelist(gchar *data, GtkTreePath *path, GtkTreeViewDropPosition
 }
 
 void track_display_set_tracks_cb(GtkPodApp *app, gpointer tks, gpointer data) {
-    GList *tracks = tks;
-    GtkTreeModel *model = NULL;
-
-
-    tm_remove_all_tracks();
 
-    // Unsort the track view to improve performance
-    model = gtk_tree_view_get_model(track_treeview);
-    gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+    GList *tracks = tks;
 
-    while (tracks != NULL) { /* add all tracks to model */
-        Track *track = tracks-&amp;gt;data;
-        gtk_list_store_insert_with_values (get_model_as_store(model), NULL, -1, READOUT_COL, track, -1);
-        tracks = tracks-&amp;gt;next;
-    }
+    tm_adopt_order(tracks);
 
-    if (model) {
-        int column = prefs_get_int("tm_sortcol");
-        int order = prefs_get_int("tm_sort");
-        if (order != SORT_NONE) {
-            gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE (model), column, order);
-        }
+    /*
+     * If the preference for auto-sorting has been set then
+     * sort the tracks view accordingly, otherwise leave it
+     * as it is.
+     */
+    if (_is_auto_sort_on()) {
+        _sort_trackview();
     }
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -2436,7 +2459,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; void track_display_track_updated_cb(GtkPodApp *app, gpointer tk, gpointer data)
 
 void track_display_preference_changed_cb(GtkPodApp *app, gpointer pfname, gpointer value, gpointer data) {
     gchar *pref_name = pfname;
-    if (g_str_equal(pref_name, "tm_sort")) {
+    if (g_str_equal(pref_name, "tm_sort") || g_str_equal(pref_name, "tm_autostore")) {
         tm_sort_counter(-1);
         tm_sort(prefs_get_int("tm_sortcol"), prefs_get_int("tm_sort"));
     }
diff --git a/plugins/track_display/plugin.c b/plugins/track_display/plugin.c
index 3b57113..519c169 100644
--- a/plugins/track_display/plugin.c
+++ b/plugins/track_display/plugin.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -86,9 +86,6 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void set_default_preferences() {
         prefs_set_string("sm_sort_", NULL);
     }
 
-    if (!prefs_get_int_value("tm_autostore", NULL))
-        prefs_set_int("tm_autostore", TRUE);
-
     if (!prefs_get_int_value("tm_sortcol", NULL))
         prefs_set_int("tm_sortcol", TM_COLUMN_TITLE);
 
diff --git a/plugins/track_display/track_display.xml b/plugins/track_display/track_display.xml
index e73eb30..ec00223 100644
--- a/plugins/track_display/track_display.xml
+++ b/plugins/track_display/track_display.xml
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -284,15 +284,16 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                         &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
                         &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
                         &amp;lt;property name="orientation"&amp;gt;vertical&amp;lt;/property&amp;gt;
+                        &amp;lt;property name="spacing"&amp;gt;10&amp;lt;/property&amp;gt;
                         &amp;lt;child&amp;gt;
                           &amp;lt;object class="GtkCheckButton" id="tm_cfg_autostore"&amp;gt;
-                            &amp;lt;property name="label" translatable="yes"&amp;gt;Modify selected tracks sort order in selected playlist&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="label" translatable="yes"&amp;gt;Automatically sort selected tracks in selected playlist&amp;lt;/property&amp;gt;
                             &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
                             &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
                             &amp;lt;property name="receives_default"&amp;gt;False&amp;lt;/property&amp;gt;
                             &amp;lt;property name="has_tooltip"&amp;gt;True&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;if checked, the sort order of the displayed tracks will be applied to the selected playlist.&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;if checked, the sort order of the displayed tracks will be applied to the selected playlist.&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;if checked, the sort order (defined below) will be applied to the selected playlist.&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;if checked, the sort order (defined below) will be applied to the selected playlist.&amp;lt;/property&amp;gt;
                             &amp;lt;property name="halign"&amp;gt;start&amp;lt;/property&amp;gt;
                             &amp;lt;property name="use_action_appearance"&amp;gt;False&amp;lt;/property&amp;gt;
                             &amp;lt;property name="use_underline"&amp;gt;True&amp;lt;/property&amp;gt;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -307,24 +308,231 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
                           &amp;lt;/packing&amp;gt;
                         &amp;lt;/child&amp;gt;
                         &amp;lt;child&amp;gt;
-                          &amp;lt;object class="GtkCheckButton" id="tm_cfg_case_sensitive"&amp;gt;
-                            &amp;lt;property name="label" translatable="yes"&amp;gt;Case sensitive sorting&amp;lt;/property&amp;gt;
+                          &amp;lt;object class="GtkFrame" id="frame4"&amp;gt;
                             &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="receives_default"&amp;gt;False&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="has_tooltip"&amp;gt;True&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="halign"&amp;gt;start&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="use_action_appearance"&amp;gt;False&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="use_underline"&amp;gt;True&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="xalign"&amp;gt;0&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="draw_indicator"&amp;gt;True&amp;lt;/property&amp;gt;
-                            &amp;lt;signal name="toggled" handler="on_tm_sort_case_sensitive_toggled" swapped="no"/&amp;gt;
+                            &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="label_xalign"&amp;gt;0&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="shadow_type"&amp;gt;none&amp;lt;/property&amp;gt;
+                            &amp;lt;child&amp;gt;
+                              &amp;lt;object class="GtkAlignment" id="alignment4"&amp;gt;
+                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                &amp;lt;property name="top_padding"&amp;gt;6&amp;lt;/property&amp;gt;
+                                &amp;lt;property name="left_padding"&amp;gt;12&amp;lt;/property&amp;gt;
+                                &amp;lt;child&amp;gt;
+                                  &amp;lt;object class="GtkVBox" id="vbox2"&amp;gt;
+                                    &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                    &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                    &amp;lt;property name="valign"&amp;gt;start&amp;lt;/property&amp;gt;
+                                    &amp;lt;property name="spacing"&amp;gt;10&amp;lt;/property&amp;gt;
+                                    &amp;lt;child&amp;gt;
+                                      &amp;lt;object class="GtkHBox" id="hbox30"&amp;gt;
+                                        &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                        &amp;lt;child&amp;gt;
+                                          &amp;lt;object class="GtkTable" id="table1"&amp;gt;
+                                            &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                            &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                            &amp;lt;property name="border_width"&amp;gt;5&amp;lt;/property&amp;gt;
+                                            &amp;lt;property name="n_rows"&amp;gt;2&amp;lt;/property&amp;gt;
+                                            &amp;lt;property name="n_columns"&amp;gt;3&amp;lt;/property&amp;gt;
+                                            &amp;lt;child&amp;gt;
+                                              &amp;lt;object class="GtkLabel" id="label820"&amp;gt;
+                                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="label" translatable="yes"&amp;gt;&amp;amp;lt;b&amp;amp;gt;Ascending&amp;amp;lt;/b&amp;amp;gt;&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="use_markup"&amp;gt;True&amp;lt;/property&amp;gt;
+                                              &amp;lt;/object&amp;gt;
+                                              &amp;lt;packing&amp;gt;
+                                                &amp;lt;property name="left_attach"&amp;gt;1&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="right_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="y_options"&amp;gt;&amp;lt;/property&amp;gt;
+                                              &amp;lt;/packing&amp;gt;
+                                            &amp;lt;/child&amp;gt;
+                                            &amp;lt;child&amp;gt;
+                                              &amp;lt;object class="GtkLabel" id="label850"&amp;gt;
+                                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="label" translatable="yes"&amp;gt;&amp;amp;lt;b&amp;amp;gt;Descending&amp;amp;lt;/b&amp;amp;gt;&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="use_markup"&amp;gt;True&amp;lt;/property&amp;gt;
+                                              &amp;lt;/object&amp;gt;
+                                              &amp;lt;packing&amp;gt;
+                                                &amp;lt;property name="left_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="right_attach"&amp;gt;3&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="y_options"&amp;gt;&amp;lt;/property&amp;gt;
+                                              &amp;lt;/packing&amp;gt;
+                                            &amp;lt;/child&amp;gt;
+                                            &amp;lt;child&amp;gt;
+                                              &amp;lt;object class="GtkRadioButton" id="tm_sort_ascend"&amp;gt;
+                                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="receives_default"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="use_action_appearance"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="xalign"&amp;gt;0&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="draw_indicator"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="group"&amp;gt;tm_sort_none&amp;lt;/property&amp;gt;
+                                                &amp;lt;signal name="toggled" handler="on_tm_sort_asc_toggled" swapped="no"/&amp;gt;
+                                                &amp;lt;child&amp;gt;
+                                                  &amp;lt;object class="GtkImage" id="image1928"&amp;gt;
+                                                    &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                    &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                    &amp;lt;property name="stock"&amp;gt;gtk-sort-ascending&amp;lt;/property&amp;gt;
+                                                  &amp;lt;/object&amp;gt;
+                                                &amp;lt;/child&amp;gt;
+                                              &amp;lt;/object&amp;gt;
+                                              &amp;lt;packing&amp;gt;
+                                                &amp;lt;property name="left_attach"&amp;gt;1&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="right_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="top_attach"&amp;gt;1&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="bottom_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="x_options"&amp;gt;&amp;lt;/property&amp;gt;
+                                              &amp;lt;/packing&amp;gt;
+                                            &amp;lt;/child&amp;gt;
+                                            &amp;lt;child&amp;gt;
+                                              &amp;lt;object class="GtkRadioButton" id="tm_sort_descend"&amp;gt;
+                                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="receives_default"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="use_action_appearance"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="xalign"&amp;gt;0&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="draw_indicator"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="group"&amp;gt;tm_sort_none&amp;lt;/property&amp;gt;
+                                                &amp;lt;signal name="toggled" handler="on_tm_sort_desc_toggled" swapped="no"/&amp;gt;
+                                                &amp;lt;child&amp;gt;
+                                                  &amp;lt;object class="GtkImage" id="image1929"&amp;gt;
+                                                    &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                    &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                    &amp;lt;property name="stock"&amp;gt;gtk-sort-descending&amp;lt;/property&amp;gt;
+                                                  &amp;lt;/object&amp;gt;
+                                                &amp;lt;/child&amp;gt;
+                                              &amp;lt;/object&amp;gt;
+                                              &amp;lt;packing&amp;gt;
+                                                &amp;lt;property name="left_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="right_attach"&amp;gt;3&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="top_attach"&amp;gt;1&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="bottom_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="x_options"&amp;gt;&amp;lt;/property&amp;gt;
+                                              &amp;lt;/packing&amp;gt;
+                                            &amp;lt;/child&amp;gt;
+                                            &amp;lt;child&amp;gt;
+                                              &amp;lt;object class="GtkLabel" id="label86"&amp;gt;
+                                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="label" translatable="yes"&amp;gt;&amp;amp;lt;b&amp;amp;gt;None&amp;amp;lt;/b&amp;amp;gt;&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="use_markup"&amp;gt;True&amp;lt;/property&amp;gt;
+                                              &amp;lt;/object&amp;gt;
+                                              &amp;lt;packing&amp;gt;
+                                                &amp;lt;property name="y_options"&amp;gt;&amp;lt;/property&amp;gt;
+                                              &amp;lt;/packing&amp;gt;
+                                            &amp;lt;/child&amp;gt;
+                                            &amp;lt;child&amp;gt;
+                                              &amp;lt;object class="GtkRadioButton" id="tm_sort_none"&amp;gt;
+                                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="receives_default"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;Sort order applied to displayed tracks.
+
+This is only applied if the 'auto sort tracks' 
+checkbox (above) is checked.&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="use_action_appearance"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="xalign"&amp;gt;0&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="active"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="draw_indicator"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                &amp;lt;signal name="toggled" handler="on_tm_sort_none_toggled" swapped="no"/&amp;gt;
+                                                &amp;lt;child&amp;gt;
+                                                  &amp;lt;object class="GtkImage" id="image1930"&amp;gt;
+                                                    &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                                    &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                                    &amp;lt;property name="stock"&amp;gt;gtk-undo&amp;lt;/property&amp;gt;
+                                                  &amp;lt;/object&amp;gt;
+                                                &amp;lt;/child&amp;gt;
+                                              &amp;lt;/object&amp;gt;
+                                              &amp;lt;packing&amp;gt;
+                                                &amp;lt;property name="top_attach"&amp;gt;1&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="bottom_attach"&amp;gt;2&amp;lt;/property&amp;gt;
+                                                &amp;lt;property name="x_options"&amp;gt;&amp;lt;/property&amp;gt;
+                                              &amp;lt;/packing&amp;gt;
+                                            &amp;lt;/child&amp;gt;
+                                          &amp;lt;/object&amp;gt;
+                                          &amp;lt;packing&amp;gt;
+                                            &amp;lt;property name="expand"&amp;gt;True&amp;lt;/property&amp;gt;
+                                            &amp;lt;property name="fill"&amp;gt;True&amp;lt;/property&amp;gt;
+                                            &amp;lt;property name="position"&amp;gt;0&amp;lt;/property&amp;gt;
+                                          &amp;lt;/packing&amp;gt;
+                                        &amp;lt;/child&amp;gt;
+                                      &amp;lt;/object&amp;gt;
+                                      &amp;lt;packing&amp;gt;
+                                        &amp;lt;property name="expand"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="fill"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="position"&amp;gt;0&amp;lt;/property&amp;gt;
+                                      &amp;lt;/packing&amp;gt;
+                                    &amp;lt;/child&amp;gt;
+                                    &amp;lt;child&amp;gt;
+                                      &amp;lt;object class="GtkCheckButton" id="tm_cfg_case_sensitive"&amp;gt;
+                                        &amp;lt;property name="label" translatable="yes"&amp;gt;Case sensitive sorting&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="can_focus"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="receives_default"&amp;gt;False&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="has_tooltip"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="tooltip_markup" translatable="yes"&amp;gt;If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="tooltip_text" translatable="yes"&amp;gt;If checked, sorting will be case sensitive. Please note that case sensitive sorting will not work well with most charsets.&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="halign"&amp;gt;start&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="use_action_appearance"&amp;gt;False&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="use_underline"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="xalign"&amp;gt;0&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="draw_indicator"&amp;gt;True&amp;lt;/property&amp;gt;
+                                        &amp;lt;signal name="toggled" handler="on_tm_sort_case_sensitive_toggled" swapped="no"/&amp;gt;
+                                      &amp;lt;/object&amp;gt;
+                                      &amp;lt;packing&amp;gt;
+                                        &amp;lt;property name="expand"&amp;gt;False&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="fill"&amp;gt;False&amp;lt;/property&amp;gt;
+                                        &amp;lt;property name="position"&amp;gt;1&amp;lt;/property&amp;gt;
+                                      &amp;lt;/packing&amp;gt;
+                                    &amp;lt;/child&amp;gt;
+                                  &amp;lt;/object&amp;gt;
+                                &amp;lt;/child&amp;gt;
+                              &amp;lt;/object&amp;gt;
+                            &amp;lt;/child&amp;gt;
+                            &amp;lt;child type="label"&amp;gt;
+                              &amp;lt;object class="GtkLabel" id="label4"&amp;gt;
+                                &amp;lt;property name="visible"&amp;gt;True&amp;lt;/property&amp;gt;
+                                &amp;lt;property name="can_focus"&amp;gt;False&amp;lt;/property&amp;gt;
+                                &amp;lt;property name="label" translatable="yes"&amp;gt;&amp;amp;lt;b&amp;amp;gt;Track Display Sort Order&amp;amp;lt;/b&amp;amp;gt;&amp;lt;/property&amp;gt;
+                                &amp;lt;property name="use_markup"&amp;gt;True&amp;lt;/property&amp;gt;
+                              &amp;lt;/object&amp;gt;
+                            &amp;lt;/child&amp;gt;
                           &amp;lt;/object&amp;gt;
                           &amp;lt;packing&amp;gt;
-                            &amp;lt;property name="expand"&amp;gt;False&amp;lt;/property&amp;gt;
-                            &amp;lt;property name="fill"&amp;gt;False&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="expand"&amp;gt;True&amp;lt;/property&amp;gt;
+                            &amp;lt;property name="fill"&amp;gt;True&amp;lt;/property&amp;gt;
                             &amp;lt;property name="position"&amp;gt;1&amp;lt;/property&amp;gt;
                           &amp;lt;/packing&amp;gt;
                         &amp;lt;/child&amp;gt;
diff --git a/plugins/track_display/track_display_preferences.c b/plugins/track_display/track_display_preferences.c
index 6db338e..628e488 100644
--- a/plugins/track_display/track_display_preferences.c
+++ b/plugins/track_display/track_display_preferences.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -31,6 +31,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "libgtkpod/misc_conversion.h"
 #include "libgtkpod/prefs.h"
 #include "libgtkpod/directories.h"
+#include "libgtkpod/gp_private.h"
 #include "plugin.h"
 #include "display_tracks.h"
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -425,6 +426,27 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; G_MODULE_EXPORT void on_tm_sort_autostore_toggled(GtkToggleButton *togglebutton,
     gtkpod_broadcast_preference_change("tm_autostore", &amp;amp;val);
 }
 
+G_MODULE_EXPORT void on_tm_sort_none_toggled(GtkToggleButton *togglebutton, gpointer user_data) {
+    if (gtk_toggle_button_get_active(togglebutton)) {
+        prefs_set_int("tm_sort", SORT_NONE);
+        gtkpod_broadcast_preference_change("tm_sort", GINT_TO_POINTER(SORT_NONE));
+    }
+}
+
+G_MODULE_EXPORT void on_tm_sort_asc_toggled(GtkToggleButton *togglebutton, gpointer user_data) {
+    if (gtk_toggle_button_get_active(togglebutton)) {
+        prefs_set_int("tm_sort", SORT_ASCENDING);
+        gtkpod_broadcast_preference_change("tm_sort", GINT_TO_POINTER(SORT_ASCENDING));
+    }
+}
+
+G_MODULE_EXPORT void on_tm_sort_desc_toggled(GtkToggleButton *togglebutton, gpointer user_data) {
+    if (gtk_toggle_button_get_active(togglebutton)) {
+        prefs_set_int("tm_sort", SORT_DESCENDING);
+        gtkpod_broadcast_preference_change("tm_sort", GINT_TO_POINTER(SORT_DESCENDING));
+    }
+}
+
 GtkWidget *init_track_display_preferences() {
     GtkComboBox *cmd_combo;
     gint i = 0;
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -471,6 +493,22 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; GtkWidget *init_track_display_preferences() {
         gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), prefs_get_int("tm_autostore"));
     }
 
+    // Sort toggle buttons
+    switch (prefs_get_int("tm_sort")) {
+       case SORT_ASCENDING:
+           w = gtkpod_builder_xml_get_widget(prefbuilder, "tm_sort_ascend");
+           break;
+       case SORT_DESCENDING:
+           w = gtkpod_builder_xml_get_widget(prefbuilder, "tm_sort_descend");
+           break;
+       default:
+           w = gtkpod_builder_xml_get_widget(prefbuilder, "tm_sort_none");
+           break;
+    }
+
+    if (w)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
+
     gtk_builder_connect_signals(prefbuilder, NULL);
 
     return notebook;

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
&lt;/pre&gt;</description>
    <dc:creator>phantomjinx</dc:creator>
    <dc:date>2012-10-23T22:15:33</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3633">
    <title>[gtpd-cvs] [gtkpod] Reduce the number of selection changed callbacks</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3633</link>
    <description>&lt;pre&gt;commit 3691ab555c811ef87fb9f902b76089aa6f7b514e
Author: phantomjinx &amp;lt;p.g.richardson&amp;lt; at &amp;gt;phantomjinx.co.uk&amp;gt;
Date:   Tue Oct 23 21:35:22 2012 +0100

    Reduce the number of selection changed callbacks
    
    * When a playlist is selected, the sorttabs are repopulated and their
      selections reselected. This causes the displayed tracks to be reset,
      producing more signals and firing more callbacks.
    
    * Reduces the number of callbacks fired by only initiating the idle
      selection callback if one has not already been scheduled.

 plugins/sorttab_display/normal_sorttab_page.c |   33 ++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)
---
diff --git a/plugins/sorttab_display/normal_sorttab_page.c b/plugins/sorttab_display/normal_sorttab_page.c
index 9dfb338..ea64cf7 100644
--- a/plugins/sorttab_display/normal_sorttab_page.c
+++ b/plugins/sorttab_display/normal_sorttab_page.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -41,6 +41,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "normal_sorttab_page.h"
 #include "sorttab_display_context_menu.h"
 
+#define NO_IDLE_SELECTION_CALLBACK -1
+
 G_DEFINE_TYPE( NormalSortTabPage, normal_sort_tab_page, GTK_TYPE_TREE_VIEW);
 
 #define NORMAL_SORT_TAB_PAGE_GET_PRIVATE(obj) \
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -60,6 +62,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; struct _NormalSortTabPagePrivate {
     /* Handler id of the selection changed callback */
     gulong selection_changed_id;
 
+    /*
+     * Handler id of the idle callback when the selection
+     * changed callback is executed
+     */
+    guint selection_changed_idle_id;
+
     /* name of entry last selected */
     GList *last_selection;
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -547,6 +555,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static gboolean _st_selection_changed_cb(gpointer data) {
             time.tv_sec % 3600, time.tv_usec);
 #endif
 
+    priv-&amp;gt;selection_changed_idle_id = NO_IDLE_SELECTION_CALLBACK;
+
     return FALSE;
 }
 
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -558,10 +568,28 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static gboolean _st_selection_changed_cb(gpointer data) {
  * called.
  */
 static void _st_selection_changed(GtkTreeSelection *selection, gpointer user_data) {
+
+    NormalSortTabPage *self = NORMAL_SORT_TAB_PAGE(user_data);
+    gulong idleId = NO_IDLE_SELECTION_CALLBACK;
+
+    if (self) {
+        NormalSortTabPagePrivate *priv = NORMAL_SORT_TAB_PAGE_GET_PRIVATE(self);
+        idleId = priv-&amp;gt;selection_changed_idle_id;
+    }
+
 #if DEBUG_CB_INIT
     printf("st_s_c enter (inst: %p)\n", (gint)user_data);
 #endif
-    gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE, _st_selection_changed_cb, user_data, NULL);
+
+    if (idleId == NO_IDLE_SELECTION_CALLBACK) {
+        // Only execute an idle function if one has not already been scheduled
+        idleId = gdk_threads_add_idle_full(G_PRIORITY_DEFAULT_IDLE, _st_selection_changed_cb, user_data, NULL);
+        if (self) {
+            NormalSortTabPagePrivate *priv = NORMAL_SORT_TAB_PAGE_GET_PRIVATE(self);
+            priv-&amp;gt;selection_changed_idle_id = idleId;
+        }
+    }
+
 #if DEBUG_CB_INIT
     printf("st_s_c exit (inst: %p)\n", (gint)user_data);
 #endif
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -883,6 +911,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; GtkWidget *normal_sort_tab_page_new(SortTabWidget *st_widget_parent, ST_CAT_item
     priv-&amp;gt;selection_changed_id = g_signal_connect (G_OBJECT (selection), "changed",
                 G_CALLBACK (_st_selection_changed),
                 nst);
+
+    priv-&amp;gt;selection_changed_idle_id = NO_IDLE_SELECTION_CALLBACK;
+
     /*
      * set string compare function according to
      * whether the ignore field is set or not

------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
&lt;/pre&gt;</description>
    <dc:creator>phantomjinx</dc:creator>
    <dc:date>2012-10-23T22:15:26</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3632">
    <title>[gtpd-cvs] [gtkpod] Fix to cater for changing API in anjuta version3.5.3+</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3632</link>
    <description>&lt;pre&gt;commit 1824e421d05c45339ce49d3b298ba7e9cc01f5c8
Author: phantomjinx &amp;lt;p.g.richardson&amp;lt; at &amp;gt;phantomjinx.co.uk&amp;gt;
Date:   Sat Oct 13 22:37:13 2012 +0100

    Fix to cater for changing API in anjuta version 3.5.3+
    
    * Contribute to future proofing against new versions of anjuta library
    
    * Thanks to Dominique (dimstar at opensuse.org) for the report and patch

 src/anjuta-app.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
---
diff --git a/src/anjuta-app.c b/src/anjuta-app.c
index 9f4d6db..df08b06 100644
--- a/src/anjuta-app.c
+++ b/src/anjuta-app.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -38,6 +38,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include &amp;lt;libanjuta/resources.h&amp;gt;
 #include &amp;lt;libanjuta/anjuta-plugin-manager.h&amp;gt;
 #include &amp;lt;libanjuta/anjuta-debug.h&amp;gt;
+#include &amp;lt;libanjuta/anjuta-version.h&amp;gt;
 
 #include "anjuta-app.h"
 #include "anjuta-actions.h"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -501,7 +502,11 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; static void anjuta_app_instance_init(AnjutaApp *app) {
     g_list_free(plugins_dirs);
 
     /* Preferences */
+#if ANJUTA_CHECK_VERSION(3,5,3)
+    app-&amp;gt;preferences = anjuta_preferences_new(app-&amp;gt;plugin_manager, PREF_SCHEMA);
+#else
     app-&amp;gt;preferences = anjuta_preferences_new(app-&amp;gt;plugin_manager);
+#endif
     g_object_add_weak_pointer(G_OBJECT (app-&amp;gt;preferences), (gpointer) &amp;amp;app-&amp;gt;preferences);
 
     g_signal_connect(app-&amp;gt;settings, "changed::" GDL_STYLE, G_CALLBACK(on_gdl_style_changed), app);

------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
&lt;/pre&gt;</description>
    <dc:creator>phantomjinx</dc:creator>
    <dc:date>2012-10-13T21:37:55</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3631">
    <title>[gtpd-cvs] [libgpod: 11/11] Add backward compatible definition forg_mapped_file_unref.</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3631</link>
    <description>&lt;pre&gt;commit 0a3750d1b19183c6684ed998247b2a28fe1e6c5f
Author: Javier Kohen &amp;lt;jkohen&amp;lt; at &amp;gt;users.sourceforge.net&amp;gt;
Date:   Sun Oct 7 08:42:42 2012 +0200

    Add backward compatible definition for g_mapped_file_unref.

 configure.ac           |    5 +++--
 src/db-parse-context.c |    4 ++++
 2 files changed, 7 insertions(+), 2 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 04949cc..8c1ecd9 100644
--- a/configure.ac
+++ b/configure.ac
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -45,8 +45,8 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; dnl by libgpod sqlite code
 PKG_CHECK_MODULES(LIBGPOD, glib-2.0 &amp;gt;= 2.16.0 gobject-2.0 sqlite3 libplist &amp;gt;= 1.0 gmodule-2.0)
 
 dnl ***************************************************
-dnl g_gint64_hash and g_gint64_equal are only available
-dnl starting from glib 2.22.
+dnl The following functions are only available starting
+dnl from glib 2.22.
 dnl ***************************************************
 saved_CFLAGS="$CFLAGS"
 saved_LIBS="$LIBS"
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -54,6 +54,7 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; CFLAGS="$LIBGPOD_CFLAGS $CFLAGS"
 LIBS="$LIBGPOD_LIBS $LIBS"
 AC_CHECK_FUNCS([g_int64_hash g_int64_equal])
 AC_CHECK_FUNCS([g_checksum_reset])
+AC_CHECK_FUNCS([g_mapped_file_unref])
 CFLAGS="$saved_CFLAGS"
 LIBS="$saved_LIBS"
 
diff --git a/src/db-parse-context.c b/src/db-parse-context.c
index 789b3e9..89b9e33 100644
--- a/src/db-parse-context.c
+++ b/src/db-parse-context.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -40,6 +40,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt;
 #include "db-itunes-parser.h"
 #include "itdb_endianness.h"
 
+#ifndef HAVE_G_MAPPED_FILE_UNREF
+#define g_mapped_file_unref(f) g_mapped_file_free(f)
+#endif
+
 DBParseContext *
 db_parse_context_new (const unsigned char *buffer, off_t len, guint byte_order)
 {

------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
&lt;/pre&gt;</description>
    <dc:creator>Javier Kohen</dc:creator>
    <dc:date>2012-10-07T06:48:08</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3630">
    <title>[gtpd-cvs] [libgpod: 10/11] Merge branch 'dev' ofgit://github.com/neuschaefer/libgpod</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3630</link>
    <description>&lt;pre&gt;commit c10822a75a9ae893df23f2a6a69d7d20f8438d68
Merge: cc909f3 f2d3b3c
Author: Javier Kohen &amp;lt;jkohen&amp;lt; at &amp;gt;users.sourceforge.net&amp;gt;
Date:   Sun Oct 7 08:34:57 2012 +0200

    Merge branch 'dev' of git://github.com/neuschaefer/libgpod

 src/db-parse-context.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
---

------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
&lt;/pre&gt;</description>
    <dc:creator>Javier Kohen</dc:creator>
    <dc:date>2012-10-07T06:48:02</dc:date>
  </item>
  <item rdf:about="http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3629">
    <title>[gtpd-cvs] [libgpod: 9/11] replace deprecated g_basename()</title>
    <link>http://comments.gmane.org/gmane.comp.ipod.gtkpod.cvs/3629</link>
    <description>&lt;pre&gt;commit cc909f3e38aebeb6c560ae9d07a1adad0519036d
Author: Jonathan Neuschäfer &amp;lt;j.neuschaefer&amp;lt; at &amp;gt;gmx.net&amp;gt;
Date:   Thu Sep 27 20:28:31 2012 +0200

    replace deprecated g_basename()
    
    g_basename is deprecated since GLib 2.2.
    
    As all of these calls are done just before the program terminates,
    we might as well skip the g_free.

 tests/get-timezone.c         |    4 +++-
 tests/itdb_main.c            |    5 ++++-
 tests/test-cp.cc             |    4 +++-
 tests/test-fw-id.c           |    4 +++-
 tests/test-ls.c              |    6 ++++--
 tests/test-rebuild-db.cc     |    4 +++-
 tools/ipod-time-sync.c       |    6 ++++--
 tools/read-sysinfoextended.c |    6 ++++--
 8 files changed, 28 insertions(+), 11 deletions(-)
---
diff --git a/tests/get-timezone.c b/tests/get-timezone.c
index e453ca3..60977d9 100644
--- a/tests/get-timezone.c
+++ b/tests/get-timezone.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -28,7 +28,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int main (int argc, char **argv)
     if (argc &amp;gt;= 2) {
         mountpoint = argv[1];
     } else {
-        g_print ("Usage: %s &amp;lt;mountpoint&amp;gt;\n\n", g_basename(argv[0]));
+        char *basename = g_path_get_basename(argv[0]);
+        g_print ("Usage: %s &amp;lt;mountpoint&amp;gt;\n\n", basename);
+        g_free (basename);
         return -1;
     }
 
diff --git a/tests/itdb_main.c b/tests/itdb_main.c
index e7723bb..1cc03a4 100644
--- a/tests/itdb_main.c
+++ b/tests/itdb_main.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -55,7 +55,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; main (int argc, char *argv[])
 
   if (infile == 0)
   {
-      printf ("Usage: %s &amp;lt;infile&amp;gt; [&amp;lt;outfile&amp;gt;]\n",  g_basename(argv[0]));
+      char *basename = g_path_get_basename(argv[0]);
+      printf ("Usage: %s &amp;lt;infile&amp;gt; [&amp;lt;outfile&amp;gt;]\n", basename);
+      g_free(basename);
+
       exit (0);
   }
 
diff --git a/tests/test-cp.cc b/tests/test-cp.cc
index cec778d..73a1dd9 100644
--- a/tests/test-cp.cc
+++ b/tests/test-cp.cc
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -108,8 +108,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int main (int argc, char **argv)
 GError *error;
 
 if (argc != 3) {
+char *basename = g_path_get_basename(argv[0]);
 g_print ("Usage:\n");
-g_print ("%s &amp;lt;filename&amp;gt; &amp;lt;mountpoint&amp;gt; \n", g_basename (argv[0]));
+g_print ("%s &amp;lt;filename&amp;gt; &amp;lt;mountpoint&amp;gt; \n", basename);
+g_free (basename);
 exit (1);
 }
 
diff --git a/tests/test-fw-id.c b/tests/test-fw-id.c
index 7490001..085123a 100644
--- a/tests/test-fw-id.c
+++ b/tests/test-fw-id.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -42,7 +42,9 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; main (int argc, char *argv[])
     char *fwid;
 
     if (argc &amp;lt; 2) {
-        g_print ("Usage: %s &amp;lt;mountpoint&amp;gt;\n", g_basename (argv[0]));
+        char *basename = g_path_get_basename(argv[0]);
+        g_print ("Usage: %s &amp;lt;mountpoint&amp;gt;\n", basename);
+        g_free (basename);
         return 1;
 
     }
diff --git a/tests/test-ls.c b/tests/test-ls.c
index e28cd9c..464824e 100644
--- a/tests/test-ls.c
+++ b/tests/test-ls.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -118,10 +118,12 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; main (int argc, char *argv[])
  
   if (mountpoint == NULL)
   {
+      char *basename = g_path_get_basename (argv[0]);
       g_print ("Usage: %s &amp;lt;mountpoint&amp;gt;|-l [&amp;lt;playlistname&amp;gt;]\n\n"
                "-l - List from the local repository (~" LOCALDB ")\n"
-       "&amp;lt;playlistname&amp;gt; - name of the playlist to list (optional)\n",  
-                g_basename(argv[0]));
+               "&amp;lt;playlistname&amp;gt; - name of the playlist to list (optional)\n",
+               basename);
+      g_free (basename);
       exit (0);
   }
 
diff --git a/tests/test-rebuild-db.cc b/tests/test-rebuild-db.cc
index fbcaf1e..f2b05ef 100644
--- a/tests/test-rebuild-db.cc
+++ b/tests/test-rebuild-db.cc
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -216,8 +216,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int main (int argc, char **argv)
 GError *error;
 
 if (argc != 2) {
+char *basename = g_path_get_basename(argv[0]);
 g_print ("Usage:\n");
-g_print ("%s &amp;lt;mountpoint&amp;gt;\n", g_basename (argv[0]));
+g_print ("%s &amp;lt;mountpoint&amp;gt;\n", basename);
+g_free (basename);
 exit (1);
 }
 
diff --git a/tools/ipod-time-sync.c b/tools/ipod-time-sync.c
index 0cc62f1..a0cc163 100644
--- a/tools/ipod-time-sync.c
+++ b/tools/ipod-time-sync.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -34,8 +34,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; int
 main (int argc, char **argv)
 {
     if (argc &amp;lt; 2) {
-        g_print (_("usage: %s &amp;lt;device&amp;gt; [timezone]\n"), g_basename (argv[0]));
-return 1;
+        char *basename = g_path_get_basename (argv[0]);
+        g_print (_("usage: %s &amp;lt;device&amp;gt; [timezone]\n"), basename);
+        g_free (basename);
+        return 1;
     }
 
     sync_time (argv[1], NULL);
diff --git a/tools/read-sysinfoextended.c b/tools/read-sysinfoextended.c
index b3afd2c..8262137 100644
--- a/tools/read-sysinfoextended.c
+++ b/tools/read-sysinfoextended.c
&amp;lt; at &amp;gt;&amp;lt; at &amp;gt; -78,8 +78,10 &amp;lt; at &amp;gt;&amp;lt; at &amp;gt; main (int argc, char **argv)
     char *xml;
     
     if (argc &amp;lt; 3) {
-      g_print (_("usage: %s &amp;lt;device|uuid|bus device&amp;gt; &amp;lt;mountpoint&amp;gt;\n"), g_basename (argv[0]));
-return 1;
+      char *basename = g_path_get_basename (argv[0]);
+      g_print (_("usage: %s &amp;lt;device|uuid|bus device&amp;gt; &amp;lt;mountpoint&amp;gt;\n"), basename);
+      g_free (basename);
+      return 1;
     }
 
     xml = NULL;

------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
gtkpod-cvs2 mailing list
gtkpod-cvs2&amp;lt; at &amp;gt;lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2
&lt;/pre&gt;</description>
    <dc:creator>Javier Kohen</dc:creator>
    <dc:date>2012-10-07T06:47:56</dc:date>
  </item>
  <textinput rdf:about="http://search.gmane.org/?group=$group=gmane.comp.ipod.gtkpod.cvs">
    <title>Search Engine</title>
    <description>Search the mailing list at Gmane</description>
    <name>query</name>
    <link>http://search.gmane.org/?group=$group=gmane.comp.ipod.gtkpod.cvs</link>
  </textinput>
</rdf:RDF>
