Mercurial > audlegacy
changeset 3479:26910525cec8 trunk
merge
author | Kieran Clancy <clancy.kieran+audacious@gmail.com> |
---|---|
date | Mon, 10 Sep 2007 14:18:18 +0930 |
parents | 481a4a88d3ec (diff) b96b0b35d5cf (current diff) |
children | 3f4ad59a5c02 |
files | src/audacious/playlist.c src/audacious/playlist.h |
diffstat | 3 files changed, 96 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/audacious/playlist.c Mon Sep 10 09:24:03 2007 +0900 +++ b/src/audacious/playlist.c Mon Sep 10 14:18:18 2007 +0930 @@ -282,8 +282,10 @@ void playlist_remove_playlist(Playlist *playlist) { + gboolean active; + active = (playlist && playlist == playlist_get_active()); /* users suppose playback will be stopped on removing playlist */ - if (playback_get_playing()) { + if (active && playback_get_playing()) { ip_data.stop = TRUE; playback_stop(); ip_data.stop = FALSE; @@ -294,11 +296,11 @@ if (g_list_length(playlists) < 2) { playlist_clear(playlist); playlist_set_current_name(playlist, NULL); + playlist_filename_set(playlist, NULL); return; } - if (playlist == playlist_get_active()) - playlist_select_next(); + if (active) playlist_select_next(); /* upon removal, a playlist should be cleared and freed */ playlists = g_list_remove(playlists, playlist); @@ -364,22 +366,50 @@ return playlist->title; } -/* filename is real filename here. --yaz */ +/* This function now sets the playlist title, not the playlist filename. + * See playlist_filename_set */ gboolean -playlist_set_current_name(Playlist *playlist, const gchar * filename) +playlist_set_current_name(Playlist *playlist, const gchar * title) { - if (playlist->title) - g_free(playlist->title); - - if (!filename) { + gchar *oldtitle; + oldtitle = playlist->title; + + if (!title) { playlist->title = NULL; + if(oldtitle) g_free(oldtitle); return FALSE; } - playlist->title = filename_to_utf8(filename); + playlist->title = str_to_utf8(title); + if(oldtitle) g_free(oldtitle); return TRUE; } +/* Setting the filename allows the original playlist to be modified later */ +gboolean +playlist_filename_set(Playlist *playlist, const gchar * filename) +{ + gchar *old; + old = playlist->filename; + + if(!filename) { + playlist->filename = NULL; + if(old) g_free(old); + return FALSE; + } + + playlist->filename = filename_to_utf8(filename); + if(old) g_free(old); + return TRUE; +} + +gchar * +playlist_filename_get(Playlist *playlist) +{ + if(!playlist->filename) return NULL; + return g_filename_from_utf8(playlist->filename, -1, NULL, NULL, NULL); +} + static GList * find_playlist_position_list(Playlist *playlist) { @@ -1574,6 +1604,7 @@ playlist_save(Playlist * playlist, const gchar * filename) { PlaylistContainer *plc = NULL; + GList *old_iter; gchar *ext; g_return_val_if_fail(playlist != NULL, FALSE); @@ -1581,16 +1612,22 @@ ext = strrchr(filename, '.') + 1; - if (!playlist->title || !playlist->title[0]) - playlist_set_current_name(playlist, filename); - if ((plc = playlist_container_find(ext)) == NULL) return FALSE; if (plc->plc_write == NULL) return FALSE; - plc->plc_write(filename, 0); + /* Save the right playlist to disk */ + if (playlist != playlist_get_active()) { + old_iter = playlists_iter; + playlists_iter = g_list_find(playlists, playlist); + if(!playlists_iter) playlists_iter = old_iter; + plc->plc_write(filename, 0); + playlists_iter = old_iter; + } else { + plc->plc_write(filename, 0); + } return TRUE; } @@ -1602,6 +1639,10 @@ g_return_val_if_fail(playlist != NULL, FALSE); playlist->loading_playlist = TRUE; + if(!playlist_get_length(playlist)) { + /* Loading new playlist */ + playlist_filename_set(playlist, filename); + } ret = playlist_load_ins(playlist, filename, -1); playlist->loading_playlist = FALSE; @@ -1765,7 +1806,7 @@ if (playlist != playlist_get_active()) { old_iter = playlists_iter; playlists_iter = g_list_find(playlists, playlist); - if (!playlists_iter) playlists_iter = playlists; + if (!playlists_iter) playlists_iter = old_iter; plc->plc_read(filename, pos); playlists_iter = old_iter; } else { @@ -3250,8 +3291,8 @@ Playlist *playlist = g_new0(Playlist, 1); playlist->mutex = g_mutex_new(); playlist->loading_playlist = FALSE; - - playlist_set_current_name(playlist, NULL); + playlist->title = NULL; + playlist->filename = NULL; playlist_clear(playlist); return playlist; @@ -3337,3 +3378,23 @@ return playlist->position; } + +gboolean +playlist_playlists_equal(Playlist *p1, Playlist *p2) +{ + GList *l1, *l2; + PlaylistEntry *e1, *e2; + if (!p1 || !p2) return FALSE; + l1 = p1->entries; + l2 = p2->entries; + do { + if (!l1 && !l2) break; + if (!l1 || !l2) return FALSE; /* different length */ + e1 = (PlaylistEntry *) l1->data; + e2 = (PlaylistEntry *) l2->data; + if (strcmp(e1->filename, e2->filename) != 0) return FALSE; + l1 = l1->next; + l2 = l2->next; + } while(1); + return TRUE; +}
--- a/src/audacious/playlist.h Mon Sep 10 09:24:03 2007 +0900 +++ b/src/audacious/playlist.h Mon Sep 10 14:18:18 2007 +0930 @@ -214,8 +214,13 @@ void playlist_clear_selected(Playlist *playlist); GList *get_playlist_nth(Playlist *playlist, guint); -gboolean playlist_set_current_name(Playlist *playlist, const gchar * filename); + +gboolean playlist_set_current_name(Playlist *playlist, const gchar * title); const gchar *playlist_get_current_name(Playlist *playlist); + +gboolean playlist_filename_set(Playlist *playlist, const gchar * filename); +gchar *playlist_filename_get(Playlist *playlist); + Playlist *playlist_new(void); void playlist_free(Playlist *playlist); Playlist *playlist_new_from_selected(void); @@ -238,6 +243,8 @@ Playlist *playlist_get_active(void); +gboolean playlist_playlists_equal(Playlist *p1, Playlist *p2); + G_END_DECLS #endif
--- a/src/audacious/ui_playlist.c Mon Sep 10 09:24:03 2007 +0900 +++ b/src/audacious/ui_playlist.c Mon Sep 10 14:18:18 2007 +0930 @@ -53,6 +53,7 @@ #include "ui_main.h" #include "ui_manager.h" #include "util.h" +#include "config.h" #include "ui_skinned_window.h" #include "ui_skinned_button.h" @@ -827,6 +828,7 @@ static void playlistwin_load_playlist(const gchar * filename) { + const gchar *title; Playlist *playlist = playlist_get_active(); g_return_if_fail(filename != NULL); @@ -837,7 +839,9 @@ mainwin_clear_song_info(); playlist_load(playlist, filename); - playlist_set_current_name(playlist, filename); + title = playlist_get_current_name(playlist); + if(!title || !title[0]) + playlist_set_current_name(playlist, filename); } static gchar * @@ -949,12 +953,16 @@ playlist_file_selection_save(_("Save Playlist"), default_filename); if (filename) { - /* Default to xspf if no filename has extension */ + /* Default extension */ basename = g_path_get_basename(filename); dot = strrchr(basename, '.'); if( dot == NULL || dot == basename) { gchar *oldname = filename; +#ifdef HAVE_XSPF_PLAYLIST filename = g_strconcat(oldname, ".xspf", NULL); +#else + filename = g_strconcat(oldname, ".m3u", NULL); +#endif g_free(oldname); } g_free(basename);