+2003-06-22 [christoph] 0.9.0claws55
+
+ * src/folder.[ch]
+ o add notification hook for folder tree changes
+ o invoke hooks after folder tree scanning
+
+ * src/folderview.[ch]
+ register hook for folder tree changes that
+ updates the ctree
+
+ (there are more places that should be updated, like add, remove
+ or move folder)
+
+ (closes Bug 164 Crash on rebuild folder tree)
+ (closes Bug 190 Crash on 'rebuilding folder tree')
+
2003-06-21 [leandro] 0.9.0claws54
* src/compose.[ch]
MICRO_VERSION=0
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=claws54
+EXTRA_VERSION=claws55
VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
dnl set $target
void folder_scan_tree(Folder *folder)
{
GHashTable *pptable;
+ FolderUpdateData hookdata;
if (!folder->klass->scan_tree)
return;
folder_tree_destroy(folder);
folder->klass->scan_tree(folder);
+ hookdata.folder = folder;
+ hookdata.update_flags = FOLDER_TREE_CHANGED;
+ hooks_invoke(FOLDER_UPDATE_HOOKLIST, &hookdata);
+
g_node_traverse(folder->node, G_POST_ORDER, G_TRAVERSE_ALL, -1, folder_scan_tree_func, pptable);
folder_persist_prefs_free(pptable);
typedef struct _MaildirFolder MaildirFolder;
#endif
typedef struct _FolderItem FolderItem;
+
+typedef struct _FolderUpdateData FolderUpdateData;
typedef struct _FolderItemUpdateData FolderItemUpdateData;
#define FOLDER(obj) ((Folder *)obj)
#define FOLDER_ITEM(obj) ((FolderItem *)obj)
+#define FOLDER_UPDATE_HOOKLIST "folder_update"
#define FOLDER_ITEM_UPDATE_HOOKLIST "folder_item_update"
typedef enum
F_MOVE_FAILED = -4,
} FolderItemMoveResult;
+typedef enum
+{
+ FOLDER_TREE_CHANGED = 1 << 0,
+/*
+ maybe enhance with:
+ FOLDER_NEW_FOLDERITEM
+ FOLDER_REMOVE_FOLDERITEM
+*/
+} FolderUpdateFlags;
+
typedef enum
{
F_ITEM_UPDATE_MSGCNT = 1 << 0,
guint ret_rcpt : 1; /* CLAWS */
} PersistPrefs;
+struct _FolderUpdateData
+{
+ Folder *folder;
+ FolderUpdateFlags update_flags;
+/*
+ FolderItem *item
+*/
+};
+
struct _FolderItemUpdateData
{
FolderItem *item;
void folderview_create_folder_node (FolderView *folderview,
FolderItem *item);
+gboolean folderview_update_folder (gpointer source,
+ gpointer userdata);
gboolean folderview_update_item (gpointer source,
gpointer data);
folderview->mbox_popup = mbox_popup;
folderview->mbox_factory = mbox_factory;
+ folderview->folder_update_callback_id =
+ hooks_register_hook(FOLDER_UPDATE_HOOKLIST, folderview_update_folder, (gpointer) folderview);
folderview->folder_item_update_callback_id =
hooks_register_hook(FOLDER_ITEM_UPDATE_HOOKLIST, folderview_update_item, (gpointer) folderview);
}
}
+gboolean folderview_update_folder(gpointer source, gpointer userdata)
+{
+ FolderUpdateData *hookdata;
+ FolderView *folderview;
+ GtkWidget *ctree;
+
+ hookdata = source;
+ folderview = (FolderView *) userdata;
+ g_return_val_if_fail(hookdata != NULL, FALSE);
+ g_return_val_if_fail(folderview != NULL, FALSE);
+
+ ctree = folderview->ctree;
+ g_return_val_if_fail(ctree != NULL, FALSE);
+
+ if (hookdata->update_flags & FOLDER_TREE_CHANGED) {
+ folderview_set(folderview);
+ }
+
+ return FALSE;
+}
MainWindow *mainwin;
SummaryView *summaryview;
+ gint folder_update_callback_id;
gint folder_item_update_callback_id;
/* for drag and drop */