summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/sway/node.vala81
-rw-r--r--lib/sway/sway.vala80
-rw-r--r--lib/sway/workspace.vala14
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");
}
}
}