On Fri, 2008-01-18 at 10:48 +0800, Halton Huo wrote:
> > [2]. tracker-preferences will send out the key changes D-BUS message
> > when user click the widget, that will cause trackerd get the change
> and
> > take effect directly. I'd like to change t-p to send out the changes
> > only after use click "Close" button. What do you think? 
Patch for this is ready. Please review it also.

The basic idea is to have a GSList to store all the changes instead of
sending out D-Bus messages directly. After user click "Close" button, go
through the list, and send out message when it is different with orig
conf.

add_key_change() is to add key changes into priv->key_changes.
send_key_change() is to send key change D-Bus message to trackerd.

Thanks,
Halton.


Index: trunk/src/tracker-preferences/tracker-preferences.c
===================================================================
--- trunk/src/tracker-preferences/tracker-preferences.c	(revision 1097)
+++ trunk/src/tracker-preferences/tracker-preferences.c	(working copy)
@@ -24,6 +24,7 @@
 #include <glib-object.h>
 #include <gtk/gtk.h>
 #include <glade/glade.h>
+#include <stdlib.h>
 
 #include "../trackerd/tracker-dbus.h"
 #include "../libtracker/tracker.h"
@@ -34,9 +35,24 @@
 
 #define TRACKER_PREFERENCES_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), TRACKER_TYPE_PREFERENCES, TrackerPreferencesPrivate))
 
+typedef enum {
+	KEY_BOOL,
+	KEY_INT,
+	KEY_STR,
+	KEY_NONE
+} KeyType;
+
+typedef struct _KeyChange {
+	KeyType type;
+	gchar *key;
+	gchar *key_in_conf;
+	gchar *value;
+} KeyChange;
+
 typedef struct _TrackerPreferencesPrivate {
 	GladeXML *gxml;
 	TrackerConfiguration *prefs;
+	GSList *key_changes;
 	DBusGConnection *connection;
 	DBusGProxy *dbus_proxy;
 	DBusGProxy *tracker_proxy;
@@ -72,6 +88,12 @@
 static void initialize_listview (GtkWidget *treeview);
 static void populate_list (GtkWidget *treeview, GSList *list);
 
+static gchar* int_to_str (gint i);
+static gint key_change_compare (gconstpointer a, gconstpointer b);
+static void add_key_change (TrackerPreferencesPrivate *priv, KeyChange *change);
+static void send_key_change (gpointer data, gpointer user_data);
+static void free_key_change (gpointer data, gpointer user_data);
+
 static GObjectClass *parent_class = NULL;
 static gboolean flag_restart = FALSE;
 static gboolean flag_reindex = FALSE;
@@ -98,6 +120,12 @@
 
 	priv->prefs = tracker_configuration_new ();
 
+	/* 
+	priv->int_key_change_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+	priv->bool_key_change_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+	priv->str_key_change_table = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+*/
+
 	GtkWidget *widget = NULL;
 	
 
@@ -221,6 +249,12 @@
 	TrackerPreferencesPrivate *priv =
 		TRACKER_PREFERENCES_GET_PRIVATE (self);
 
+/*
+	g_hash_table_destroy (priv->int_key_change_table);
+	g_hash_table_destroy (priv->bool_key_change_table);
+	g_hash_table_destroy (priv->str_key_change_table);
+*/
+
 	g_object_unref (priv->prefs);
 	g_object_unref (priv->gxml);
 
@@ -276,12 +310,15 @@
 
 	int value = gtk_range_get_value (range);
 
-	tracker_configuration_set_int (configuration,
-					"/Indexing/Throttle",
-					value);
+	KeyChange *change = g_new (KeyChange, 1);
 
-	set_int_option (priv, "Throttle", value);
+	change->type = KEY_INT;
+	change->key = g_strdup ("Throttle");
+	change->key_in_conf = g_strdup ("/Indexing/Throttle");
+	change->value = int_to_str (value);
 
+	add_key_change (priv, change);
+
 }
 
 void 
@@ -299,22 +336,24 @@
 		g_print ("unknown widget was clicked with value %d\n", value);
 	}
 
