git.lucas.co / cce-compositor
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 }