summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornoname <[email protected]>2025-03-03 00:51:26 +1100
committernoname <[email protected]>2025-03-03 22:06:48 +1100
commitf1df814f2e5795330615c00e5d8069325a3629bf (patch)
tree67e95e0e3f866efa96b3ae31c786aaed0c8db4d7
parent57d00e5eb47576e4c6711547aa1611a2f542c8d9 (diff)
implement node class
-rw-r--r--lib/sway/meson.build1
-rw-r--r--lib/sway/node.vala77
-rw-r--r--lib/sway/sway.vala85
-rw-r--r--lib/sway/workspace.vala12
4 files changed, 167 insertions, 8 deletions
diff --git a/lib/sway/meson.build b/lib/sway/meson.build
index f587da8..64f1162 100644
--- a/lib/sway/meson.build
+++ b/lib/sway/meson.build
@@ -42,6 +42,7 @@ deps = [
]
sources = [config] + files(
+ 'node.vala',
'workspace.vala',
'sway.vala',
'ipc.vala',
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;
+ }
+ }
+}
diff --git a/lib/sway/sway.vala b/lib/sway/sway.vala
index 8f20952..670ef3e 100644
--- a/lib/sway/sway.vala
+++ b/lib/sway/sway.vala
@@ -8,9 +8,6 @@ namespace AstalSway {
private static Sway _instance;
private Ipc ipc;
private SocketConnection subscribe_socket;
-
- public Workspace focused_workspace;
-
public static Sway? get_default() {
if (_instance != null) {
@@ -32,6 +29,15 @@ namespace AstalSway {
}
}
+ public Workspace focused_workspace;
+
+ private HashTable<string, Workspace> _workspaces =
+ new HashTable<string, Workspace>(str_hash, str_equal);
+
+ public List<weak Workspace> workspaces { owned get { return _workspaces.get_values(); } }
+
+ public Workspace get_workspace(string name) { return _workspaces.get(name); }
+
~Sway() {
if (subscribe_socket != null) {
try {
@@ -50,7 +56,26 @@ namespace AstalSway {
return yield ipc.message_async(type, payload);
}
- public async void subscribe() {
+ public async void sync() {
+ var str = yield message_async(PayloadType.MESSAGE_GET_WORKSPACES, "");
+ var arr = Json.from_string(str).get_array();
+ foreach (var obj in arr.get_elements()) {
+ var name = obj.get_object().get_string_member("name");
+ var ws = get_workspace(name);
+ if (ws != null)
+ ws.sync(obj.get_object());
+
+ }
+ }
+
+ public signal void event(PayloadType type, string args);
+
+ // Work space signals
+
+ public signal void workspace_added(Workspace ws);
+ public signal void workspace_removed(string name);
+
+ private async void subscribe() {
if (subscribe_socket != null) {
return;
}
@@ -59,8 +84,58 @@ namespace AstalSway {
ipc.send(subscribe_socket.output_stream, PayloadType.MESSAGE_SUBSCRIBE, "[ \"workspace\", \"window\" ]");
while (true) {
var result = yield ipc.receive_async(subscribe_socket.input_stream);
- print(result.payload);
+ handle_event(result);
+ }
+ }
+
+ private async void handle_event(IpcReponse reply) {
+ switch (reply.type) {
+ case PayloadType.MESSAGE_SUBSCRIBE:
+ return;
+
+ case PayloadType.EVENT_WORKSPACE:
+ yield handle_workspace_event(reply.payload);
+ break;
+
+ case PayloadType.EVENT_WINDOW:
+ // yield handle_client_event(reply.payload);
+ break;
+
+ default:
+ break;
+ }
+
+ event(reply.type, reply.payload);
+ }
+
+ private async void handle_workspace_event(string args) {
+ var data = Json.from_string(args).get_object();
+
+ switch (data.get_string_member("change")) {
+ case "init":
+ var obj = data.get_object_member("current");
+ var ws = new Workspace();
+ _workspaces.insert(obj.get_string_member("name"), ws);
+ yield sync();
+ workspace_added(ws);
+ break;
+
+ case "empty":
+ var obj = data.get_object_member("current");
+ var name = obj.get_string_member("name");
+ _workspaces.remove(name);
+ workspace_removed(name);
+ var stuff = yield message_async(PayloadType.MESSAGE_GET_TREE, "");
+ Node.build(Json.from_string(stuff).get_object());
+ break;
+
+ default:
+ break;
}
}
+
+ private async void handle_client_event(string args) {
+
+ }
}
}
diff --git a/lib/sway/workspace.vala b/lib/sway/workspace.vala
index 87f7c39..a849a62 100644
--- a/lib/sway/workspace.vala
+++ b/lib/sway/workspace.vala
@@ -1,6 +1,12 @@
namespace AstalSway {
- public class Workspace : Object {
- public int id { get; private set; }
- public string name { get; private set; }
+ public class Workspace : Node {
+ public int num {get; private set; }
+
+ public NodeType type = NodeType.WORKSPACE;
+
+ internal override void sync(Json.Object obj) {
+ base.sync(obj);
+ // num = (int)obj.get_int_member("num");
+ }
}
}