+	KeyChange *change = g_new (KeyChange, 1);
+
+	change->type = KEY_INT;
 	if (g_str_equal (name, "spnMaxText")) {
 
-		set_int_option (priv, "MaxText", value*1024);
+		change->key = g_strdup ("MaxText");
+		change->key_in_conf = g_strdup ("/Performance/MaxTextToIndex");
+		change->value = int_to_str (value*1024);
 
-		tracker_configuration_set_int (configuration,
-						"/Performance/MaxTextToIndex",
-						value);
+		add_key_change (priv, change);
 
-
 	} else 	if (g_str_equal (name, "spnMaxWords")) {
 
-		set_int_option (priv, "MaxWords", value);
+		change->key = g_strdup ("MaxWords");
+		change->key_in_conf = g_strdup ("/Performance/MaxWordsToIndex");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_int (configuration,
-					"/Performance/MaxWordsToIndex",
-					value);
+		add_key_change (priv, change);
 
 	}
 
@@ -336,94 +375,91 @@
 		g_print ("unknown widget was clicked with value %d\n", value);
 	}
 
+	KeyChange *change = g_new (KeyChange, 1);
+
+	change->type = KEY_BOOL;
 	if (g_str_equal (name, "chkEnableIndexing")) {
 
-		set_bool_option (priv, "EnableIndexing", value);
+		change->key = g_strdup ("EnableIndexing");
+		change->key_in_conf = g_strdup ("/Indexing/EnableIndexing");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-						 "/Indexing/EnableIndexing",
-						 value);
+		add_key_change (priv, change);
 		flag_restart = TRUE;
 
 	} else 	if (g_str_equal (name, "chkEnableWatching")) {
 
-		set_bool_option (priv, "EnableWatching", value);
+		change->key = g_strdup ("EnableWatching");
+		change->key_in_conf = g_strdup ("/Watches/EnableWatching");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Watches/EnableWatching",
-					value);
-
+		add_key_change (priv, change);
 		flag_restart = TRUE;
 
 	} else 	if (g_str_equal (name, "chkEnableEvolutionIndexing")) {
 
-		set_bool_option (priv, "EnableEvolution", value);
+		change->key = g_strdup ("EnableEvolution");
+		change->key_in_conf = g_strdup ("/Emails/IndexEvolutionEmails");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Emails/IndexEvolutionEmails",
-					value);
+		add_key_change (priv, change);
 
-		flag_restart = TRUE;
-
 	} else 	if (g_str_equal (name, "chkIndexContents")) {
 
-		set_bool_option (priv, "IndexFileContents", value);
+		change->key = g_strdup ("IndexFileContents");
+		change->key_in_conf = g_strdup ("/Indexing/EnableFileContentIndexing");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Indexing/EnableFileContentIndexing",
-					value);
-
+		add_key_change (priv, change);
 		flag_restart = TRUE;
 
 	} else 	if (g_str_equal (name, "chkGenerateThumbs")) {
 
-		set_bool_option (priv, "GenerateThumbs", value);
+		change->key = g_strdup ("GenerateThumbs");
+		change->key_in_conf = g_strdup ("/Indexing/EnableThumbnails");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Indexing/EnableThumbnails",
-					value);
+		add_key_change (priv, change);
 
-
 	} else 	if (g_str_equal (name, "chkSkipMountPoints")) {
 
-		set_bool_option (priv, "SkipMountPoints", !value);
+		change->key = g_strdup ("SkipMountPoints");
+		change->key_in_conf = g_strdup ("/Indexing/SkipMountPoints");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Indexing/SkipMountPoints",
-					!value);
+		add_key_change (priv, change);
 
-
 	} else 	if (g_str_equal (name, "chkFastMerges")) {
 
-		set_bool_option (priv, "FastMerges", value);
+		change->key = g_strdup ("FastMerges");
+		change->key_in_conf = g_strdup ("/Indexing/FastMerges");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Indexing/FastMerges",
-					value);
+		add_key_change (priv, change);
 
 	} else 	if (g_str_equal (name, "optReducedMemory")) {
 
-		set_bool_option (priv, "LowMemoryMode", value);
+		change->key = g_strdup ("LowMemoryMode");
+		change->key_in_conf = g_strdup ("/General/LowMemoryMode");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/General/LowMemoryMode",
-					value);
+		add_key_change (priv, change);
 
 	}  else if (g_str_equal (name, "chkDisableBatteryIndex")) {
 
-		set_bool_option (priv, "BatteryIndex", !value);
+		change->key = g_strdup ("BatteryIndex");
+		change->key_in_conf = g_strdup ("/Indexing/BatteryIndex");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Indexing/BatteryIndex",
-					!value);
+		add_key_change (priv, change);
 
 	}  else if (g_str_equal (name, "chkDisableBatteryInitialIndex")) {
 
-		set_bool_option (priv, "BatteryIndexInitial", !value);
+		change->key = g_strdup ("BatteryIndexInitial");
+		change->key_in_conf = g_strdup ("/Indexing/BatteryIndexInitial");
+		change->value = int_to_str (value);
 
-		tracker_configuration_set_bool (configuration,
-					"/Indexing/BatteryIndexInitial",
-					!value);
+		add_key_change (priv, change);
 	}
 
 }
