Wayland compositor (wlroots)
git clone https://git.lucas.co/cce-compositor.git
scenefx/types/scene/linked_node.c (1.8K)
1 #include <assert.h>
2 #include <stdbool.h>
3 #include <stdlib.h>
4 #include <wlr/util/log.h>
5
6 #include "scenefx/types/linked_node.h"
7
8 struct link {
9 struct linked_node *node_1;
10 struct linked_node *node_2;
11 };
12
13 static struct link *link_init(struct linked_node *node_1,
14 struct linked_node *node_2) {
15 struct link *link = calloc(1, sizeof(*link));
16 if (!link) {
17 wlr_log(WLR_ERROR, "Failed to allocate link!");
18 return NULL;
19 }
20
21 link->node_1 = node_1;
22 link->node_2 = node_2;
23
24 return link;
25 }
26
27 //
28 // Linked Node
29 //
30
31 bool linked_nodes_are_linked(struct linked_node *node_1,
32 struct linked_node *node_2) {
33 return node_1->link != NULL && node_2->link != NULL
34 && node_1->link == node_2->link;
35 }
36
37 void linked_node_init_link(struct linked_node *node_1,
38 struct linked_node *node_2) {
39 if (node_1->link || node_2->link) {
40 assert(linked_nodes_are_linked(node_1, node_2));
41 return;
42 }
43
44 struct link *link = link_init(node_1, node_2);
45 node_1->link = link;
46 node_2->link = link;
47 }
48
49 struct linked_node *linked_nodes_get_sibling(struct linked_node *node) {
50 if (node->link == NULL) {
51 return NULL;
52 }
53 assert(node == node->link->node_1 || node == node->link->node_2);
54
55 struct link *link = node->link;
56 if (link->node_1 == node) {
57 return link->node_2;
58 }
59 return link->node_1;
60 }
61
62 void linked_node_unlink(struct linked_node *node_1,
63 struct linked_node *node_2) {
64 assert(linked_nodes_are_linked(node_1, node_2));
65
66 struct link *link = node_1->link;
67 node_1->link = NULL;
68 node_2->link = NULL;
69 free(link);
70 }
71
72 void linked_node_destroy(struct linked_node *node) {
73 if (node->link == NULL) {
74 return;
75 }
76 assert(node == node->link->node_1 || node == node->link->node_2);
77 linked_node_unlink(node->link->node_1, node->link->node_2);
78 }