summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sway/container.vala26
-rw-r--r--lib/sway/meson.build2
-rw-r--r--lib/sway/node.vala39
-rw-r--r--lib/sway/sway.vala87
-rw-r--r--lib/sway/window.vala23
-rw-r--r--lib/sway/workspace.vala5
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");
+ }
}
}