@@ -818,7 +854,7 @@
 		TRACKER_CONFIGURATION (priv->prefs);
 
 	GSList *list = NULL;
-	gboolean value = FALSE;
+	int value = FALSE;
 	char *str_value;
 
 
@@ -887,6 +923,9 @@
 	list = NULL;
 
 
+	g_slist_foreach (priv->key_changes, send_key_change, self);
+	g_slist_foreach (priv->key_changes, free_key_change, NULL);
+
 	tracker_configuration_write (configuration);
 
 	if (flag_restart && if_trackerd_start (priv)) {
@@ -1166,6 +1205,104 @@
 	}
 }
 
+gchar *
+int_to_str (gint i)
+{
+	return g_strdup_printf ("%d", i);
+}
+
+static gint
+key_change_compare (gconstpointer a, gconstpointer b)
+{
+	KeyChange *changea, *changeb;
+
+	changea = (KeyChange *)a;
+	changeb = (KeyChange *)b;
+	return strcmp (changea->key, changeb->key);
+}
+
+static void
+add_key_change (TrackerPreferencesPrivate *priv, KeyChange *change)
+{
+	GSList *find = g_slist_find_custom (priv->key_changes, change, key_change_compare);
+
+	if (!find) {
+		priv->key_changes = g_slist_prepend (priv->key_changes, change);
+	} else {
+		KeyChange *old_data = (KeyChange *)(find->data);
+		g_free (old_data->value);
+		old_data->value = g_strdup (change->value);
+		free_key_change (change, NULL);
+	}
+}
+
+
+static void
+send_key_change (gpointer data, gpointer user_data)
+{
+	KeyChange *change = (KeyChange *)data;
+	TrackerPreferences *self = TRACKER_PREFERENCES (user_data);
+	TrackerPreferencesPrivate *priv =
+		TRACKER_PREFERENCES_GET_PRIVATE (self);
+	TrackerConfiguration *configuration =
+		TRACKER_CONFIGURATION (priv->prefs);
+
+	gint i_value, i_value_orig;
+	gboolean b_value, b_value_orig;
+	gchar *s_value, *s_value_orig;
+
+	switch (change->type) {
+	case KEY_INT:
+		i_value = atoi (change->value);
+		i_value_orig =
+			tracker_configuration_get_int (configuration,
+						      change->key_in_conf,
+						      NULL);
+		if (i_value != i_value_orig) {
+			set_int_option (priv, change->key, i_value);
+			tracker_configuration_set_int (configuration,
+						change->key_in_conf,
+						i_value);
+		}
+		break;
+	case KEY_BOOL:
+		b_value = atoi (change->value);
+		b_value_orig =
+			tracker_configuration_get_bool (configuration,
+						      change->key_in_conf,
+						      NULL);
+		if (b_value != b_value_orig) {
+			set_bool_option (priv, change->key, b_value);
+			tracker_configuration_set_bool (configuration,
+						change->key_in_conf,
+						b_value);
+		}
+		break;
+	case KEY_STR:
+		/* TODO: send str key change*/
+		break;
+	default:
+		break;
+	}
+}
+
+static void
+free_key_change (gpointer data, gpointer user_data)
+{
+	KeyChange *change = (KeyChange *)data;
+
+	change->type = KEY_NONE;
+	g_free (change->key);
+	change->key = NULL;
+	g_free (change->key_in_conf);
+	change->key_in_conf = NULL;
+	g_free (change->value);
+	change->value = NULL;
+
+	g_free (change);
+	change = NULL;
+}
+
 GType
 tracker_preferences_get_type (void)
 {
_______________________________________________
tracker-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/tracker-list

Reply via email to