5 wt_widget *wt_alloc_widget(wt_widget *par)
8 if(!(w = wt_zalloc(sizeof *w))) {
11 w->type = WT_TYPE_WIDGET;
13 if(!par) par = wt->root;
18 void wt_free_widget(wt_widget *w)
27 void wt_free_tree(wt_widget *tree)
33 for(i=0; i<tree->num_child; i++) {
34 wt_free_tree(tree->child[i]);
39 int wt_type(wt_widget *w)
44 int wt_set_text(wt_widget *w, const char *text)
48 if(!(s = wt_alloc(strlen(text) + 1))) {
57 const char *wt_text(wt_widget *w)
62 static int find_child(wt_widget *w, wt_widget *c)
65 for(i=0; i<w->num_child; i++) {
66 if(w->child[i] == c) {
73 int wt_add_child(wt_widget *w, wt_widget *c)
75 if(!w || !c) return -1;
77 if(find_child(w, c) != -1) {
81 wt_remove_child(c->parent, c);
84 if(w->num_child >= w->max_child) {
86 int newsz = w->max_child ? w->max_child << 1 : 8;
87 if(!(newarr = wt_alloc(newsz * sizeof *w->child))) {
90 memcpy(newarr, w->child, w->num_child * sizeof *w->child);
96 w->child[w->num_child++] = c;
100 int wt_remove_child(wt_widget *w, wt_widget *c)
104 if(!w->num_child || (idx = find_child(w, c)) == -1) {
107 w->child[idx] = w->child[--w->num_child];
109 if(w->max_child > 8 && w->num_child < w->max_child / 3) {
111 int newsz = w->max_child >> 1;
112 if(!(newarr = wt_alloc(newsz * sizeof *w->child))) {
115 memcpy(newarr, w->child, w->num_child * sizeof *w->child);
118 w->max_child = newsz;
123 wt_widget *wt_parent(wt_widget *w)
128 wt_widget *wt_widget_window(wt_widget *w)
131 while(par && par->type != WT_TYPE_WINDOW) {
137 int wt_child_count(wt_widget *w)
142 wt_widget *wt_child(wt_widget *w, int idx)
144 if(idx < 0 || idx >= w->num_child) {
147 return w->child[idx];
150 void wt_move(wt_widget *w, int x, int y)
154 /* TODO: invalidate something */
157 void wt_resize(wt_widget *w, int x, int y)
161 /* TODO: invalidate something */
164 int *wt_position(wt_widget *w, int *xret, int *yret)
166 if(xret) *xret = w->rect.x;
167 if(yret) *yret = w->rect.y;
171 int *wt_size(wt_widget *w, int *xret, int *yret)
173 if(xret) *xret = w->rect.width;
174 if(yret) *yret = w->rect.height;
175 return &w->rect.width;
178 int wt_hittest(wt_widget *w, int x, int y)
180 return x >= w->rect.x && y >= w->rect.y && x < w->rect.x + w->rect.width &&
181 y < w->rect.y + w->rect.height;
184 wt_widget *wt_widget_at(int x, int y)
189 if(!wt_hittest(wt->root, x, y)) {
198 for(i=0; i<w->num_child; i++) {
199 if(wt_hittest(w->child[i], x, y)) {
210 void wt_layout(wt_widget *w, int layout);
211 void wt_padding(wt_widget *w, int pad);
212 void wt_relayout(wt_widget *w);
214 void wt_focus(wt_widget *w);
215 void wt_unfocus(wt_widget *w);
216 int wt_isfocused(wt_widget *w);
218 void wt_hover(wt_widget *w);
219 void wt_unhover(wt_widget *w);
220 int wt_ishover(wt_widget *w);
222 void wt_enable(wt_widget *w);
223 void wt_disable(wt_widget *w);
224 int wt_isenabled(wt_widget *w);
227 void wt_callback(wt_widget *w, int type, wt_callback_func func, void *cls)
230 w->cbcls[type] = cls;