diff src/filedata.c @ 1222:31dc2f240afb

low-level keyword-to-mark functionality
author nadvornik
date Thu, 25 Dec 2008 12:28:04 +0000
parents 97f30a17dc6b
children ebfd305d902e
line wrap: on
line diff
--- a/src/filedata.c	Thu Dec 25 12:19:37 2008 +0000
+++ b/src/filedata.c	Thu Dec 25 12:28:04 2008 +0000
@@ -1050,14 +1050,25 @@
  * marks and orientation
  */
 
+static FileDataGetMarkFunc file_data_get_mark_func[FILEDATA_MARKS_SIZE];
+static FileDataSetMarkFunc file_data_set_mark_func[FILEDATA_MARKS_SIZE];
+static gpointer file_data_mark_func_data[FILEDATA_MARKS_SIZE];
 
 gboolean file_data_get_mark(FileData *fd, gint n)
 {
+	if (file_data_get_mark_func[n]) 
+		{
+		gboolean value = (file_data_get_mark_func[n])(fd, n, file_data_mark_func_data[n]);
+		if (!value != !(fd->marks & (1 << n))) fd->marks = fd->marks ^ (1 << n);
+		}
+
 	return !!(fd->marks & (1 << n));
 }
 
 guint file_data_get_marks(FileData *fd)
 {
+	gint i;
+	for (i = 0; i < FILEDATA_MARKS_SIZE; i++) file_data_get_mark(fd, i);
 	return fd->marks;
 }
 
@@ -1066,6 +1077,11 @@
 	guint old = fd->marks;
 	if (!value == !(fd->marks & (1 << n))) return;
 
+	if (file_data_set_mark_func[n]) 
+		{
+		(file_data_set_mark_func[n])(fd, n, value, file_data_mark_func_data[n]);
+		}
+
 	fd->marks = fd->marks ^ (1 << n);
 	
 	if (old && !fd->marks) /* keep files with non-zero marks in memory */
@@ -1083,6 +1099,8 @@
 
 gboolean file_data_filter_marks(FileData *fd, guint filter)
 {
+	gint i;
+	for (i = 0; i < FILEDATA_MARKS_SIZE; i++) if (filter & (1 << i)) file_data_get_mark(fd, i);
 	return ((fd->marks & filter) == filter);
 }
 
@@ -1108,6 +1126,37 @@
 	return list;
 }
 
+static void file_data_notify_mark_func(gpointer key, gpointer value, gpointer user_data)
+{
+	FileData *fd = value;
+	file_data_increment_version(fd);
+	file_data_send_notification(fd, NOTIFY_TYPE_INTERNAL);
+}
+
+gboolean file_data_register_mark_func(gint n, FileDataGetMarkFunc get_mark_func, FileDataSetMarkFunc set_mark_func, gpointer data)
+{
+	if (n < 0 || n >= FILEDATA_MARKS_SIZE) return FALSE;
+		
+	file_data_get_mark_func[n] = get_mark_func;
+        file_data_set_mark_func[n] = set_mark_func;
+        file_data_mark_func_data[n] = data;
+        
+        if (get_mark_func)
+    		{
+    		/* this effectively changes all known files */
+    		g_hash_table_foreach(file_data_pool, file_data_notify_mark_func, NULL);
+    		}
+        
+        return TRUE;
+}
+
+void file_data_get_registered_mark_func(gint n, FileDataGetMarkFunc *get_mark_func, FileDataSetMarkFunc *set_mark_func, gpointer *data)
+{
+	if (get_mark_func) *get_mark_func = file_data_get_mark_func[n];
+	if (set_mark_func) *set_mark_func = file_data_set_mark_func[n];
+	if (data) *data = file_data_mark_func_data[n];
+}
+
 gint file_data_get_user_orientation(FileData *fd)
 {
 	return fd->user_orientation;