1 /*
2 * 0BSD
3 *
4 * BSD Zero Clause License
5 *
6 * Copyright (c) 2019 Hermann Meyer
7 *
8 * Permission to use, copy, modify, and/or distribute this software for any
9 * purpose with or without fee is hereby granted.
10
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
12 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
16 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 *
19 */
20
21 #include "xchildlist.h"
22 #include "xchildlist_private.h"
23
24
childlist_init(Childlist_t * childlist)25 void childlist_init(Childlist_t *childlist) {
26 childlist->childs = (Widget_t**)malloc(sizeof(Widget_t*) * 4);
27 assert(childlist->childs != NULL);
28 memset(childlist->childs, 0, 4 * sizeof(Widget_t*));
29 childlist->cap =4;
30 childlist->size = sizeof(childlist);
31 childlist->elem = 0;
32 int i = 0;
33 for(;i<childlist->cap;i++) {
34 childlist->childs[i] = NULL;
35 }
36 }
37
childlist_destroy(Childlist_t * childlist)38 void childlist_destroy(Childlist_t *childlist) {
39 if(childlist) free(childlist->childs);
40 }
41
childlist_add_child(Childlist_t * childlist,Widget_t * child)42 void childlist_add_child(Childlist_t *childlist, Widget_t *child) {
43 if(!childlist) childlist_init(childlist);
44 if (childlist->cap < childlist->elem+2) {
45 _childlist_add_elem(childlist);
46 }
47 childlist->childs[childlist->elem] = child;
48 debug_print("Childlist_t add_child\n");
49 if (child->flags & IS_WINDOW) {
50 Atom WM_DELETE_WINDOW;
51 WM_DELETE_WINDOW = XInternAtom(child->app->dpy, "WM_DELETE_WINDOW", True);
52 XSetWMProtocols(child->app->dpy, child->widget, &WM_DELETE_WINDOW, 1);
53 }
54 childlist->elem +=1;
55 }
56
childlist_remove_child(Childlist_t * childlist,Widget_t * child)57 void childlist_remove_child(Childlist_t *childlist, Widget_t *child) {
58 if (!childlist) return;
59 int it = childlist_find_child(childlist, child);
60 if(it >= 0){
61 childlist->childs[it] = NULL;
62 childlist->elem--;
63 int i = it;
64 for(;i<childlist->elem;i++) {
65 childlist->childs[i] = childlist->childs[i+1];
66 }
67 childlist->childs[childlist->elem+1] = NULL;
68 }
69 }
70
childlist_find_child(Childlist_t * childlist,Widget_t * child)71 int childlist_find_child(Childlist_t *childlist, Widget_t *child) {
72 int i = 0;
73 for(;i<childlist->elem;i++) {
74 if(childlist->childs[i] == child) {
75 return i;
76 }
77 }
78 return -1;
79 }
80
childlist_find_widget(Childlist_t * childlist,Window child_window)81 int childlist_find_widget(Childlist_t *childlist, Window child_window) {
82 int i = childlist->elem-1;
83 for(;i>-1;i--) {
84 if(childlist->childs[i]->widget == child_window) {
85 return i;
86 }
87 }
88 return -1;
89 }
90
childlist_has_child(Childlist_t * childlist)91 int childlist_has_child(Childlist_t *childlist) {
92 return childlist->elem;
93 }
94