commit - 90985bcf8a9ca17e826250929e02175e107e92a5
commit + 8168ea7cef941c9f497a1ec6ce6300ad5dad3d74
blob - 62e26489370dd569f2604514634f26ffa353ecde
blob + eb47fdfe16995f5d68a7f002a048695cadd735ea
--- src/folder.c
+++ src/folder.c
static Folder *folder_get_from_xml (GNode *node);
static void folder_update_op_count_rec (GNode *node);
-
-static void folder_get_persist_prefs_recursive
- (GNode *node, GHashTable *pptable);
-static gboolean persist_prefs_free (gpointer key, gpointer val, gpointer data);
static void folder_item_read_cache (FolderItem *item);
gint folder_item_scan_full (FolderItem *item, gboolean filtering);
static void folder_item_update_with_msg (FolderItem *item, FolderItemUpdateFlags update_flags,
MsgInfo *msg);
-static GHashTable *folder_persist_prefs_new (Folder *folder);
-static void folder_persist_prefs_free (GHashTable *pptable);
-static void folder_item_restore_persist_prefs (FolderItem *item, GHashTable *pptable);
void folder_system_init(void)
{
xml_free_tree(rootnode);
}
-static gboolean folder_scan_tree_func(GNode *node, gpointer data)
-{
- GHashTable *pptable = (GHashTable *)data;
- FolderItem *item = (FolderItem *)node->data;
-
- folder_item_restore_persist_prefs(item, pptable);
- folder_item_scan_full(item, FALSE);
-
- return FALSE;
-}
-
-static gboolean folder_restore_prefs_func(GNode *node, gpointer data)
-{
- GHashTable *pptable = (GHashTable *)data;
- FolderItem *item = (FolderItem *)node->data;
-
- folder_item_restore_persist_prefs(item, pptable);
-
- return FALSE;
-}
-
void folder_scan_tree(Folder *folder, gboolean rebuild)
{
- GHashTable *pptable;
FolderUpdateData hookdata;
Folder *old_folder = folder;
if (!folder->klass->scan_tree)
return;
- pptable = folder_persist_prefs_new(folder);
-
if (rebuild)
folder_remove(folder);
hookdata.item2 = NULL;
hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
- if (rebuild)
- g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_scan_tree_func, pptable);
- else
- g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_restore_prefs_func, pptable);
-
- folder_persist_prefs_free(pptable);
-
folder_write_list();
}
return folder_create_processing_folder(account_id);
}
-/* folder_persist_prefs_new() - return hash table with persistent
- * settings (and folder name as key).
- * (note that in claws other options are in the folder_item_prefs_RC
- * file, so those don't need to be included in PersistPref yet)
- */
-static GHashTable *folder_persist_prefs_new(Folder *folder)
-{
- GHashTable *pptable;
-
- cm_return_val_if_fail(folder, NULL);
- pptable = g_hash_table_new(g_str_hash, g_str_equal);
- folder_get_persist_prefs_recursive(folder->node, pptable);
- return pptable;
-}
-
-static void folder_persist_prefs_free(GHashTable *pptable)
-{
- cm_return_if_fail(pptable);
- g_hash_table_foreach_remove(pptable, persist_prefs_free, NULL);
- g_hash_table_destroy(pptable);
-}
-
-static const PersistPrefs *folder_get_persist_prefs(GHashTable *pptable, const char *name)
-{
- if (pptable == NULL || name == NULL) return NULL;
- return g_hash_table_lookup(pptable, name);
-}
-
-static void folder_item_restore_persist_prefs(FolderItem *item, GHashTable *pptable)
-{
- const PersistPrefs *pp;
- gchar *id = folder_item_get_identifier(item);
-
- pp = folder_get_persist_prefs(pptable, id);
- g_free(id);
-
- if (!pp) return;
-
- /* CLAWS: since not all folder properties have been migrated to
- * folderlist.xml, we need to call the old stuff first before
- * setting things that apply both to Main and Claws. */
- folder_item_prefs_read_config(item);
-
- item->collapsed = pp->collapsed;
- item->thread_collapsed = pp->thread_collapsed;
- item->threaded = pp->threaded;
- item->hide_read_msgs = pp->hide_read_msgs;
- item->hide_del_msgs = pp->hide_del_msgs;
- item->hide_read_threads = pp->hide_read_threads;
- item->sort_key = pp->sort_key;
- item->sort_type = pp->sort_type;
-}
-
-static void folder_get_persist_prefs_recursive(GNode *node, GHashTable *pptable)
-{
- FolderItem *item = FOLDER_ITEM(node->data);
- PersistPrefs *pp;
- GNode *child, *cur;
- gchar *id;
-
- cm_return_if_fail(node != NULL);
- cm_return_if_fail(item != NULL);
-
- /* NOTE: item->path == NULL means top level folder; not interesting
- * to store preferences of that one. */
- if (item->path) {
- id = folder_item_get_identifier(item);
- pp = g_new0(PersistPrefs, 1);
- if (!pp) {
- g_free(id);
- return;
- }
- pp->collapsed = item->collapsed;
- pp->thread_collapsed = item->thread_collapsed;
- pp->threaded = item->threaded;
- pp->hide_read_msgs = item->hide_read_msgs;
- pp->hide_del_msgs = item->hide_del_msgs;
- pp->hide_read_threads = item->hide_read_threads;
- pp->sort_key = item->sort_key;
- pp->sort_type = item->sort_type;
- g_hash_table_insert(pptable, id, pp);
- }
-
- if (node->children) {
- child = node->children;
- while (child) {
- cur = child;
- child = cur->next;
- folder_get_persist_prefs_recursive(cur, pptable);
- }
- }
-}
-
-static gboolean persist_prefs_free(gpointer key, gpointer val, gpointer data)
-{
- g_free(key);
- g_free(val);
- return TRUE;
-}
-
/*
* functions for handling FolderItem content changes
*/
blob - 9648e6aa02201275fa3963600b64234fac95cf50
blob + c60676b5767cf49caf27c65a10038fad134095a0
--- src/folder.h
+++ src/folder.h
typedef struct _FolderItem FolderItem;
typedef struct _FolderUpdateData FolderUpdateData;
typedef struct _FolderItemUpdateData FolderItemUpdateData;
-typedef struct _PersistPrefs PersistPrefs;
#define FOLDER(obj) ((Folder *)obj)
#define FOLDER_CLASS(obj) (FOLDER(obj)->klass)
guint last_seen;
};
-struct _PersistPrefs
-{
- FolderSortKey sort_key;
- FolderSortType sort_type;
- guint collapsed : 1;
- guint thread_collapsed : 1;
- guint threaded : 1;
- guint hide_read_msgs : 1; /* CLAWS */
- guint hide_del_msgs : 1; /* CLAWS */
- guint hide_read_threads : 1;
-};
-
struct _FolderUpdateData
{
Folder *folder;