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

Reply via email to