Author: kelnos
Date: 2006-11-27 02:50:40 +0000 (Mon, 27 Nov 2006)
New Revision: 23971
Modified:
xfmedia/trunk/src/main.c
xfmedia/trunk/src/playlist.c
xfmedia/trunk/src/settings-dialog.c
xfmedia/trunk/src/settings.c
xfmedia/trunk/src/xfmedia-internal.h
xfmedia/trunk/xfmedia/xfmedia-playlist.h
Log:
fix autosave handling (bug 1722, sorta)
Modified: xfmedia/trunk/src/main.c
===================================================================
--- xfmedia/trunk/src/main.c 2006-11-27 01:12:43 UTC (rev 23970)
+++ xfmedia/trunk/src/main.c 2006-11-27 02:50:40 UTC (rev 23971)
@@ -100,12 +100,6 @@
xfmedia_remote_cleanup(mwin);
xfmedia_plugins_unload();
- if(xfmedia_settings_get_bool("/xfmedia/playlist/save_on_exit_always")
- || !mwin->oneshot
- || xfmedia_playlist_is_dirty(mwin->plist))
- {
- xfmedia_settings_save_playlist(mwin);
- }
xfmedia_settings_cleanup();
/* save pointers */
@@ -452,7 +446,7 @@
DBG("calling XInitThreads()");
if(!XInitThreads()) {
- g_critical("XfmediaXine: XInitThreads() failed; thread-safe X11 libs
unavailable!\n");
+ g_critical("XfmediaXine: XInitThreads() failed; thread-aware X11 libs
unavailable! Disabling video output.\n");
video_port_id = "none";
} else
video_port_id =
xfmedia_settings_get_string("/xfmedia/plugins/libxine/video_out");
@@ -505,14 +499,15 @@
gchar *title_utf8 = xfmedia_filename_to_name(argv[i]);
xfmedia_playlist_append_entry(mwin->plist, title_utf8, -1,
argv[i], FALSE);
g_free(title_utf8);
- mwin->oneshot = TRUE;
}
do_autoplay = TRUE;
}
if(next_arg >= argc && !odata.dont_load_playlist)
- xfmedia_settings_load_playlist(mwin);
+ xfmedia_playlist_load_default_playlist(mwin->plist);
+ xfmedia_playlist_set_dirty(mwin->plist, FALSE);
+
do_startup_notify(mwin->window);
x = xfmedia_settings_get_int("/xfmedia/general/pos_x");
Modified: xfmedia/trunk/src/playlist.c
===================================================================
--- xfmedia/trunk/src/playlist.c 2006-11-27 01:12:43 UTC (rev 23970)
+++ xfmedia/trunk/src/playlist.c 2006-11-27 02:50:40 UTC (rev 23971)
@@ -62,6 +62,8 @@
#include "playlist-files.h"
#include "jumptofilewin.h"
+#define PLAYLIST_CACHE_FILE "xfmedia/playlist.m3u"
+
enum {
PLAYLIST_COL_NUM = 0,
PLAYLIST_COL_TITLE,
@@ -138,8 +140,11 @@
gchar *allowed_extensions;
gchar *chooser_last_dir;
- gboolean is_dirty;
+ guint autosave_id;
+ gboolean autosave_is_dirty;
+ gboolean usersave_is_dirty;
+
XfmediaPlaylistEntryRef *bold_ref;
XfmediaPlaylistEntryRef *italic_ref;
};
@@ -282,6 +287,9 @@
g_return_if_fail(XFMEDIA_IS_PLAYLIST(object));
plist = XFMEDIA_PLAYLIST(object);
+ if(plist->priv->autosave_is_dirty)
+ xfmedia_playlist_save_default_playlist(plist);
+
g_free(plist->priv->allowed_extensions);
g_free(plist->priv->shuffle_bitmap);
@@ -294,8 +302,35 @@
plist->priv = NULL;
G_OBJECT_CLASS(parent_class)->finalize(object);
+}
+
+static gboolean
+xfmedia_playlist_autosave_timeout(gpointer user_data)
+{
+ XfmediaPlaylist *plist = user_data;
+
+ plist->priv->autosave_id = 0;
+
+ if(!plist->priv->autosave_is_dirty)
+ return FALSE;
+
+ xfmedia_playlist_save_default_playlist(plist);
+
+ return FALSE;
}
+static void
+xfmedia_playlist_schedule_autosave(XfmediaPlaylist *plist)
+{
+ if(plist->priv->autosave_id)
+ return;
+
+ plist->priv->autosave_is_dirty = TRUE;
+
+ plist->priv->autosave_id = g_timeout_add(7500,
+ xfmedia_playlist_autosave_timeout,
+ plist);
+}
static void
xfmedia_playlist_renumber_file_list(GtkListStore *ls, gint from_index,
@@ -474,7 +509,7 @@
gtk_list_store_swap(plist->priv->file_list, &me,
&above_me);
path_index = xfmedia_tree_path_to_index((GtkTreePath
*)selected->data);
xfmedia_playlist_shuffle_swap_entries(plist, path_index,
path_index-1);
- plist->priv->is_dirty = TRUE;
+ xfmedia_playlist_schedule_autosave(plist);
}
}
}
@@ -517,7 +552,7 @@
gtk_list_store_swap(plist->priv->file_list, &me, &below_me);
path_index = xfmedia_tree_path_to_index((GtkTreePath
*)selected->data);
xfmedia_playlist_shuffle_swap_entries(plist, path_index,
path_index+1);
- plist->priv->is_dirty = TRUE;
+ xfmedia_playlist_schedule_autosave(plist);
}
}
if(child_path)
@@ -551,23 +586,27 @@
GtkWidget *toplevel;
gint resp;
- if(plist->priv->is_dirty && xfmedia_playlist_get_n_entries(plist) > 0) {
+ if(plist->priv->usersave_is_dirty
+ && xfmedia_playlist_get_n_entries(plist) > 0)
+ {
toplevel = gtk_widget_get_toplevel(GTK_WIDGET(plist));
resp = playlist_dirty_confirm(GTK_WINDOW(toplevel));
switch(resp) {
case GTK_RESPONSE_CANCEL:
return;
case GTK_RESPONSE_YES:
- if(!xfmedia_playlist_save_as_cb(GTK_WIDGET(plist), plist))
+ if(xfmedia_playlist_save_as_cb(GTK_WIDGET(plist), plist))
+ plist->priv->usersave_is_dirty = FALSE;
+ else
return;
break;
case GTK_RESPONSE_NO:
+ plist->priv->usersave_is_dirty = FALSE;
break;
}
}
xfmedia_playlist_clear(plist);
- plist->priv->is_dirty = FALSE;
xfmedia_playlist_shuffle_init_entries(plist, 0);
g_signal_emit(G_OBJECT(plist), __signals[PLIST_SIG_CLEARED], 0);
@@ -659,16 +698,21 @@
topwin = gtk_widget_get_toplevel(w);
- if(plist->priv->is_dirty && xfmedia_playlist_get_n_entries(plist) > 0) {
+ if(plist->priv->usersave_is_dirty
+ && xfmedia_playlist_get_n_entries(plist) > 0)
+ {
resp = playlist_dirty_confirm(GTK_WINDOW(w));
switch(resp) {
case GTK_RESPONSE_CANCEL:
return;
case GTK_RESPONSE_YES:
- if(!xfmedia_playlist_save_as_cb(w, plist))
+ if(xfmedia_playlist_save_as_cb(w, plist))
+ plist->priv->usersave_is_dirty = FALSE;
+ else
return;
break;
case GTK_RESPONSE_NO:
+ plist->priv->usersave_is_dirty = FALSE;
break;
}
}
@@ -701,7 +745,7 @@
if(filename) {
xfmedia_playlist_clear(plist);
if(xfmedia_playlists_load(plist, filename)) {
- plist->priv->is_dirty = FALSE;
+ xfmedia_playlist_schedule_autosave(plist);
g_signal_emit(G_OBJECT(plist), __signals[PLIST_SIG_OPENED], 0,
filename);
}
g_free(filename);
@@ -1096,7 +1140,7 @@
dest_index,
src_index);
xfmedia_playlist_shuffle_swap_entries(plist, src_index, dest_index);
- plist->priv->is_dirty = TRUE;
+
xfmedia_playlist_schedule_autosave(plist);
drag_success = TRUE;
}
} else {
@@ -1577,6 +1621,39 @@
return GTK_WIDGET(plist);
}
+gboolean
+xfmedia_playlist_load_default_playlist(XfmediaPlaylist *plist)
+{
+ gchar *file;
+ gboolean ret = FALSE;
+
+ /* use xfce_resource_lookup() so distros could provide a
+ * default playlist if they wanted to */
+ file = xfce_resource_lookup(XFCE_RESOURCE_CACHE, PLAYLIST_CACHE_FILE);
+ if(file) {
+ ret = xfmedia_playlists_load(plist, file);
+ g_free(file);
+ }
+
+ return ret;
+}
+
+gboolean
+xfmedia_playlist_save_default_playlist(XfmediaPlaylist *plist)
+{
+ gchar *file;
+ gboolean ret = FALSE;
+
+ file = xfce_resource_save_location(XFCE_RESOURCE_CACHE,
PLAYLIST_CACHE_FILE,
+ TRUE);
+ if(file) {
+ ret = xfmedia_playlists_save(plist, file, XFMEDIA_PLAYLIST_FORMAT_M3U);
+ g_free(file);
+ }
+
+ return ret;
+}
+
static void
xfmedia_playlist_insert_entry_internal(XfmediaPlaylist *plist, GtkTreeIter
*itr,
gint idx, const gchar *title, gint length, const gchar *filename,
@@ -1619,6 +1696,8 @@
g_signal_emit(G_OBJECT(plist), __signals[PLIST_SIG_ENTRY_ADDED], 0, idx);
g_free(filename_new);
+
+ xfmedia_playlist_schedule_autosave(plist);
}
guint
@@ -1692,6 +1771,8 @@
}
g_signal_emit(G_OBJECT(plist), __signals[PLIST_SIG_ENTRY_CHANGED], 0, idx);
+
+ xfmedia_playlist_schedule_autosave(plist);
}
gboolean
@@ -1720,6 +1801,8 @@
if(filename)
g_free(filename);
+ xfmedia_playlist_schedule_autosave(plist);
+
return TRUE;
}
@@ -1730,6 +1813,8 @@
gtk_list_store_clear(plist->priv->file_list);
g_signal_emit(G_OBJECT(plist), __signals[PLIST_SIG_CLEARED], 0);
+
+ xfmedia_playlist_schedule_autosave(plist);
}
@@ -1794,6 +1879,28 @@
return
gtk_tree_model_iter_n_children(GTK_TREE_MODEL(plist->priv->file_list), NULL);
}
+void
+xfmedia_playlist_set_dirty(XfmediaPlaylist *plist,
+ gboolean is_dirty)
+{
+ g_return_if_fail(XFMEDIA_IS_PLAYLIST(plist));
+
+ plist->priv->usersave_is_dirty = is_dirty;
+ plist->priv->autosave_is_dirty = is_dirty;
+
+ if(!is_dirty && plist->priv->autosave_id) {
+ g_source_remove(plist->priv->autosave_id);
+ plist->priv->autosave_id = 0;
+ }
+}
+
+gboolean
+xfmedia_playlist_get_dirty(XfmediaPlaylist *plist)
+{
+ g_return_val_if_fail(XFMEDIA_IS_PLAYLIST(plist), FALSE);
+ return plist->priv->usersave_is_dirty;
+}
+
gint
xfmedia_playlist_get_selected(XfmediaPlaylist *plist)
{
@@ -1932,13 +2039,6 @@
GTK_WIDGET(menu_item));
}
-gboolean
-xfmedia_playlist_is_dirty(XfmediaPlaylist *plist)
-{
- g_return_val_if_fail(XFMEDIA_IS_PLAYLIST(plist), FALSE);
- return plist->priv->is_dirty;
-}
-
void
xfmedia_playlist_set_shuffle_state(XfmediaPlaylist *plist, gboolean state)
{
Modified: xfmedia/trunk/src/settings-dialog.c
===================================================================
--- xfmedia/trunk/src/settings-dialog.c 2006-11-27 01:12:43 UTC (rev 23970)
+++ xfmedia/trunk/src/settings-dialog.c 2006-11-27 02:50:40 UTC (rev 23971)
@@ -446,13 +446,6 @@
}
static void
-soea_toggle_cb(GtkToggleButton *tb, gpointer user_data)
-{
- xfmedia_settings_set_bool("/xfmedia/playlist/save_on_exit_always",
- !gtk_toggle_button_get_active(tb));
-}
-
-static void
dock_autohide_cb(GtkToggleButton *tb, gpointer user_data)
{
XfmediaMainwin *mwin = user_data;
@@ -676,16 +669,6 @@
gtk_tooltips_set_tip(ttips, btn,
_("When a track ends, Xfmedia can automatically advance to the
next track in the playlist and continue playback."), NULL);
- btn = gtk_check_button_new_with_mnemonic(_("_Don't save playlist on exit
for one-shot invocations"));
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(btn),
-
!xfmedia_settings_get_bool("/xfmedia/playlist/save_on_exit_always"));
- gtk_widget_show(btn);
- gtk_box_pack_start(GTK_BOX(vbox), btn, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(btn), "toggled",
- G_CALLBACK(soea_toggle_cb), mwin);
- gtk_tooltips_set_tip(ttips, btn,
- _("Only automatically save the playlist during interactive use;
i.e., don't save the playlist when Xfmedia was invoked from the commandline
with a short list of definite arguments. This option needs to be named
better."), NULL);
-
hbox = gtk_hbox_new(FALSE, BORDER);
gtk_widget_show(hbox);
gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
Modified: xfmedia/trunk/src/settings.c
===================================================================
--- xfmedia/trunk/src/settings.c 2006-11-27 01:12:43 UTC (rev 23970)
+++ xfmedia/trunk/src/settings.c 2006-11-27 02:50:40 UTC (rev 23971)
@@ -62,7 +62,6 @@
#include "mainwin.h"
#include "playlist-files.h"
-#define PLAYLISTFILE "xfmedia/playlist.m3u"
#define XFMEDIA_CONFIG "xfmedia/settings.xml"
#define XFMEDIA_CONFIG_NEW "xfmedia/settings.xml.new"
#define XFMEDIA_CONFIG_WRITEFREQ 7500
@@ -605,7 +604,6 @@
xfmedia_settings_add_bool("/xfmedia/playlist/shuffle", FALSE);
xfmedia_settings_add_bool("/xfmedia/playlist/repeat", FALSE);
xfmedia_settings_add_bool("/xfmedia/playlist/auto_advance", TRUE);
- xfmedia_settings_add_bool("/xfmedia/playlist/save_on_exit_always", FALSE);
xfmedia_settings_add_int("/xfmedia/playlist/metadata_load_impetus", 0);
xfmedia_settings_add_bool("/xfmedia/playlist/repeat_one", FALSE);
xfmedia_settings_add_int("/xfmedia/playlist/add_sort_type", 0);
@@ -619,46 +617,7 @@
xfmedia_settings_add_int("/xfmedia/mediamarks/manager_height", 400);
}
-static inline gchar *
-get_default_playlist_file()
-{
- gchar *playlist_file;
-
- playlist_file = xfce_resource_save_location(XFCE_RESOURCE_CACHE,
- PLAYLISTFILE, TRUE);
-
- return playlist_file;
-}
-gboolean
-xfmedia_settings_load_playlist(XfmediaMainwin *mwin)
-{
- gchar *file = get_default_playlist_file();
- gboolean ret = FALSE;
-
- if(file) {
- ret = xfmedia_playlists_load(mwin->plist, file);
- g_free(file);
- }
-
- return ret;
-}
-
-gboolean
-xfmedia_settings_save_playlist(XfmediaMainwin *mwin)
-{
- gchar *file = get_default_playlist_file();
- gboolean ret = FALSE;
-
- if(file) {
- ret = xfmedia_playlists_save(mwin->plist, file,
XFMEDIA_PLAYLIST_FORMAT_M3U);
- g_free(file);
- }
-
- return ret;
-}
-
-
/* XML file parser */
struct ConfigParserState
Modified: xfmedia/trunk/src/xfmedia-internal.h
===================================================================
--- xfmedia/trunk/src/xfmedia-internal.h 2006-11-27 01:12:43 UTC (rev
23970)
+++ xfmedia/trunk/src/xfmedia-internal.h 2006-11-27 02:50:40 UTC (rev
23971)
@@ -95,8 +95,6 @@
/* settings.c */
void xfmedia_settings_init();
void xfmedia_settings_cleanup();
-gboolean xfmedia_settings_load_playlist(XfmediaMainwin *mwin);
-gboolean xfmedia_settings_save_playlist(XfmediaMainwin *mwin);
void xfmedia_settings_show_dialog(XfmediaMainwin *mwin);
/* xfmedia-plugins.c */
Modified: xfmedia/trunk/xfmedia/xfmedia-playlist.h
===================================================================
--- xfmedia/trunk/xfmedia/xfmedia-playlist.h 2006-11-27 01:12:43 UTC (rev
23970)
+++ xfmedia/trunk/xfmedia/xfmedia-playlist.h 2006-11-27 02:50:40 UTC (rev
23971)
@@ -92,6 +92,9 @@
GtkWidget *xfmedia_playlist_new ();
+gboolean xfmedia_playlist_load_default_playlist (XfmediaPlaylist *plist);
+gboolean xfmedia_playlist_save_default_playlist (XfmediaPlaylist *plist);
+
guint xfmedia_playlist_append_entry (XfmediaPlaylist *plist,
const gchar *title,
gint length,
@@ -126,6 +129,10 @@
gchar **filename);
guint xfmedia_playlist_get_n_entries (XfmediaPlaylist *plist);
+void xfmedia_playlist_set_dirty (XfmediaPlaylist *plist,
+ gboolean is_dirty);
+gboolean xfmedia_playlist_get_dirty (XfmediaPlaylist *plist);
+
gint xfmedia_playlist_get_selected (XfmediaPlaylist *plist);
void xfmedia_playlist_set_bold_entry (XfmediaPlaylist *plist,
@@ -138,8 +145,6 @@
void xfmedia_playlist_context_menu_append_item (XfmediaPlaylist *plist,
GtkMenuItem *menu_item);
-gboolean xfmedia_playlist_is_dirty (XfmediaPlaylist *plist);
-
void xfmedia_playlist_set_shuffle_state (XfmediaPlaylist *plist,
gboolean state);
gboolean xfmedia_playlist_get_shuffle_state (XfmediaPlaylist *plist);
_______________________________________________
Xfce4-commits mailing list
[email protected]
http://foo-projects.org/mailman/listinfo/xfce4-commits