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 #pragma once 22 23 #ifndef XCHILDLIST_H_ 24 #define XCHILDLIST_H_ 25 26 #include "xputty.h" 27 28 #ifdef __cplusplus 29 extern "C" { 30 #endif 31 32 33 /** 34 * 35 * @brief Childlist_t - struct to hold a Widget_t child list 36 * \n Xputty main holds a list of any Widget_t created in relation to main 37 * \n Any Event is only propagate to Widget_t's found in this list 38 * \n Every Widget_t holds a list of Child Widget_t's they contain 39 * \n When a Widget_t get destroy_widget() call, all of it's childs 40 * receive a destroy_widget() call before the Widget_t itself get destroyed 41 * \n the expose_callback() (EXPOSE) and the configure_callback() (CONFIGURE) 42 * will be propagate to all childs in a Childlist_t 43 * @param **childs - dynamic array to hold pointers to the childs 44 * @param size - current size of array 45 * @param cap - current capacity of the array 46 * @param elem - current elements in the array 47 */ 48 49 struct Childlist_t { 50 /** dynamic array to hold pointers to the childs */ 51 Widget_t **childs; 52 /** current size of array */ 53 size_t size; 54 /** current capacity of the array */ 55 int cap; 56 /** current elements in the array */ 57 int elem; 58 }; 59 60 /** 61 * @brief childlist_init - internal use to allocate the array to min size 62 * \n You usually didn't need to call this 63 * @param *childlist - pointer to the Childlist_t 64 * @return void 65 */ 66 67 void childlist_init(Childlist_t *childlist); 68 69 /** 70 * @brief childlist_destroy - internal use to free the Childlist_t 71 * \n You usually didn't need to call this 72 * @param *childlist - pointer to the Childlist_t 73 * @return void 74 */ 75 76 void childlist_destroy(Childlist_t *childlist); 77 78 /** 79 * @brief childlist_add_child - internal use to add a child to the Childlist_t 80 * \n You usually didn't need to call this 81 * @param *childlist - pointer to the Childlist_t 82 * @param *child - pointer to the child to add 83 * @return void 84 */ 85 86 void childlist_add_child(Childlist_t *childlist, Widget_t *child); 87 88 /** 89 * @brief childlist_remove_child - internal use to remove a child from the childlist 90 * \n You usually didn't need to call this 91 * @param *childlist - pointer to the Childlist_t 92 * @param *child - pointer to the child to remove 93 * @return void 94 */ 95 96 void childlist_remove_child(Childlist_t *childlist, Widget_t *child); 97 98 /** 99 * @brief childlist_find_child - find a child in a the Childlist_t 100 * this could be sued to check if a Widget_t is a child of a other Widget_t 101 * @param *childlist - pointer to the Childlist_t 102 * @param *child - pointer to the child to find 103 * @return int - return position in childlist or -1 104 * when not found 105 */ 106 107 int childlist_find_child(Childlist_t *childlist, Widget_t *child); 108 109 /** 110 * @brief childlist_find_widget - find a child Widget_t in a the childlist 111 * by given the Window id 112 * @param *childlist - pointer to the Childlist_t 113 * @param child_window - the Window to find the Widget_t for 114 * @return int - return position in childlist or -1 115 * when not found 116 */ 117 118 int childlist_find_widget(Childlist_t *childlist, Window child_window); 119 120 /** 121 * @brief childlist_has_child - check if a Widget_t Childlist_t contain a child 122 * @param *childlist - pointer to the Childlist_t 123 * @return int - return element counter value 124 * 0 when Widget_t Childlist_t didn't contain a child 125 */ 126 127 int childlist_has_child(Childlist_t *childlist); 128 129 #ifdef __cplusplus 130 } 131 #endif 132 133 #endif //XCHILDLISTT_H_ 134