c34dc428f74ab2c25e2a721bff530f2d797e5896
[windtk] / src / windtk.c
1 #include <stdlib.h>
2 #include <string.h>
3 #include "wtimpl.h"
4
5 void *(*wt_alloc)(size_t sz) = malloc;
6 void (*wt_free)(void *p) = free;
7
8 /* one day I may want to allow multiple contexts */
9 static struct wt_context defctx;
10 struct wt_context *wt_curctx_ = &defctx;
11
12 static unsigned int def_colors[] = {
13         0xf0f0f0,       /* font/foreground */
14         0x444444,       /* background */
15         0x555555,       /* highlight */
16         0x333333,       /* shadow */
17         0x403065,       /* inactive frame */
18         0x54349c,       /* inactive frame highlight */
19         0x221e2c,       /* inactive frame shadow */
20         0x8032aa,       /* active frame */
21         0xb14de8,       /* active frame highlight */
22         0x3b2846,       /* active frame shadow */
23         0
24 };
25
26 void *wt_zalloc(size_t sz)
27 {
28         void *p = wt_alloc(sz);
29         if(p) {
30                 memset(p, 0, sz);
31         }
32         return p;
33 }
34
35 void wt_allocator(void *(*allocfunc)(size_t), void (*freefunc)(void *p))
36 {
37         wt_alloc = allocfunc ? allocfunc : malloc;
38         wt_free = freefunc ? freefunc : free;
39 }
40
41
42 int wt_init(int w, int h, struct wt_graphics *gfx)
43 {
44         wt->root = 0;
45         if(!(wt->root = wt_alloc_widget(0))) {
46                 return -1;
47         }
48
49         wt_viewport(0, 0, w, h);
50         wt_graphics(gfx);
51         return 0;
52 }
53
54 void wt_destroy(void)
55 {
56         wt_free_tree(wt->root);
57         wt->root = 0;
58 }
59
60 struct wt_theme *wt_load_theme(const char *path)
61 {
62         return 0;       /* TODO */
63 }
64
65 void wt_unload_theme(struct wt_theme *theme)
66 {
67 }
68
69 static void use_theme(wt_widget *w, struct wt_theme *theme)
70 {
71         int i;
72
73         if(w->use_theme) {
74                 w->use_theme(w, theme);
75         }
76
77         for(i=0; i<w->num_child; i++) {
78                 use_theme(w->child[i], theme);
79         }
80 }
81
82 void wt_use_theme(struct wt_theme *theme)
83 {
84         wt->theme = theme;
85         use_theme(wt->root, theme);
86 }
87
88 void wt_viewport(int x, int y, int w, int h)
89 {
90         wt_rect(&wt->vp, x, y, w, h);
91         wt_move(wt->root, x, y);
92         wt_resize(wt->root, w, h);
93 }
94
95 void wt_graphics(struct wt_graphics *gfx)
96 {
97         int i, r, g, b;
98         wt->gfx = *gfx;
99
100         for(i=0; i<NUM_COLORS; i++) {
101                 r = def_colors[i] >> 16;
102                 g = (def_colors[i] >> 8) & 0xff;
103                 b = def_colors[i] & 0xff;
104                 if((wt->colors[i] = gfx->newcolor(r, g, b)) == -1) {
105                         wt->colors[i] = i ? wt->colors[i - 1] : 0;
106                 }
107         }
108 }
109
110 void wt_inp_key(int key, int press)
111 {
112 }
113
114 void wt_inp_mouse(int bn, int st, int x, int y)
115 {
116 }
117
118 void wt_inp_motion(int x, int y)
119 {
120 }
121
122 void wt_draw_tree(wt_widget *tree)
123 {
124         int i;
125
126         if(tree->draw) {
127                 tree->draw(tree, &wt->gfx);
128         }
129
130         for(i=0; i<tree->num_child; i++) {
131                 wt_draw_tree(tree->child[i]);
132         }
133 }
134
135 void wt_draw(void)
136 {
137         wt_draw_tree(wt->root);
138 }
139
140 void wt_gfx_color(int cidx)
141 {
142         wt->gfx.color(wt->colors[cidx]);
143 }
144
145 void wt_gfx_fillrect(struct wt_rect *r)
146 {
147         wt->gfx.fillrect(r);
148 }
149
150 void wt_gfx_fillrect4i(int x, int y, int w, int h)
151 {
152         struct wt_rect r;
153         wt_rect(&r, x, y, w, h);
154         wt->gfx.fillrect(&r);
155 }
156
157 void wt_gfx_frame(struct wt_rect *r, int style, int basecol)
158 {
159         if((style & FRM_NOFILL) == 0) {
160                 wt_gfx_color(basecol);
161                 wt_gfx_fillrect(r);
162         }
163         wt_gfx_color(FRMSTYLE(style) == FRM_OUT ? basecol + 2 : basecol + 1);
164         wt_gfx_fillrect4i(r->x + 1, r->y + r->height - 1, r->width - 2, 1);
165         wt_gfx_fillrect4i(r->x + r->width - 1, r->y, 1, r->height);
166         wt_gfx_color(FRMSTYLE(style) == FRM_OUT ? basecol + 1 : basecol + 2);
167         wt_gfx_fillrect4i(r->x + 1, r->y, r->width - 2, 1);
168         wt_gfx_fillrect4i(r->x, r->y, 1, r->height);
169 }
170
171 void wt_gfx_line(int x0, int y0, int x1, int y1)
172 {
173         wt->gfx.line(x0, y0, x1, y1);
174 }
175
176 void wt_rect(struct wt_rect *r, int x, int y, int w, int h)
177 {
178         r->x = x;
179         r->y = y;
180         r->width = w;
181         r->height = h;
182 }