5 wt_widget *wt_alloc_widget(wt_widget *par)
8 if(!(w = wt_zalloc(sizeof *w))) {
11 w->type = WT_TYPE_WIDGET;
19 void wt_free_widget(wt_widget *w)
28 void wt_free_tree(wt_widget *tree)
34 for(i=0; i<tree->num_child; i++) {
35 wt_free_tree(tree->child[i]);
40 int wt_type(wt_widget *w)
45 int wt_set_text(wt_widget *w, const char *text)
49 if(!(s = wt_alloc(strlen(text) + 1))) {
58 const char *wt_text(wt_widget *w)
63 static int find_child(wt_widget *w, wt_widget *c)
66 for(i=0; i<w->num_child; i++) {
67 if(w->child[i] == c) {
74 int wt_add_child(wt_widget *w, wt_widget *c)
76 if(find_child(w, c) != -1) {
80 wt_remove_child(c->parent, c);
83 if(w->num_child >= w->max_child) {
85 int newsz = w->max_child ? w->max_child << 1 : 8;
86 if(!(newarr = wt_alloc(newsz * sizeof *w->child))) {
89 memcpy(newarr, w->child, w->num_child * sizeof *w->child);
95 w->child[w->num_child++] = c;
99 int wt_remove_child(wt_widget *w, wt_widget *c)
103 if(!w->num_child || (idx = find_child(w, c)) == -1) {
106 w->child[idx] = w->child[--w->num_child];
108 if(w->max_child > 8 && w->num_child < w->max_child / 3) {
110 int newsz = w->max_child >> 1;
111 if(!(newarr = wt_alloc(newsz * sizeof *w->child))) {
114 memcpy(newarr, w->child, w->num_child * sizeof *w->child);
117 w->max_child = newsz;
122 wt_widget *wt_parent(wt_widget *w)
127 wt_widget *wt_widget_window(wt_widget *w)
130 while(par && par->type != WT_TYPE_WINDOW) {
136 int wt_child_count(wt_widget *w)
141 wt_widget *wt_child(wt_widget *w, int idx)
143 if(idx < 0 || idx >= w->num_child) {
146 return w->child[idx];
149 void wt_move(wt_widget *w, int x, int y)
153 /* TODO: invalidate something */
156 void wt_resize(wt_widget *w, int x, int y)
160 /* TODO: invalidate something */
163 int *wt_position(wt_widget *w, int *xret, int *yret)
165 if(xret) *xret = w->rect.x;
166 if(yret) *yret = w->rect.y;
170 int *wt_size(wt_widget *w, int *xret, int *yret)
172 if(xret) *xret = w->rect.width;
173 if(yret) *yret = w->rect.height;
174 return &w->rect.width;
177 int wt_hittest(wt_widget *w, int x, int y)
179 return x >= w->rect.x && y >= w->rect.y && x < w->rect.x + w->rect.width &&
180 y < w->rect.y + w->rect.height;
183 wt_widget *wt_widget_at(int x, int y)
188 if(!wt_hittest(wt->root, x, y)) {
197 for(i=0; i<w->num_child; i++) {
198 if(wt_hittest(w->child[i], x, y)) {
209 void wt_layout(wt_widget *w, int layout);
210 void wt_padding(wt_widget *w, int pad);
211 void wt_relayout(wt_widget *w);
213 void wt_focus(wt_widget *w);
214 void wt_unfocus(wt_widget *w);
215 int wt_isfocused(wt_widget *w);
217 void wt_hover(wt_widget *w);
218 void wt_unhover(wt_widget *w);
219 int wt_ishover(wt_widget *w);
221 void wt_enable(wt_widget *w);
222 void wt_disable(wt_widget *w);
223 int wt_isenabled(wt_widget *w);
226 void wt_callback(wt_widget *w, int type, wt_callback_func func, void *cls)
229 w->cbcls[type] = cls;