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