[easytag/wip/application-window: 7/42] Avoid assertion in Action_Select_Browser_Style()
- From: David King <davidk src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [easytag/wip/application-window: 7/42] Avoid assertion in Action_Select_Browser_Style()
- Date: Sun, 22 Jun 2014 12:05:15 +0000 (UTC)
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]