diff options
author | noname <[email protected]> | 2025-03-06 17:49:33 +1100 |
---|---|---|
committer | noname <[email protected]> | 2025-03-06 18:49:02 +1100 |
commit | f89b080e57d8284e197de9236101a7df266219a9 (patch) | |
tree | f01f085ebb301fb54acbb797303992e48be4441a | |
parent | 90019b99b671664855c1c53a30da39ca572f4a0e (diff) |
implement outputs
-rw-r--r-- | lib/sway/container.vala | 1 | ||||
-rw-r--r-- | lib/sway/ipc.vala | 1 | ||||
-rw-r--r-- | lib/sway/meson.build | 1 | ||||
-rw-r--r-- | lib/sway/node.vala | 15 | ||||
-rw-r--r-- | lib/sway/output.vala | 46 | ||||
-rw-r--r-- | lib/sway/sway.vala | 70 | ||||
-rw-r--r-- | lib/sway/workspace.vala | 10 |
7 files changed, 131 insertions, 13 deletions
diff --git a/lib/sway/container.vala b/lib/sway/container.vala index 04e676b..7a0fc93 100644 --- a/lib/sway/container.vala +++ b/lib/sway/container.vala @@ -2,6 +2,7 @@ namespace AstalSway { public class Container : Node { public bool sticky; public bool floating; + public bool focused; public string border; public int border_width; public int fullscreen_mode; diff --git a/lib/sway/ipc.vala b/lib/sway/ipc.vala index 719a2d0..772ab40 100644 --- a/lib/sway/ipc.vala +++ b/lib/sway/ipc.vala @@ -18,6 +18,7 @@ namespace AstalSway { MESSAGE_GET_INPUTS = 100, MESSAGE_GET_SEATS = 101, EVENT_WORKSPACE = 0x80000000, + EVENT_OUTPUT = 0x80000001, EVENT_MODE = 0x80000002, EVENT_WINDOW = 0x80000003, EVENT_BARCONFIG_UPDATE = 0x80000004, diff --git a/lib/sway/meson.build b/lib/sway/meson.build index 0726a53..34cd880 100644 --- a/lib/sway/meson.build +++ b/lib/sway/meson.build @@ -43,6 +43,7 @@ deps = [ sources = [config] + files( 'node.vala', + 'output.vala', 'workspace.vala', 'container.vala', 'window.vala', diff --git a/lib/sway/node.vala b/lib/sway/node.vala index da91e02..24dbd49 100644 --- a/lib/sway/node.vala +++ b/lib/sway/node.vala @@ -4,7 +4,8 @@ namespace AstalSway { WORKSPACE, CONTAINER, WINDOW, - OUTPUT + OUTPUT, + SCRATCHPAD } public struct Rectangle { @@ -26,7 +27,6 @@ namespace AstalSway { public class Node : Object { public int id {get; private set; } - public bool focused { get; private set; } public bool urgent { get; private set; } public string name { get; private set; } public string layout { get; private set; } @@ -77,8 +77,18 @@ namespace AstalSway { var con = new Container(); return con as Node; } + case "output": + if (obj.get_string_member("name") == "__i3") { + var node = new Node(); + node.node_type = NodeType.SCRATCHPAD; + return node; + } else { + var output = new Output(); + return output as Node; + } default: var node = new Node(); + node.node_type = NodeType.ROOT; return node; break; @@ -110,7 +120,6 @@ namespace AstalSway { name = obj.get_string_member("name"); 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")); diff --git a/lib/sway/output.vala b/lib/sway/output.vala new file mode 100644 index 0000000..84eb549 --- /dev/null +++ b/lib/sway/output.vala @@ -0,0 +1,46 @@ +namespace AstalSway { + public class Output : Node { + public string make; + public string model; + public string serial; + public bool active; + public bool power; + public bool focused; + public float scale; + public string subpixel_hinting; + public string transform; + public Workspace current_workspace; + public List<weak Workspace> workspaces { owned get { + var arr = new List<weak Workspace> (); + foreach (var node in nodes) { + arr.append(node as Workspace); + } + return arr; + }} + + public Output() { + node_type = NodeType.OUTPUT; + } + + internal override void sync(Json.Object obj) { + base.sync(obj); + } + + internal void sync_output(Json.Object obj) { + make = obj.get_string_member("make"); + model = obj.get_string_member("model"); + serial = obj.get_string_member("serial"); + transform = obj.get_string_member("transform"); + subpixel_hinting = obj.get_string_member("subpixel_hinting"); + active = obj.get_boolean_member("active"); + power = obj.get_boolean_member("power"); + focused = obj.get_boolean_member("focused"); + scale = (float)obj.get_double_member("scale"); + current_workspace = Sway.get_default().get_workspace(obj.get_string_member("current_workspace")); + } + + public override void focus() { + Sway.get_default().run_command(@"focus output $name"); + } + } +} diff --git a/lib/sway/sway.vala b/lib/sway/sway.vala index e7228c3..adcb0d9 100644 --- a/lib/sway/sway.vala +++ b/lib/sway/sway.vala @@ -31,6 +31,7 @@ namespace AstalSway { } public Workspace focused_workspace; + public Output focused_output; public Container? focused_container; private static HashTable<int, Node> _nodes = @@ -40,8 +41,11 @@ namespace AstalSway { private HashTable<string, Workspace> _workspaces = new HashTable<string, Workspace>(str_hash, str_equal); + private HashTable<string, Output> _outputs = + new HashTable<string, Output>(str_hash, str_equal); public List<weak Workspace> workspaces { owned get { return _workspaces.get_values(); } } + public List<weak Output> outputs { owned get { return _outputs.get_values(); } } public List<weak Window> windows { owned get { var arr = new List<weak Window>(); foreach (var node in nodes) { @@ -49,11 +53,11 @@ namespace AstalSway { arr.append(node as Window); } } - return arr; } } public Workspace get_workspace(string name) { return _workspaces.get(name); } + public Output get_output(string name) { return _outputs.get(name); } public Node get_node(int id) { return _nodes.get(id); } ~Sway() { @@ -77,20 +81,26 @@ namespace AstalSway { 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")); + var arr = Json.from_string(message_async.end(res)).get_array(); + foreach (var item in arr.get_elements()) { + var obj = item.get_object(); + if (!obj.get_boolean_member("success")) { + critical("Command error: %s", obj.get_string_member("error")); + } } } ); } - public async void sync() { + public async void sync_tree() { yield Node.sync_tree(); _nodes = Node._all_nodes; var new_workspaces = new HashTable<string, Workspace>(str_hash, str_equal); + var new_outputs = new HashTable<string, Output>(str_hash, str_equal); + + // It's possible that there's no focused container Container? new_focused_container = null; foreach (var node in nodes) { @@ -98,22 +108,58 @@ namespace AstalSway { case NodeType.WORKSPACE: var ws = node as Workspace; new_workspaces.insert(ws.name, ws); - if (ws.focused) { - focused_workspace = ws; - } break; case NodeType.CONTAINER: - var con = node as Container; + case NodeType.WINDOW: + var con = node as Container; if (con.focused) { new_focused_container = con; } break; + case NodeType.OUTPUT: + var output = node as Output; + new_outputs.insert(output.name, output); + break; } } + _outputs = new_outputs; + _workspaces= new_workspaces; focused_container = new_focused_container; + yield sync_workspaces(); + yield sync_outputs(); } + private async void sync_workspaces() { + var res = yield message_async(PayloadType.MESSAGE_GET_WORKSPACES, ""); + var arr = Json.from_string(res).get_array(); + foreach (var item in arr.get_elements()) { + var obj = item.get_object(); + var ws = get_workspace(obj.get_string_member("name")); + if (ws != null) { + ws.sync_workspace(obj); + if (ws.focused) { + focused_workspace = ws; + } + } + } + } + + private async void sync_outputs() { + var res = yield message_async(PayloadType.MESSAGE_GET_OUTPUTS, ""); + var arr = Json.from_string(res).get_array(); + foreach (var item in arr.get_elements()) { + var obj = item.get_object(); + var output = get_output(obj.get_string_member("name")); + if (output != null) { + output.sync_output(obj); + if (output.focused) { + focused_output = output; + } + } + } + } + private async void subscribe() { if (subscribe_socket != null) { return; @@ -141,7 +187,7 @@ namespace AstalSway { public signal void container_float(Container con); private async void handle_event(IpcReponse reply) { - yield sync(); + yield sync_tree(); switch (reply.type) { case PayloadType.MESSAGE_SUBSCRIBE: return; @@ -154,6 +200,10 @@ namespace AstalSway { handle_window_event(reply.payload); break; + case PayloadType.EVENT_OUTPUT: + yield sync_outputs(); + break; + default: break; } diff --git a/lib/sway/workspace.vala b/lib/sway/workspace.vala index f19094c..148ac6e 100644 --- a/lib/sway/workspace.vala +++ b/lib/sway/workspace.vala @@ -1,6 +1,9 @@ namespace AstalSway { public class Workspace : Node { public string representation; + public bool focused; + public bool visible; + public int num; public Workspace() { node_type = NodeType.WORKSPACE; @@ -14,6 +17,13 @@ namespace AstalSway { representation = ""; } base.sync(obj); + + } + + internal void sync_workspace(Json.Object obj) { + focused = obj.get_boolean_member("focused"); + visible = obj.get_boolean_member("visible"); + num = (int)obj.get_int_member("num"); } public override void focus() { |