[easytag/wip/application-window: 7/42] Avoid assertion in Action_Select_Browser_Style()



commit 4c4d312ebd32832a24133893eff41ee46f6ca603
Author: Andreas Winkelmann <ml awinkelmann de>
Date:   Fri Jun 20 02:20:33 2014 +0200

    Avoid assertion in Action_Select_Browser_Style()
    
    When changing to artist/album view the browser list gets cleared.  While
    clearing, GTK+ emits a changed signal for each row, and
    Browser_List_Row_Selected() gets triggered, unfortunately with a row
    where the backing file list has already been freed.
    
    Added a function which clears the list and stops emissions of
    Browser_List_Row_Selected() while clearing.

 src/browser.c |   26 ++++++++++++++++++++++++--
 src/browser.h |    1 +
 src/et_core.c |    8 +++++++-
 3 files changed, 32 insertions(+), 3 deletions(-)
---
diff --git a/src/browser.c b/src/browser.c
index 8f10b10..33c1b11 100644
--- a/src/browser.c
+++ b/src/browser.c
@@ -1026,7 +1026,7 @@ void Browser_List_Load_File_List (GList *etfilelist, ET_File *etfile_to_select)
 
     g_return_if_fail (BrowserList != NULL);
 
-    gtk_list_store_clear(fileListModel);
+    browser_file_model_clear ();
 
     for (l = g_list_first (etfilelist); l != NULL; l = g_list_next (l))
     {
@@ -1725,13 +1725,35 @@ ET_File *Browser_List_Select_File_By_DLM (const gchar* string, gboolean select_i
     return retval;
 }
 
+/*
+ * Empty model, disabling Browser_List_Row_Selected () during clear because it
+ * is called and causes crashes otherwise.
+ */
+void
+browser_file_model_clear (void)
+{
+    GtkTreeSelection *selection;
+
+    selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (BrowserList));
+
+    g_signal_handlers_block_by_func (selection,
+                                     G_CALLBACK (Browser_List_Row_Selected),
+                                     NULL);
+
+    gtk_list_store_clear (fileListModel);
+
+    g_signal_handlers_unblock_by_func (selection,
+                                       G_CALLBACK (Browser_List_Row_Selected),
+                                       NULL);
+}
+
 
 /*
  * Clear all entries on the file list
  */
 void Browser_List_Clear()
 {
-    gtk_list_store_clear(fileListModel);
+    browser_file_model_clear ();
     browser_artist_model_clear ();
     browser_album_model_clear ();
 
diff --git a/src/browser.h b/src/browser.h
index c1bcfb5..425754f 100644
--- a/src/browser.h
+++ b/src/browser.h
@@ -147,6 +147,7 @@ GtkWidget   *Create_Browser_Items    (GtkWidget *parent);
 
 void browser_album_model_clear (void);
 void browser_artist_model_clear (void);
+void browser_file_model_clear (void);
 
 gboolean     Browser_Tree_Select_Dir (const gchar *current_path);
 void         Browser_Tree_Rebuild    (gchar *path_to_load);
diff --git a/src/et_core.c b/src/et_core.c
index b278494..c709a13 100644
--- a/src/et_core.c
+++ b/src/et_core.c
@@ -2100,7 +2100,13 @@ GList *ET_Displayed_File_List_By_Etfile (ET_File *ETFile)
         if (ETFile == (ET_File *)etfilelist->data)
             break;
     }
-    ETCore->ETFileDisplayedList = etfilelist; // To "save" the position like in ET_File_List_Next... (not 
very good - FIX ME)
+
+    if (etfilelist)
+    {
+        /* To "save" the position like in ET_File_List_Next... (not very good -
+         * FIXME) */
+        ETCore->ETFileDisplayedList = etfilelist;
+    }
     return etfilelist;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]