$OpenBSD: patch-editor_dconf-model_vala,v 1.5 2011/06/22 16:08:15 ajacoutot Exp $

From 9d6096ff7790cb39f2cd1638d98b211556c73ff9 Mon Sep 17 00:00:00 2001
From: Robert Ancell <robert.ancell@canonical.com>
Date: Mon, 09 May 2011 12:25:46 +0000
Subject: Handle flags

From a15802bd044b93c02ecd880d0c2bcb5935b03d92 Mon Sep 17 00:00:00 2001
From: Ryan Lortie <desrt@desrt.ca>
Date: Wed, 22 Jun 2011 15:46:40 +0000
Subject: Add change watching to dconf-editor

--- editor/dconf-model.vala.orig	Wed Jun 22 17:50:47 2011
+++ editor/dconf-model.vala	Wed Jun 22 17:50:54 2011
@@ -118,6 +118,12 @@ public class Key : GLib.Object
 
     public signal void value_changed();
 
+	void item_changed (string key) {
+		if ((key.has_suffix ("/") && full_name.has_prefix (key)) || key == full_name) {
+			value_changed ();
+		}
+	}
+
     public Key(SettingsModel model, Directory parent, string name, string full_name)
     {
         this.model = model;
@@ -125,6 +131,8 @@ public class Key : GLib.Object
         this.name = name;
         this.full_name = full_name;
         this.schema = model.schemas.keys.lookup(full_name);
+
+		model.item_changed.connect (item_changed);
     }
 
     public void set_to_default()
@@ -456,7 +464,7 @@ public class EnumModel: GLib.Object, Gtk.TreeModel
             return typeof(int);
     }
     
-    private void set_iter(out Gtk.TreeIter iter, SchemaEnumValue value)
+    private void set_iter(out Gtk.TreeIter iter, SchemaValue value)
     {
         iter.stamp = 0;
         iter.user_data = value;
@@ -464,9 +472,9 @@ public class EnumModel: GLib.Object, Gtk.TreeModel
         iter.user_data3 = value;
     }
 
-    public SchemaEnumValue get_enum_value(Gtk.TreeIter iter)
+    public SchemaValue get_enum_value(Gtk.TreeIter iter)
     {
-        return (SchemaEnumValue)iter.user_data;
+        return (SchemaValue)iter.user_data;
     }
 
     public bool get_iter(out Gtk.TreeIter iter, Gtk.TreePath path)
@@ -556,10 +564,23 @@ public class SettingsModel: GLib.Object, Gtk.TreeModel
     public DConf.Client client;
     private Directory root;
 
+	public signal void item_changed (string key);
+
+	void watch_func (DConf.Client client, string path, string[] items, string tag) {
+		if (items.length == 0) {
+			item_changed (path);
+		} else {
+			foreach (var item in items) {
+				item_changed (path + item);
+			}
+		}
+	}
+
     public SettingsModel()
     {
-        client = new DConf.Client ();
+        client = new DConf.Client (null, watch_func);
         root = new Directory(this, null, "/", "/");
+		client.watch ("/");
 
         schemas = new SchemaList();
         try
