diff options
Diffstat (limited to 'lib/sway/sway.vala')
-rw-r--r-- | lib/sway/sway.vala | 87 |
1 files changed, 65 insertions, 22 deletions
diff --git a/lib/sway/sway.vala b/lib/sway/sway.vala index 2ef10a2..e7228c3 100644 --- a/lib/sway/sway.vala +++ b/lib/sway/sway.vala @@ -17,9 +17,6 @@ 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; @@ -34,6 +31,7 @@ s.notify.connect((_, p) => { } public Workspace focused_workspace; + public Container? focused_container; private static HashTable<int, Node> _nodes = new HashTable<int, Node>(i => i, (a,b) => a==b); @@ -44,8 +42,19 @@ s.notify.connect((_, p) => { new HashTable<string, Workspace>(str_hash, str_equal); public List<weak Workspace> workspaces { owned get { return _workspaces.get_values(); } } + public List<weak Window> windows { owned get { + var arr = new List<weak Window>(); + foreach (var node in nodes) { + if (node.node_type == NodeType.WINDOW) { + arr.append(node as Window); + } + } + + return arr; + } } public Workspace get_workspace(string name) { return _workspaces.get(name); } + public Node get_node(int id) { return _nodes.get(id); } ~Sway() { if (subscribe_socket != null) { @@ -81,6 +90,9 @@ s.notify.connect((_, p) => { _nodes = Node._all_nodes; var new_workspaces = new HashTable<string, Workspace>(str_hash, str_equal); + + Container? new_focused_container = null; + foreach (var node in nodes) { switch (node.node_type) { case NodeType.WORKSPACE: @@ -90,17 +102,17 @@ s.notify.connect((_, p) => { focused_workspace = ws; } break; + case NodeType.CONTAINER: + var con = node as Container; + if (con.focused) { + new_focused_container = con; + } + break; } } - } - - 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); - public signal void workspace_focus(Workspace new_ws, Workspace old_ws); + focused_container = new_focused_container; + } private async void subscribe() { if (subscribe_socket != null) { @@ -115,14 +127,21 @@ s.notify.connect((_, p) => { } } + public signal void event(PayloadType type, string args); + + 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); + + public signal void window_added(Window win); + public signal void window_close(string title); + public signal void window_move(Window win); + public signal void window_focus(Window win); + + public signal void container_float(Container con); + 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; @@ -132,7 +151,7 @@ s.notify.connect((_, p) => { break; case PayloadType.EVENT_WINDOW: - // yield handle_client_event(reply.payload); + handle_window_event(reply.payload); break; default: @@ -143,33 +162,57 @@ s.notify.connect((_, p) => { } private void handle_workspace_event(string args) { - notify_property("workspaces"); - var obj = Json.from_string(args).get_object(); switch (obj.get_string_member("change")) { case "init": var name = obj.get_object_member("current").get_string_member("name"); workspace_added(get_workspace(name)); + notify_property("workspaces"); break; case "empty": var name = obj.get_object_member("current").get_string_member("name"); workspace_removed(name); + notify_property("workspaces"); 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)); + break; default: break; } } - private async void handle_client_event(string args) { - + private void handle_window_event(string args) { + var obj = Json.from_string(args).get_object(); + var change = obj.get_string_member("change"); + var container = obj.get_object_member("container"); + int id = (int)container.get_int_member("id"); + + switch (change) { + case "new": + window_added(get_node(id) as Window); + notify_property("windows"); + break; + case "close": + window_close(container.get_string_member("name")); + notify_property("windows"); + break; + case "focus": + window_focus(get_node(id) as Window); + break; + case "move": + window_move(get_node(id) as Window); + break; + case "floating": + container_float(get_node(id) as Container); + break; + } } } } |