+ kfsb = g_object_new (G_TYPE_KEYFILE_SETTINGS_BACKEND, NULL);
+ kfsb->keyfile = g_key_file_new ();
+ kfsb->permission = g_simple_permission_new (TRUE);
+
+ kfsb->file = g_file_new_for_path (filename);
+ kfsb->dir = g_file_get_parent (kfsb->file);
+ g_file_make_directory_with_parents (kfsb->dir, NULL, NULL);
+
+ kfsb->file_monitor = g_file_monitor (kfsb->file, 0, NULL, NULL);
+ kfsb->dir_monitor = g_file_monitor (kfsb->dir, 0, NULL, NULL);
+
+ kfsb->prefix_len = strlen (root_path);
+ kfsb->prefix = g_strdup (root_path);
+
+ if (root_group)
+ {
+ kfsb->root_group_len = strlen (root_group);
+ kfsb->root_group = g_strdup (root_group);
+ }
+
+ compute_checksum (kfsb->digest, NULL, 0);
+
+ g_signal_connect (kfsb->file_monitor, "changed",
+ G_CALLBACK (file_changed), kfsb);
+ g_signal_connect (kfsb->dir_monitor, "changed",
+ G_CALLBACK (dir_changed), kfsb);
+
+ g_keyfile_settings_backend_keyfile_writable (kfsb);
+ g_keyfile_settings_backend_keyfile_reload (kfsb);
+
+ return G_SETTINGS_BACKEND (kfsb);
+}