summaryrefslogtreecommitdiff
path: root/lib/sway/sway.vala
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sway/sway.vala')
-rw-r--r--lib/sway/sway.vala87
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;
+ }
}
}
}