diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sway/container.vala | 26 | ||||
-rw-r--r-- | lib/sway/meson.build | 2 | ||||
-rw-r--r-- | lib/sway/node.vala | 39 | ||||
-rw-r--r-- | lib/sway/sway.vala | 87 | ||||
-rw-r--r-- | lib/sway/window.vala | 23 | ||||
-rw-r--r-- | lib/sway/workspace.vala | 5 |
6 files changed, 158 insertions, 24 deletions
diff --git a/lib/sway/container.vala b/lib/sway/container.vala new file mode 100644 index 0000000..04e676b --- /dev/null +++ b/lib/sway/container.vala @@ -0,0 +1,26 @@ +namespace AstalSway { + public class Container : Node { + public bool sticky; + public bool floating; + public string border; + public int border_width; + public int fullscreen_mode; + + public Container() { + node_type = NodeType.CONTAINER; + } + + internal override void sync(Json.Object obj) { + border = obj.get_string_member("border"); + border_width = (int)obj.get_int_member("current_border_width"); + sticky = obj.get_boolean_member("sticky"); + floating = obj.get_string_member("type") == "floating_con"; + fullscreen_mode = (int)obj.get_int_member("fullscreen_mode"); + base.sync(obj); + } + + public override void focus() { + Sway.get_default().run_command(@"[con_id=$id] focus"); + } + } +} diff --git a/lib/sway/meson.build b/lib/sway/meson.build index 64f1162..0726a53 100644 --- a/lib/sway/meson.build +++ b/lib/sway/meson.build @@ -44,6 +44,8 @@ deps = [ sources = [config] + files( 'node.vala', 'workspace.vala', + 'container.vala', + 'window.vala', 'sway.vala', 'ipc.vala', ) diff --git a/lib/sway/node.vala b/lib/sway/node.vala index 1243854..da91e02 100644 --- a/lib/sway/node.vala +++ b/lib/sway/node.vala @@ -40,6 +40,18 @@ namespace AstalSway { public weak Node parent; public List<weak Node> nodes; + 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); + } else { + arr.concat(node.windows); + } + } + + return arr; + }} protected Json.Object data; @@ -56,7 +68,15 @@ namespace AstalSway { case "workspace": var ws = new Workspace(); return ws as Node; - + case "con": + case "floating_con": + if (obj.get_member("pid") != null) { + var win = new Window(); + return win as Node; + } else { + var con = new Container(); + return con as Node; + } default: var node = new Node(); return node; @@ -115,6 +135,7 @@ namespace AstalSway { node = Node.build(obj); } + node.parent = this; new_nodes.append(node); _temp_nodes.insert(id, node); node.sync(obj); @@ -122,5 +143,21 @@ namespace AstalSway { nodes = (owned) new_nodes; } + + public virtual void focus() { + + } + + public bool contain(Node node) { + parent = node.parent; + while (parent != null) { + if (id == parent.id) { + return true; + } + parent = parent.parent; + } + + return false; + } } } 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; + } } } } diff --git a/lib/sway/window.vala b/lib/sway/window.vala new file mode 100644 index 0000000..f0e2f9a --- /dev/null +++ b/lib/sway/window.vala @@ -0,0 +1,23 @@ +namespace AstalSway { + public class Window : Container { + public string app_id; + public string shell; + public int pid; + public bool visible; + public bool inhibit_idle; + + public Window() { + node_type = NodeType.WINDOW; + } + + internal override void sync(Json.Object obj) { + app_id = obj.get_string_member("app_id"); + shell = obj.get_string_member("shell"); + pid = (int)obj.get_int_member("pid"); + visible = obj.get_boolean_member("visible"); + inhibit_idle = obj.get_boolean_member("inhibit_idle"); + base.sync(obj); + } + } +} + diff --git a/lib/sway/workspace.vala b/lib/sway/workspace.vala index 17795b3..f19094c 100644 --- a/lib/sway/workspace.vala +++ b/lib/sway/workspace.vala @@ -12,9 +12,12 @@ namespace AstalSway { representation = rep.get_string(); } else { representation = ""; - print("aa"); } base.sync(obj); } + + public override void focus() { + Sway.get_default().run_command(@"focus workspace $name"); + } } } |