Fix pdbox makefile to actually take part in dependency generation
[kugel-rb.git] / apps / plugins / pdbox / PDa / extra / gcanvas.c
blob99f5d3de710088086846627a226429ab0d5bc946
1 /* (C) Guenter Geiger <geiger@xdv.org> */
4 #include "../src/m_pd.h"
5 #include "g_canvas.h"
7 /* ------------------------ gcanvas ----------------------------- */
10 #define BACKGROUNDCOLOR "grey"
12 #define DEFAULTSIZE 80
14 static t_class *gcanvas_class;
16 typedef struct _gcanvas
18 t_object x_obj;
19 t_glist * x_glist;
20 t_outlet* out2;
21 t_outlet* out3;
22 int x_width;
23 int x_height;
24 int x;
25 int y;
26 int x_xgrid;
27 int x_ygrid;
28 } t_gcanvas;
31 static void rectangle(void* cv,void* o,char c,int x, int y,int w,int h,char* color) {
32 #ifdef ROCKBOX
33 (void) cv;
34 (void) o;
35 (void) c;
36 (void) x;
37 (void) y;
38 (void) w;
39 (void) h;
40 (void) color;
41 #else /* ROCKBOX */
42 sys_vgui(".x%x.c create rectangle \
43 %d %d %d %d -tags %x%c -fill %s\n",cv,x,y,x+w,y+h,o,c,color);
44 #endif /* ROCKBOX */
47 static void move_object(void* cv,void* o,char c,int x, int y,int w,int h) {
48 #ifdef ROCKBOX
49 (void) cv;
50 (void) o;
51 (void) c;
52 (void) x;
53 (void) y;
54 (void) w;
55 (void) h;
56 #else /* ROCKBOX */
57 sys_vgui(".x%x.c coords %x%c %d %d %d %d\n",
58 cv,o,c,x,y,x+w,y+h);
59 #endif /* ROCKBOX */
62 static void color_object(void* cv,void* o,char c,char* color) {
63 #ifdef ROCKBOX
64 (void) cv;
65 (void) o;
66 (void) c;
67 (void) color;
68 #else /* ROCKBOX */
69 sys_vgui(".x%x.c itemconfigure %x%c -fill %s\n", cv,
70 o, c,color);
71 #endif /* ROCKBOX */
74 static void delete_object(void* cv,void* o,char c) {
75 #ifdef ROCKBOX
76 (void) cv;
77 (void) o;
78 (void) c;
79 #else /* ROCKBOX */
80 sys_vgui(".x%x.c delete %x%c\n",
81 cv, o,c);
82 #endif /* ROCKBOX */
85 static void line(void* cv,void* o,char c,int x,int y,int w,int h,char* color) {
86 #ifdef ROCKBOX
87 (void) cv;
88 (void) o;
89 (void) c;
90 (void) x;
91 (void) y;
92 (void) w;
93 (void) h;
94 (void) color;
95 #else /* ROCKBOX */
96 sys_vgui(".x%x.c create line \
97 %d %d %d %d -tags %x%c -fill %s\n",cv,x,y,x+w,y+h,o,c,color);
98 #endif /* ROCKBOX */
102 /* widget helper functions */
104 void gcanvas_drawme(t_gcanvas *x, t_glist *glist, int firsttime)
106 int i;
107 if (firsttime) {
108 rectangle(glist_getcanvas(glist),x,'a',
109 x->x_obj.te_xpix, x->x_obj.te_ypix,
110 x->x_width, x->x_height,BACKGROUNDCOLOR);
111 for (i=1;i<x->x_xgrid;i++)
112 line(glist_getcanvas(glist),x,'b'+ i,
113 x->x_obj.te_xpix + x->x_width*i/x->x_xgrid,
114 x->x_obj.te_ypix,
115 0, x->x_height,"red");
116 for (i=1;i<x->x_ygrid;i++)
117 line(glist_getcanvas(glist),x,'B'+ i,
118 x->x_obj.te_xpix,
119 x->x_obj.te_ypix + x->x_height*i/x->x_ygrid,
120 x->x_width, 0,"blue");
122 else {
123 move_object(
124 glist_getcanvas(glist),x,'a',
125 x->x_obj.te_xpix, x->x_obj.te_ypix,
126 x->x_width, x->x_height);
127 for (i=1;i<x->x_xgrid;i++)
128 move_object(glist_getcanvas(glist),x,'b'+ i,
129 x->x_obj.te_xpix + x->x_width*i/x->x_xgrid,
130 x->x_obj.te_ypix,
131 0, x->x_height);
132 for (i=1;i<x->x_ygrid;i++)
133 move_object(glist_getcanvas(glist),x,'B'+ i,
134 x->x_obj.te_xpix,
135 x->x_obj.te_ypix + x->x_height*i/x->x_ygrid,
136 x->x_width, 0);
140 /* outlets */
141 int n = 3;
142 int nplus, i;
143 nplus = (n == 1 ? 1 : n-1);
144 for (i = 0; i < n; i++)
146 #ifndef ROCKBOX
147 int onset = x->x_obj.te_xpix + (x->x_width - IOWIDTH) * i / nplus;
148 if (firsttime)
149 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xo%d\n",
150 glist_getcanvas(glist),
151 onset, x->x_obj.te_ypix + x->x_height - 1,
152 onset + IOWIDTH, x->x_obj.te_ypix + x->x_height,
153 x, i);
154 else
155 sys_vgui(".x%x.c coords %xo%d %d %d %d %d\n",
156 glist_getcanvas(glist), x, i,
157 onset, x->x_obj.te_ypix + x->x_height - 1,
158 onset + IOWIDTH, x->x_obj.te_ypix + x->x_height);
159 #endif /* ROCKBOX */
161 /* inlets */
162 n = 0;
163 nplus = (n == 1 ? 1 : n-1);
164 for (i = 0; i < n; i++)
166 #ifndef ROCKBOX
167 int onset = x->x_obj.te_xpix + (x->x_width - IOWIDTH) * i / nplus;
168 if (firsttime)
169 sys_vgui(".x%x.c create rectangle %d %d %d %d -tags %xi%d\n",
170 glist_getcanvas(glist),
171 onset, x->x_obj.te_ypix,
172 onset + IOWIDTH, x->x_obj.te_ypix + 1,
173 x, i);
174 else
175 sys_vgui(".x%x.c coords %xi%d %d %d %d %d\n",
176 glist_getcanvas(glist), x, i,
177 onset, x->x_obj.te_ypix,
178 onset + IOWIDTH, x->x_obj.te_ypix + 1);
179 #endif /* ROCKBOX */
188 void gcanvas_erase(t_gcanvas* x,t_glist* glist)
190 int n,i;
191 delete_object(glist_getcanvas(glist),x,'a');
192 for (i=1;i<x->x_xgrid;i++)
193 delete_object(glist_getcanvas(glist),x,'b'+ i);
194 for (i=1;i<x->x_ygrid;i++)
195 delete_object(glist_getcanvas(glist),x,'B'+ i);
197 n = 2;
198 while (n--) {
199 #ifndef ROCKBOX
200 sys_vgui(".x%x.c delete %xo%d\n",glist_getcanvas(glist),x,n);
201 #endif
207 /* ------------------------ gcanvas widgetbehaviour----------------------------- */
210 static void gcanvas_getrect(t_gobj *z, t_glist *owner,
211 int *xp1, int *yp1, int *xp2, int *yp2)
213 #ifdef ROCKBOX
214 (void) owner;
215 #endif
216 int width, height;
217 t_gcanvas* s = (t_gcanvas*)z;
220 width = s->x_width;
221 height = s->x_height;
222 *xp1 = s->x_obj.te_xpix;
223 *yp1 = s->x_obj.te_ypix;
224 *xp2 = s->x_obj.te_xpix + width;
225 *yp2 = s->x_obj.te_ypix + height;
228 static void gcanvas_displace(t_gobj *z, t_glist *glist,
229 int dx, int dy)
231 t_gcanvas *x = (t_gcanvas *)z;
232 x->x_obj.te_xpix += dx;
233 x->x_obj.te_ypix += dy;
234 gcanvas_drawme(x, glist, 0);
235 canvas_fixlinesfor(glist_getcanvas(glist),(t_text*) x);
238 static void gcanvas_select(t_gobj *z, t_glist *glist, int state)
240 t_gcanvas *x = (t_gcanvas *)z;
241 color_object(glist,x,'a',state ? "blue" : BACKGROUNDCOLOR);
245 static void gcanvas_activate(t_gobj *z, t_glist *glist, int state)
247 #ifdef ROCKBOX
248 (void) z;
249 (void) glist;
250 (void) state;
251 #endif
252 /* t_text *x = (t_text *)z;
253 t_rtext *y = glist_findrtext(glist, x);
254 if (z->g_pd != gatom_class) rtext_activate(y, state);*/
257 static void gcanvas_delete(t_gobj *z, t_glist *glist)
259 t_text *x = (t_text *)z;
260 canvas_deletelinesfor(glist_getcanvas(glist), x);
264 static void gcanvas_vis(t_gobj *z, t_glist *glist, int vis)
266 t_gcanvas* s = (t_gcanvas*)z;
267 if (vis)
268 gcanvas_drawme(s, glist, 1);
269 else
270 gcanvas_erase(s,glist);
273 /* can we use the normal text save function ?? */
275 static void gcanvas_save(t_gobj *z, t_binbuf *b)
277 t_gcanvas *x = (t_gcanvas *)z;
278 binbuf_addv(b, "ssiisiiii", gensym("#X"),gensym("obj"),
279 (t_int)x->x_obj.te_xpix, (t_int)x->x_obj.te_ypix,
280 gensym("gcanvas"),x->x_width,x->x_height,
281 x->x_xgrid,
282 x->x_ygrid);
283 binbuf_addv(b, ";");
287 t_widgetbehavior gcanvas_widgetbehavior;
289 static void gcanvas_motion(t_gcanvas *x, t_floatarg dx, t_floatarg dy)
291 x->x += dx;
292 x->y += dy;
293 outlet_float(x->out2,x->y);
294 outlet_float(x->x_obj.ob_outlet,x->x);
297 void gcanvas_key(t_gcanvas *x, t_floatarg f)
299 #ifdef ROCKBOX
300 (void) x;
301 (void) f;
302 #endif
303 post("key");
307 static void gcanvas_click(t_gcanvas *x,
308 t_floatarg xpos, t_floatarg ypos, t_floatarg shift, t_floatarg ctrl,
309 t_floatarg doit,int up)
311 #ifdef ROCKBOX
312 (void) shift;
313 (void) ctrl;
314 (void) doit;
315 (void) up;
316 #endif
317 glist_grab(x->x_glist, &x->x_obj.te_g, (t_glistmotionfn) gcanvas_motion,
318 (t_glistkeyfn) NULL, xpos, ypos);
320 x->x = xpos - x->x_obj.te_xpix;
321 x->y = ypos - x->x_obj.te_ypix;
322 outlet_float(x->out2,x->y);
323 outlet_float(x->x_obj.ob_outlet,x->x);
324 outlet_float(x->out3,0);
327 static int gcanvas_newclick(t_gobj *z, struct _glist *glist,
328 int xpix, int ypix, int shift, int alt, int dbl, int doit)
330 #ifdef ROCKBOX
331 (void) glist;
332 #endif
333 if (doit)
334 gcanvas_click((t_gcanvas *)z, (t_floatarg)xpix, (t_floatarg)ypix,
335 (t_floatarg)shift, 0, (t_floatarg)alt,dbl);
337 if (dbl) outlet_float(((t_gcanvas*)z)->out3,1);
338 return (1);
341 void gcanvas_size(t_gcanvas* x,t_floatarg w,t_floatarg h) {
342 x->x_width = w;
343 x->x_height = h;
344 gcanvas_drawme(x, x->x_glist, 0);
347 static void gcanvas_setwidget(void)
349 gcanvas_widgetbehavior.w_getrectfn = gcanvas_getrect;
350 gcanvas_widgetbehavior.w_displacefn = gcanvas_displace;
351 gcanvas_widgetbehavior.w_selectfn = gcanvas_select;
352 gcanvas_widgetbehavior.w_activatefn = gcanvas_activate;
353 gcanvas_widgetbehavior.w_deletefn = gcanvas_delete;
354 gcanvas_widgetbehavior.w_visfn = gcanvas_vis;
355 gcanvas_widgetbehavior.w_clickfn = gcanvas_newclick;
356 class_setsavefn(gcanvas_class,gcanvas_save);
360 static void *gcanvas_new(t_symbol* s,t_int ac,t_atom* at)
362 #ifdef ROCKBOX
363 (void) s;
364 #endif
365 t_gcanvas *x = (t_gcanvas *)pd_new(gcanvas_class);
367 x->x_glist = (t_glist*) canvas_getcurrent();
370 /* Fetch the width */
372 x->x_width = DEFAULTSIZE;
373 if (ac-- > 0) {
374 if (at->a_type != A_FLOAT)
375 error("gcanvas: wrong argument type");
376 else
377 x->x_width = atom_getfloat(at++);
379 if (x->x_width < 0 || x->x_width > 2000) {
380 error("gcanvas: unallowed width %f",x->x_width);
381 x->x_width = DEFAULTSIZE;
385 /* Fetch the height */
387 x->x_height = DEFAULTSIZE;
388 if (ac-- > 0) {
389 if (at->a_type != A_FLOAT)
390 error("gcanvas: wrong argument type");
391 else
392 x->x_height = atom_getfloat(at++);
394 if (x->x_height < 0 || x->x_height > 2000) {
395 error("gcanvas: unallowed height %f",x->x_height);
396 x->x_width = DEFAULTSIZE;
400 /* Fetch the xgrid */
402 x->x_xgrid = 0;
403 if (ac-- > 0) {
404 if (at->a_type != A_FLOAT)
405 error("gcanvas: wrong argument type");
406 else
407 x->x_xgrid = atom_getfloat(at++);
409 if (x->x_xgrid < 0 || x->x_xgrid > x->x_width/2) {
410 error("gcanvas: unallowed xgrid %f",x->x_xgrid);
411 x->x_xgrid = 0;
415 /* Fetch the ygrid */
417 x->x_ygrid = 0;
418 if (ac-- > 0) {
419 if (at->a_type != A_FLOAT)
420 error("gcanvas: wrong argument type");
421 else
422 x->x_ygrid = atom_getfloat(at++);
424 if (x->x_ygrid < 0 || x->x_ygrid > x->x_height/2) {
425 error("gcanvas: unallowed xgrid %f",x->x_ygrid);
426 x->x_ygrid = 0;
430 outlet_new(&x->x_obj, &s_float);
431 x->out2 = outlet_new(&x->x_obj, &s_float);
432 x->out3 = outlet_new(&x->x_obj, &s_float);
433 return (x);
438 void gcanvas_setup(void)
440 gcanvas_class = class_new(gensym("gcanvas"), (t_newmethod)gcanvas_new, 0,
441 sizeof(t_gcanvas),0, A_GIMME,0);
443 class_addmethod(gcanvas_class, (t_method)gcanvas_click, gensym("click"),
444 A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
445 class_addmethod(gcanvas_class, (t_method)gcanvas_size, gensym("size"),
446 A_FLOAT, A_FLOAT, 0);
448 gcanvas_setwidget();
449 class_setwidget(gcanvas_class,&gcanvas_widgetbehavior);