# HG changeset patch # User nadvornik # Date 1212613967 0 # Node ID 16b3a5c8aedc5b0161c9c2b32ad1a914e94e6c25 # Parent d6a7fb4b8e7c23daffb77d7f2b5ac2734652091a new notification system (used only in vflist for now) diff -r d6a7fb4b8e7c -r 16b3a5c8aedc src/filedata.c --- a/src/filedata.c Tue Jun 03 19:44:19 2008 +0000 +++ b/src/filedata.c Wed Jun 04 21:12:47 2008 +0000 @@ -140,6 +140,8 @@ { fd->version++; if (fd->parent) fd->parent->version++; + + file_data_send_notification(fd); /* FIXME there are probably situations when we don't want to call this */ } @@ -1390,8 +1392,69 @@ FIXME do we need the ignore_list? It looks like a workaround for ineffective implementation in view_file_list.c */ + + + +typedef struct _NotifyData NotifyData; + +struct _NotifyData { + FileDataNotifyFunc func; + gpointer data; + }; + +static GList *notify_func_list = NULL; + +gint file_data_register_notify_func(FileDataNotifyFunc func, gpointer data) +{ + NotifyData *nd = g_new(NotifyData, 1); + nd->func = func; + nd->data = data; + notify_func_list = g_list_prepend(notify_func_list, nd); + DEBUG_1("Notify func registered: %p\n", nd); + return TRUE; +} + +gint file_data_unregister_notify_func(FileDataNotifyFunc func, gpointer data) +{ + GList *work = notify_func_list; + + while(work) + { + NotifyData *nd = (NotifyData *)work->data; + if (nd->func == func && nd->data == data) + { + notify_func_list = g_list_delete_link(notify_func_list, work); + g_free(nd); + DEBUG_1("Notify func unregistered: %p\n", nd); + return TRUE; + } + work = work->next; + } + return FALSE; +} + + +void file_data_send_notification(FileData *fd) +{ + GList *work = notify_func_list; + while(work) + { + NotifyData *nd = (NotifyData *)work->data; + DEBUG_1("Notify func calling: %p %s\n", nd, fd->path); + nd->func(fd, nd->data); + work = work->next; + } +} + void file_data_sc_send_notification(FileData *fd) { } + + + + + + + diff -r d6a7fb4b8e7c -r 16b3a5c8aedc src/filedata.h --- a/src/filedata.h Tue Jun 03 19:44:19 2008 +0000 +++ b/src/filedata.h Wed Jun 04 21:12:47 2008 +0000 @@ -77,4 +77,8 @@ void file_data_sc_free_ci(FileData *fd); void file_data_sc_free_ci_list(GList *fd_list); +typedef void (*FileDataNotifyFunc)(FileData *fd, gpointer data); +gint file_data_register_notify_func(FileDataNotifyFunc func, gpointer data); +gint file_data_unregister_notify_func(FileDataNotifyFunc func, gpointer data); +void file_data_send_notification(FileData *fd); #endif diff -r d6a7fb4b8e7c -r 16b3a5c8aedc src/utilops.c --- a/src/utilops.c Tue Jun 03 19:44:19 2008 +0000 +++ b/src/utilops.c Wed Jun 04 21:12:47 2008 +0000 @@ -276,6 +276,10 @@ /* FIXME */ break; } + + + /* this is the new way: */ + file_data_send_notification(fd); } void file_data_sc_notify_ci(FileData *fd) diff -r d6a7fb4b8e7c -r 16b3a5c8aedc src/view_file.c --- a/src/view_file.c Tue Jun 03 19:44:19 2008 +0000 +++ b/src/view_file.c Wed Jun 04 21:12:47 2008 +0000 @@ -754,7 +754,7 @@ switch(vf->type) { - case FILEVIEW_LIST: ret = vflist_maint_renamed(vf, fd); break; +// case FILEVIEW_LIST: ret = vflist_maint_renamed(vf, fd); break; case FILEVIEW_ICON: ret = vficon_maint_renamed(vf, fd); break; } @@ -767,7 +767,7 @@ switch(vf->type) { - case FILEVIEW_LIST: ret = vflist_maint_removed(vf, fd, ignore_list); break; +// case FILEVIEW_LIST: ret = vflist_maint_removed(vf, fd, ignore_list); break; case FILEVIEW_ICON: ret = vficon_maint_removed(vf, fd, ignore_list); break; } @@ -780,7 +780,7 @@ switch(vf->type) { - case FILEVIEW_LIST: ret = vflist_maint_moved(vf, fd, ignore_list); break; +// case FILEVIEW_LIST: ret = vflist_maint_moved(vf, fd, ignore_list); break; case FILEVIEW_ICON: ret = vficon_maint_moved(vf, fd, ignore_list); break; } diff -r d6a7fb4b8e7c -r 16b3a5c8aedc src/view_file_list.c --- a/src/view_file_list.c Tue Jun 03 19:44:19 2008 +0000 +++ b/src/view_file_list.c Wed Jun 04 21:12:47 2008 +0000 @@ -50,6 +50,7 @@ static gint vflist_row_is_selected(ViewFile *vf, FileData *fd); static gint vflist_row_rename_cb(TreeEditData *td, const gchar *old, const gchar *new, gpointer data); static void vflist_populate_view(ViewFile *vf); +static void vflist_notify_cb(FileData *fd, gpointer data); /* @@ -1460,7 +1461,9 @@ break; } + file_data_unregister_notify_func(vflist_notify_cb, vf); /* we don't need the notification */ file_data_increment_version(fd); + file_data_register_notify_func(vflist_notify_cb, vf); gtk_tree_store_set(GTK_TREE_STORE(store), &iter, FILE_COLUMN_MARKS + n, fd->marks[n], -1); @@ -1563,8 +1566,12 @@ DEBUG_1("%s vflist_refresh: read dir", get_exec_time()); if (vf->dir_fd) { + file_data_unregister_notify_func(vflist_notify_cb, vf); /* we don't need the notification of changes detected by filelist_read */ + ret = filelist_read(vf->dir_fd, &vf->list, NULL); + file_data_register_notify_func(vflist_notify_cb, vf); + DEBUG_1("%s vflist_refresh: sort", get_exec_time()); vf->list = filelist_sort(vf->list, vf->sort_method, vf->sort_ascend); } @@ -1681,14 +1688,17 @@ gtk_tree_view_append_column(GTK_TREE_VIEW(vf->listview), column); } -static void vflist_listview_mark_toggled(GtkCellRendererToggle *cell, gchar *path_str, GtkTreeStore *store) +static void vflist_listview_mark_toggled_cb(GtkCellRendererToggle *cell, gchar *path_str, gpointer data) { + ViewFile *vf = data; + GtkTreeStore *store; GtkTreePath *path = gtk_tree_path_new_from_string(path_str); GtkTreeIter iter; FileData *fd; gboolean mark; guint col_idx; + store = GTK_TREE_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(vf->listview))); if (!path || !gtk_tree_model_get_iter(GTK_TREE_MODEL(store), &iter, path)) return; @@ -1699,7 +1709,9 @@ gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, FILE_COLUMN_POINTER, &fd, col_idx, &mark, -1); mark = !mark; fd->marks[col_idx - FILE_COLUMN_MARKS] = mark; + file_data_unregister_notify_func(vflist_notify_cb, vf); /* we don't need the notification */ file_data_increment_version(fd); + file_data_register_notify_func(vflist_notify_cb, vf); gtk_tree_store_set(store, &iter, col_idx, mark, -1); gtk_tree_path_free(path); @@ -1726,7 +1738,7 @@ gtk_tree_view_column_set_visible(column, vf->marks_enabled); - g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vflist_listview_mark_toggled), store); + g_signal_connect(G_OBJECT(renderer), "toggled", G_CALLBACK(vflist_listview_mark_toggled_cb), vf); } /* @@ -1759,6 +1771,8 @@ { ViewFile *vf = data; + file_data_unregister_notify_func(vflist_notify_cb, vf); + vflist_select_idle_cancel(vf); vflist_refresh_idle_cancel(vf); vflist_thumb_stop(vf); @@ -1818,6 +1832,7 @@ vflist_listview_add_column(vf, FILE_COLUMN_SIZE, _("Size"), FALSE, TRUE, FALSE); vflist_listview_add_column(vf, FILE_COLUMN_DATE, _("Date"), FALSE, TRUE, FALSE); + file_data_register_notify_func(vflist_notify_cb, vf); return vf; } @@ -1860,29 +1875,30 @@ *----------------------------------------------------------------------------- */ -void vflist_maint(ViewFile *vf, FileData *fd) +static void vflist_notify_cb(FileData *fd, gpointer data) { + ViewFile *vf = data; gboolean refresh; if (vf->refresh_idle_id != -1) return; refresh = (fd == vf->dir_fd); - if (!refresh && fd->change->dest) + if (!refresh) { gchar *base = remove_level_from_path(fd->path); refresh = (strcmp(base, vf->dir_fd->path) == 0); g_free(base); } - if (!refresh && fd->change->dest) + if (!refresh && fd->change && fd->change->dest) { gchar *dest_base = remove_level_from_path(fd->change->dest); refresh = (strcmp(dest_base, vf->dir_fd->path) == 0); g_free(dest_base); } - if (!refresh && fd->change->source) + if (!refresh && fd->change && fd->change->source) { gchar *source_base = remove_level_from_path(fd->change->source); refresh = (strcmp(source_base, vf->dir_fd->path) == 0); @@ -1895,7 +1911,7 @@ } } -/* the plan is to drop these functions and use vflist_maint directly */ +#if 0 gint vflist_maint_renamed(ViewFile *vf, FileData *fd) { @@ -1914,7 +1930,6 @@ } -#if 0 static gint vflist_maint_find_closest(ViewFile *vf, gint row, gint count, GList *ignore_list) { GList *list = NULL; diff -r d6a7fb4b8e7c -r 16b3a5c8aedc src/view_file_list.h --- a/src/view_file_list.h Tue Jun 03 19:44:19 2008 +0000 +++ b/src/view_file_list.h Wed Jun 04 21:12:47 2008 +0000 @@ -60,9 +60,11 @@ void vflist_select_marked(ViewFile *vf, gint mark); void vflist_mark_selected(ViewFile *vf, gint mark, gint value); +/* gint vflist_maint_renamed(ViewFile *vf, FileData *fd); gint vflist_maint_removed(ViewFile *vf, FileData *fd, GList *ignore_list); gint vflist_maint_moved(ViewFile *vf, FileData *fd, GList *ignore_list); +*/ void vflist_color_set(ViewFile *vf, FileData *fd, gint color_set);