diff options
author | noname <[email protected]> | 2025-03-03 00:51:26 +1100 |
---|---|---|
committer | noname <[email protected]> | 2025-03-03 22:06:48 +1100 |
commit | f1df814f2e5795330615c00e5d8069325a3629bf (patch) | |
tree | 67e95e0e3f866efa96b3ae31c786aaed0c8db4d7 | |
parent | 57d00e5eb47576e4c6711547aa1611a2f542c8d9 (diff) |
implement node class
-rw-r--r-- | lib/sway/meson.build | 1 | ||||
-rw-r--r-- | lib/sway/node.vala | 77 | ||||
-rw-r--r-- | lib/sway/sway.vala | 85 | ||||
-rw-r--r-- | lib/sway/workspace.vala | 12 |
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"); + } } } |