aboutsummaryrefslogtreecommitdiff
path: root/sway/tree/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/tree/node.c')
-rw-r--r--sway/tree/node.c151
1 files changed, 151 insertions, 0 deletions
diff --git a/sway/tree/node.c b/sway/tree/node.c
new file mode 100644
index 00000000..74661c1a
--- /dev/null
+++ b/sway/tree/node.c
@@ -0,0 +1,151 @@
+#define _POSIX_C_SOURCE 200809L
+#include "sway/output.h"
+#include "sway/server.h"
+#include "sway/tree/container.h"
+#include "sway/tree/node.h"
+#include "sway/tree/root.h"
+#include "sway/tree/workspace.h"
+#include "log.h"
+
+void node_init(struct sway_node *node, enum sway_node_type type, void *thing) {
+ static size_t next_id = 1;
+ node->id = next_id++;
+ node->type = type;
+ node->sway_root = thing;
+ wl_signal_init(&node->events.destroy);
+}
+
+const char *node_type_to_str(enum sway_node_type type) {
+ switch (type) {
+ case N_ROOT:
+ return "N_ROOT";
+ case N_OUTPUT:
+ return "N_OUTPUT";
+ case N_WORKSPACE:
+ return "N_WORKSPACE";
+ case N_CONTAINER:
+ return "N_CONTAINER";
+ }
+ return "";
+}
+
+void node_set_dirty(struct sway_node *node) {
+ if (node->dirty) {
+ return;
+ }
+ node->dirty = true;
+ list_add(server.dirty_nodes, node);
+}
+
+bool node_is_view(struct sway_node *node) {
+ return node->type == N_CONTAINER && node->sway_container->view;
+}
+
+char *node_get_name(struct sway_node *node) {
+ switch (node->type) {
+ case N_ROOT:
+ return "root";
+ case N_OUTPUT:
+ return node->sway_output->wlr_output->name;
+ case N_WORKSPACE:
+ return node->sway_workspace->name;
+ case N_CONTAINER:
+ return node->sway_container->title;
+ }
+ return NULL;
+}
+
+void node_get_box(struct sway_node *node, struct wlr_box *box) {
+ switch (node->type) {
+ case N_ROOT:
+ root_get_box(root, box);
+ break;
+ case N_OUTPUT:
+ output_get_box(node->sway_output, box);
+ break;
+ case N_WORKSPACE:
+ workspace_get_box(node->sway_workspace, box);
+ break;
+ case N_CONTAINER:
+ container_get_box(node->sway_container, box);
+ break;
+ }
+}
+
+struct sway_output *node_get_output(struct sway_node *node) {
+ switch (node->type) {
+ case N_CONTAINER:
+ return node->sway_container->workspace->output;
+ case N_WORKSPACE:
+ return node->sway_workspace->output;
+ case N_OUTPUT:
+ return node->sway_output;
+ case N_ROOT:
+ return NULL;
+ }
+ return NULL;
+}
+
+enum sway_container_layout node_get_layout(struct sway_node *node) {
+ switch (node->type) {
+ case N_CONTAINER:
+ return node->sway_container->layout;
+ case N_WORKSPACE:
+ return node->sway_workspace->layout;
+ case N_OUTPUT:
+ case N_ROOT:
+ return L_NONE;
+ }
+ return L_NONE;
+}
+
+struct sway_node *node_get_parent(struct sway_node *node) {
+ switch (node->type) {
+ case N_CONTAINER: {
+ struct sway_container *con = node->sway_container;
+ if (con->parent) {
+ return &con->parent->node;
+ }
+ if (con->workspace) {
+ return &con->workspace->node;
+ }
+ }
+ return NULL;
+ case N_WORKSPACE: {
+ struct sway_workspace *ws = node->sway_workspace;
+ if (ws->output) {
+ return &ws->output->node;
+ }
+ }
+ return NULL;
+ case N_OUTPUT:
+ return &root->node;
+ case N_ROOT:
+ return NULL;
+ }
+ return NULL;
+}
+
+list_t *node_get_children(struct sway_node *node) {
+ switch (node->type) {
+ case N_CONTAINER:
+ return node->sway_container->children;
+ case N_WORKSPACE:
+ return node->sway_workspace->tiling;
+ case N_OUTPUT:
+ case N_ROOT:
+ return NULL;
+ }
+ return NULL;
+}
+
+bool node_has_ancestor(struct sway_node *node, struct sway_node *ancestor) {
+ struct sway_node *parent = node_get_parent(node);
+ while (parent) {
+ if (parent == ancestor) {
+ return true;
+ }
+ parent = node_get_parent(parent);
+ }
+ return false;
+}