summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/sway/container.vala1
-rw-r--r--lib/sway/ipc.vala1
-rw-r--r--lib/sway/meson.build1
-rw-r--r--lib/sway/node.vala15
-rw-r--r--lib/sway/output.vala46
-rw-r--r--lib/sway/sway.vala70
-rw-r--r--lib/sway/workspace.vala10
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() {