summaryrefslogtreecommitdiff
path: root/lib/sway/node.vala
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sway/node.vala')
-rw-r--r--lib/sway/node.vala77
1 files changed, 77 insertions, 0 deletions
diff --git a/lib/sway/node.vala b/lib/sway/node.vala
new file mode 100644
index 0000000..c3777f3
--- /dev/null
+++ b/lib/sway/node.vala
@@ -0,0 +1,77 @@
+namespace AstalSway {
+ public enum NodeType {
+ ROOT,
+ WORKSPACE,
+ CONTAINER,
+ CLIENT,
+ MONITOR
+ }
+
+ public class Node : Object {
+ public int id {get; private set; }
+ public bool focused { get; private set; }
+ public string name;
+ public string layout;
+ public NodeType type;
+ public weak Node parent;
+
+ private HashTable<int, Node> _nodes =
+ new HashTable<int, Node>(i => i, (a,b) => a==b);
+ public List<weak Node> nodes { owned get { return _nodes.get_values(); } }
+
+ protected Json.Object data;
+
+ public static Node? build(Json.Object obj) {
+ if (obj == null) {
+ return null;
+ }
+ switch (obj.get_string_member("type")) {
+ case "workspace":
+ var ws = new Workspace();
+ ws.sync(obj);
+ return ws as Node;
+
+ default:
+ var node = new Node();
+ node.sync(obj);
+ return node;
+ break;
+
+ }
+ return null;
+ }
+
+ internal virtual void sync(Json.Object obj) {
+ if (obj == null) {
+ return;
+ }
+ data = obj;
+ id = (int)obj.get_int_member("id");
+ name = obj.get_string_member("name");
+ focused = obj.get_boolean_member("focused");
+ layout = obj.get_string_member("layout");
+
+ var arr = obj.get_array_member("nodes");
+ sync_nodes(arr);
+ }
+
+ private void sync_nodes(Json.Array arr) {
+ var new_nodes = new HashTable<int, Node>(i => i, (a,b) => a==b);
+
+ foreach (var item in arr.get_elements()) {
+ var obj = item.get_object();
+ int id = (int)obj.get_int_member("id");
+ var node = _nodes.get(id);
+
+ if (node == null) {
+ node = Node.build(obj);
+ }
+
+ new_nodes.insert(id, node);
+ node.sync(obj);
+ }
+
+ _nodes = new_nodes;
+ }
+ }
+}