diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sway/node.vala | 81 | ||||
-rw-r--r-- | lib/sway/sway.vala | 80 | ||||
-rw-r--r-- | lib/sway/workspace.vala | 14 |
3 files changed, 133 insertions, 42 deletions
diff --git a/lib/sway/node.vala b/lib/sway/node.vala index c3777f3..1243854 100644 --- a/lib/sway/node.vala +++ b/lib/sway/node.vala @@ -3,23 +3,50 @@ namespace AstalSway { ROOT, WORKSPACE, CONTAINER, - CLIENT, - MONITOR + WINDOW, + OUTPUT + } + + public struct Rectangle { + public static Rectangle from_json(Json.Object obj) { + return Rectangle() { + x = (int)obj.get_int_member("x"), + y = (int)obj.get_int_member("y"), + width = (int)obj.get_int_member("width"), + height = (int)obj.get_int_member("height"), + }; + + } + + public int x; + public int y; + public int width; + public int height; } 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 bool urgent { get; private set; } + public string name { get; private set; } + public string layout { get; private set; } + public string orientation { get; private set; } + public float? percent { get; private set; } + public Rectangle rect { get; private set; } + public Rectangle window_rect { get; private set; } + public Rectangle deco_rect { get; private set; } + public NodeType node_type {get; protected set;} + 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(); } } + public List<weak Node> nodes; protected Json.Object data; + + private static HashTable<int, Node> _temp_nodes = + new HashTable<int, Node>(i => i, (a,b) => a==b); + internal static HashTable<int, Node> _all_nodes = + new HashTable<int, Node>(i => i, (a,b) => a==b); public static Node? build(Json.Object obj) { if (obj == null) { @@ -28,18 +55,31 @@ namespace AstalSway { 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 static async void sync_tree() { + var str = yield Sway.get_default().message_async(PayloadType.MESSAGE_GET_TREE, ""); + var obj = Json.from_string(str).get_object(); + if (obj == null) { + return; + } + + Node root = build(obj); + _temp_nodes = new HashTable<int, Node>(i => i, (a,b) => a==b); + root.sync(obj); + _temp_nodes.insert(root.id, root); + _all_nodes = _temp_nodes; + + } internal virtual void sync(Json.Object obj) { if (obj == null) { @@ -48,30 +88,39 @@ namespace AstalSway { data = obj; id = (int)obj.get_int_member("id"); name = obj.get_string_member("name"); - focused = obj.get_boolean_member("focused"); + orientation = obj.get_string_member("orientation"); layout = obj.get_string_member("layout"); + focused = obj.get_boolean_member("focused"); + urgent = obj.get_boolean_member("urgent"); + rect = Rectangle.from_json(obj.get_object_member("rect")); + window_rect = Rectangle.from_json(obj.get_object_member("window_rect")); + deco_rect = Rectangle.from_json(obj.get_object_member("deco_rect")); var arr = obj.get_array_member("nodes"); + var arr2 = obj.get_array_member("floating_nodes"); sync_nodes(arr); + sync_nodes(arr2); + } private void sync_nodes(Json.Array arr) { - var new_nodes = new HashTable<int, Node>(i => i, (a,b) => a==b); + var new_nodes = new List<weak Node> (); 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); + var node = _all_nodes.get(id); if (node == null) { node = Node.build(obj); } - new_nodes.insert(id, node); + new_nodes.append(node); + _temp_nodes.insert(id, node); node.sync(obj); } - - _nodes = new_nodes; + + nodes = (owned) new_nodes; } } } diff --git a/lib/sway/sway.vala b/lib/sway/sway.vala index 670ef3e..2ef10a2 100644 --- a/lib/sway/sway.vala +++ b/lib/sway/sway.vala @@ -17,6 +17,9 @@ namespace AstalSway { var s = new Sway(); var ipc = new Ipc(); +s.notify.connect((_, p) => { + stdout.printf("Property '%s' has changed!\n", p.name); +}); try { ipc.init(); s.ipc = ipc; @@ -27,10 +30,16 @@ namespace AstalSway { critical(err.message); return null; } + } - + public Workspace focused_workspace; + private static 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(); } } + private HashTable<string, Workspace> _workspaces = new HashTable<string, Workspace>(str_hash, str_equal); @@ -56,15 +65,32 @@ namespace AstalSway { return yield ipc.message_async(type, payload); } - 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 void run_command(string command) { + message_async.begin(PayloadType.MESSAGE_RUN_COMMAND, command, + (_, res) => { + var obj = Json.from_string(message_async.end(res)).get_object(); + if (!obj.get_boolean_member("success")) { + critical("Command error: %s", obj.get_string_member("error")); + } + } + ); + } + public async void sync() { + yield Node.sync_tree(); + _nodes = Node._all_nodes; + + var new_workspaces = new HashTable<string, Workspace>(str_hash, str_equal); + foreach (var node in nodes) { + switch (node.node_type) { + case NodeType.WORKSPACE: + var ws = node as Workspace; + new_workspaces.insert(ws.name, ws); + if (ws.focused) { + focused_workspace = ws; + } + break; + } } } @@ -74,6 +100,7 @@ namespace AstalSway { public signal void workspace_added(Workspace ws); public signal void workspace_removed(string name); + public signal void workspace_focus(Workspace new_ws, Workspace old_ws); private async void subscribe() { if (subscribe_socket != null) { @@ -89,12 +116,19 @@ namespace AstalSway { } private async void handle_event(IpcReponse reply) { + yield sync(); + if (focused_workspace != null) { + print(focused_workspace.representation); + print(focused_workspace.name); + print(focused_workspace.id.to_string()); + print("\n"); + } switch (reply.type) { case PayloadType.MESSAGE_SUBSCRIBE: return; case PayloadType.EVENT_WORKSPACE: - yield handle_workspace_event(reply.payload); + handle_workspace_event(reply.payload); break; case PayloadType.EVENT_WINDOW: @@ -108,26 +142,26 @@ namespace AstalSway { event(reply.type, reply.payload); } - private async void handle_workspace_event(string args) { - var data = Json.from_string(args).get_object(); + private void handle_workspace_event(string args) { + notify_property("workspaces"); + + var obj = Json.from_string(args).get_object(); - switch (data.get_string_member("change")) { + switch (obj.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); + var name = obj.get_object_member("current").get_string_member("name"); + workspace_added(get_workspace(name)); break; case "empty": - var obj = data.get_object_member("current"); - var name = obj.get_string_member("name"); - _workspaces.remove(name); + var name = obj.get_object_member("current").get_string_member("name"); workspace_removed(name); - var stuff = yield message_async(PayloadType.MESSAGE_GET_TREE, ""); - Node.build(Json.from_string(stuff).get_object()); break; + + case "focus": + var new_name = obj.get_object_member("current").get_string_member("name"); + var old_name = obj.get_object_member("old").get_string_member("name"); + workspace_focus(get_workspace(new_name), get_workspace(old_name)); default: break; diff --git a/lib/sway/workspace.vala b/lib/sway/workspace.vala index a849a62..17795b3 100644 --- a/lib/sway/workspace.vala +++ b/lib/sway/workspace.vala @@ -1,12 +1,20 @@ namespace AstalSway { public class Workspace : Node { - public int num {get; private set; } + public string representation; - public NodeType type = NodeType.WORKSPACE; + public Workspace() { + node_type = NodeType.WORKSPACE; + } internal override void sync(Json.Object obj) { + var rep = obj.get_member("representation"); + if (rep != null) { + representation = rep.get_string(); + } else { + representation = ""; + print("aa"); + } base.sync(obj); - // num = (int)obj.get_int_member("num"); } } } |