summaryrefslogtreecommitdiff
path: root/libnautilus-extensions/nautilus-preference.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnautilus-extensions/nautilus-preference.c')
-rw-r--r--libnautilus-extensions/nautilus-preference.c307
1 files changed, 307 insertions, 0 deletions
diff --git a/libnautilus-extensions/nautilus-preference.c b/libnautilus-extensions/nautilus-preference.c
index c3115b147..74fee096f 100644
--- a/libnautilus-extensions/nautilus-preference.c
+++ b/libnautilus-extensions/nautilus-preference.c
@@ -32,6 +32,21 @@
#include <libnautilus-extensions/nautilus-string-list.h>
#include "nautilus-widgets-self-check-functions.h"
+#include <nautilus-widgets/nautilus-user-level-manager.h>
+
+/*
+ * PreferenceHashNode:
+ *
+ * A structure to manage preference hash table nodes.
+ * Preferences are hash tables. The hash key is the preference name
+ * (a string). The hash value is a pointer of the following struct:
+ */
+typedef struct {
+ NautilusPreference *preference;
+} PreferenceHashNode;
+
+static GHashTable *global_preference_table = NULL;
+
static const char PREFERENCE_NO_DESCRIPTION[] = "No Description";
/*
* NautilusPreferenceDetail:
@@ -62,6 +77,43 @@ static void nautilus_preference_destroy (GtkObject *objec
/* Type info functions */
static void preference_free_type_info (NautilusPreference *preference);
+static gboolean preference_initialize_if_needed (void);
+
+void nautilus_preference_shutdown (void);
+
+/* PreferenceHashNode functions */
+static PreferenceHashNode * preference_hash_node_alloc (char *name,
+ char *description,
+ NautilusPreferenceType type);
+static void preference_hash_node_free (PreferenceHashNode *node);
+static void preference_hash_node_free_func (gpointer key,
+ gpointer value,
+ gpointer user_data);
+
+/* Private stuff */
+static PreferenceHashNode * preference_hash_node_lookup (const char *name);
+static PreferenceHashNode * preference_hash_node_lookup_with_registration (const char *pref_name,
+ NautilusPreferenceType pref_type);
+static void preference_register (char *name,
+ char *description,
+ NautilusPreferenceType type);
+static gboolean
+preference_initialize_if_needed (void)
+{
+ if (global_preference_table) {
+ return TRUE;
+ }
+
+ g_assert (global_preference_table == NULL);
+
+ global_preference_table = g_hash_table_new (g_str_hash, g_str_equal);
+
+ g_assert (global_preference_table != NULL);
+
+ return TRUE;
+}
+
+
NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusPreference, nautilus_preference, GTK_TYPE_OBJECT)
/**
@@ -481,6 +533,261 @@ nautilus_preference_enum_get_num_entries (const NautilusPreference *preference)
return 0;
}
+
+
+
+
+/**
+ * preference_hash_node_alloc
+ *
+ * Allocate a preference hash node.
+ * @info: Pointer to info structure to use for the node memebers.
+ *
+ * Return value: A newly allocated node.
+ **/
+static PreferenceHashNode *
+preference_hash_node_alloc (char *name,
+ char *description,
+ NautilusPreferenceType type)
+{
+ PreferenceHashNode * node;
+
+ g_assert (name != NULL);
+
+ node = g_new (PreferenceHashNode, 1);
+
+ node->preference = NAUTILUS_PREFERENCE (nautilus_preference_new_from_type (name, type));
+
+ g_assert (node->preference != NULL);
+
+ if (description) {
+ nautilus_preference_set_description (node->preference, description);
+ }
+
+ return node;
+}
+
+/**
+ * preference_hash_node_free_func
+ *
+ * A function that frees a pref hash node. It is meant to be fed to
+ * g_hash_table_foreach ()
+ * @key: The hash key privately maintained by the GHashTable.
+ * @value: The hash value privately maintained by the GHashTable.
+ * @callback_data: The callback_data privately maintained by the GHashTable.
+ **/
+static void
+preference_hash_node_free_func (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ g_assert (value != NULL);
+
+ preference_hash_node_free ((PreferenceHashNode *) value);
+}
+
+/**
+ * preference_hash_node_free
+ *
+ * Free a preference hash node members along with the node itself.
+ * @preference_hash_node: The node to free.
+ **/
+static void
+preference_hash_node_free (PreferenceHashNode *node)
+{
+ g_assert (node != NULL);
+
+ g_assert (node->preference != NULL);
+
+ gtk_object_unref (GTK_OBJECT (node->preference));
+ node->preference = NULL;
+
+ g_free (node);
+}
+
+static void
+preference_register (char *name,
+ char *description,
+ NautilusPreferenceType type)
+{
+ PreferenceHashNode *node;
+
+ g_return_if_fail (name != NULL);
+ g_return_if_fail (description != NULL);
+
+ preference_initialize_if_needed ();
+
+ node = preference_hash_node_lookup (name);
+
+ if (node) {
+ g_warning ("the '%s' preference is already registered", name);
+ return;
+ }
+
+ node = preference_hash_node_alloc (name, description, type);
+
+ g_hash_table_insert (global_preference_table, (gpointer) name, (gpointer) node);
+
+ g_assert (node->preference != NULL);
+}
+
+static PreferenceHashNode *
+preference_hash_node_lookup (const char *name)
+{
+ gpointer hash_value;
+
+ g_assert (name != NULL);
+
+ preference_initialize_if_needed ();
+
+ hash_value = g_hash_table_lookup (global_preference_table, (gconstpointer) name);
+
+ return (PreferenceHashNode *) hash_value;
+}
+
+static PreferenceHashNode *
+preference_hash_node_lookup_with_registration (const char *name,
+ NautilusPreferenceType type)
+{
+ PreferenceHashNode * node;
+
+ g_assert (name != NULL);
+
+ preference_initialize_if_needed ();
+
+ node = preference_hash_node_lookup (name);
+
+ if (!node) {
+ preference_register (g_strdup (name),
+ "Unspecified Description",
+ type);
+
+ node = preference_hash_node_lookup (name);
+ }
+
+ g_assert (node != NULL);
+
+ return node;
+}
+
+void
+nautilus_preference_shutdown (void)
+{
+ if (global_preference_table == NULL) {
+ return;
+ }
+
+ if (global_preference_table != NULL) {
+ g_hash_table_foreach (global_preference_table,
+ preference_hash_node_free_func,
+ NULL);
+
+ g_hash_table_destroy (global_preference_table);
+
+ global_preference_table = NULL;
+ }
+}
+
+
+/*
+ * Public functions
+ */
+
+
+/**
+ * nautilus_preference_find_by_name
+ *
+ * Search for a named preference in the given preference and return it.
+ * @preference: The preference to search
+ *
+ * Return value: A referenced pointer to the preference object that corresponds
+ * to the given preference name. The caller should gtk_object_unref() the return
+ * value of this function.
+ **/
+NautilusPreference *
+nautilus_preference_find_by_name (const char *name)
+{
+ PreferenceHashNode *node;
+
+ g_return_val_if_fail (name != NULL, NULL);
+
+ preference_initialize_if_needed ();
+
+ node = preference_hash_node_lookup (name);
+
+ g_assert (node != NULL);
+
+ gtk_object_ref (GTK_OBJECT (node->preference));
+
+ return node->preference;
+}
+
+void
+nautilus_preference_set_info_by_name (const char *name,
+ const char *description,
+ NautilusPreferenceType type,
+ gconstpointer *default_values,
+ guint num_default_values)
+{
+ PreferenceHashNode *node;
+
+ g_return_if_fail (name != NULL);
+
+ preference_initialize_if_needed ();
+
+ node = preference_hash_node_lookup_with_registration (name, type);
+
+ g_assert (node != NULL);
+ g_assert (node->preference != NULL);
+
+ if (description) {
+ nautilus_preference_set_description (node->preference, description);
+ }
+
+ if (default_values && num_default_values) {
+ guint i;
+
+ for (i = 0; i < num_default_values; i++)
+ {
+ nautilus_user_level_manager_set_default_value_if_needed (name,
+ type,
+ i,
+ default_values[i]);
+ }
+ }
+}
+
+void
+nautilus_preference_enum_add_entry_by_name (const char *name,
+ const char *entry_name,
+ const char *entry_description,
+ int entry_value)
+{
+ PreferenceHashNode *node;
+
+ g_return_if_fail (name != NULL);
+
+ preference_initialize_if_needed ();
+
+ node = preference_hash_node_lookup_with_registration (name, NAUTILUS_PREFERENCE_ENUM);
+
+ g_assert (node != NULL);
+ g_assert (node->preference != NULL);
+
+ g_assert (nautilus_preference_get_preference_type (node->preference) == NAUTILUS_PREFERENCE_ENUM);
+
+ nautilus_preference_enum_add_entry (node->preference,
+ entry_name,
+ entry_description,
+ entry_value);
+}
+
+
+
+
+
+
+
#if !defined (NAUTILUS_OMIT_SELF_CHECK)
void