g_mycanvas.c 15.3 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* Copyright (c) 1997-1999 Miller Puckette.
 * For information on usage and redistribution, and for a DISCLAIMER OF ALL
 * WARRANTIES, see the file, "LICENSE.txt," in this distribution. */

/* g_7_guis.c written by Thomas Musil (c) IEM KUG Graz Austria 2000-2001 */
/* thanks to Miller Puckette, Guenther Geiger and Krzystof Czaja */

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "m_pd.h"
#include "g_canvas.h"
#include "g_all_guis.h"
#include <math.h>

16
17
18
extern int gfxstub_haveproperties(void *key);
void my_canvas_draw_select(t_my_canvas* x, t_glist* glist);

Miller Puckette's avatar
Miller Puckette committed
19
t_widgetbehavior my_canvas_widgetbehavior;
20
/*static*/ t_class *my_canvas_class;
Miller Puckette's avatar
Miller Puckette committed
21
22
23
24

void my_canvas_draw_new(t_my_canvas *x, t_glist *glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
25
26
27
28
    int x1=text_xpix(&x->x_gui.x_obj, glist);
    int y1=text_ypix(&x->x_gui.x_obj, glist);

    sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x "
29
        "-tags {%lxRECT x%lx text iemgui}\n",
30
        canvas, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h,
31
        x->x_gui.x_bcol, x->x_gui.x_bcol, x, x);
32
    sys_vgui(".x%lx.c create prect %d %d %d %d -stroke #%6.6x "
33
        "-tags {%lxBASE x%lx text iemgui}\n",
34
        canvas, x1, y1, x1+x->x_gui.x_w, y1+x->x_gui.x_h,
35
        x->x_gui.x_bcol, x, x);
Jonathan Wilkes's avatar
Jonathan Wilkes committed
36
37
38
39
40
41
42
43
44
    char tagbuf[MAXPDSTRING];
    sprintf(tagbuf, "x%lx", (long unsigned int)x);
    char colorbuf[MAXPDSTRING];
    sprintf(colorbuf, "#%6.6x", x->x_gui.x_bcol);
    gui_vmess("gui_text_create_gobj", "ssii", canvas_string(canvas),
        tagbuf, x1, y1);
    gui_vmess("gui_create_mycanvas", "sssiiiiii", canvas_string(canvas),
        tagbuf, colorbuf, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h,
        x1+x->x_gui.x_w, y1+x->x_gui.x_h);
Miller Puckette's avatar
Miller Puckette committed
45
46
47
48
}

void my_canvas_draw_move(t_my_canvas *x, t_glist *glist)
{
49
50
    t_canvas *canvas=glist_getcanvas(glist);
    if (!glist_isvisible(canvas)) return;
51
52
    int x1=text_xpix(&x->x_gui.x_obj, glist);
    int y1=text_ypix(&x->x_gui.x_obj, glist);
Miller Puckette's avatar
Miller Puckette committed
53

54
    sys_vgui(".x%lx.c coords %lxRECT %d %d %d %d\n",
55
        canvas, x, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h);
56
    sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n",
57
        canvas, x, x1, y1, x1+x->x_gui.x_w, y1+x->x_gui.x_h);
58
59
60
61
62
    char tagbuf[MAXPDSTRING];
    sprintf(tagbuf, "x%lx", (long unsigned int)x);
    gui_vmess("gui_mycanvas_coords", "ssiiii",
        canvas_string(canvas), tagbuf,
        x->x_vis_w, x->x_vis_h, x->x_gui.x_w, x->x_gui.x_h);
Miller Puckette's avatar
Miller Puckette committed
63
64
65
66
67
}

void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
68
69
70
    int isselected;
    //sys_vgui(".x%lx.c itemconfigure %lxRECT -fill #%6.6x -stroke #%6.6x\n",
    //         canvas, x, x->x_gui.x_bcol, x->x_gui.x_bcol);
71
    char bcol[8]; sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
72
73
74
75
76
77
78
79
    //sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x,
    //    x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
    //    "$pd_colors(selection)" : bcol);
    isselected = x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas;
    char tagbuf[MAXPDSTRING];
    sprintf(tagbuf, "x%lx", (long unsigned int)x);
    gui_vmess("gui_update_mycanvas", "sssi",
        canvas_string(canvas), tagbuf, bcol, isselected);
Miller Puckette's avatar
Miller Puckette committed
80
81
82
83
84
}

void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
85
86
87
    if (x->x_gui.x_glist != glist_getcanvas(glist)) return;
    char bcol[8]; sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
    sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke %s\n", canvas, x,
88
        x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
89
        "$pd_colors(selection)" : bcol);
Jonathan Wilkes's avatar
Jonathan Wilkes committed
90
91
92
93
94
    char tagbuf[MAXPDSTRING];
    sprintf(tagbuf, "x%lx", (long unsigned int)x);
    gui_vmess("gui_mycanvas_select_color", "sss", canvas_string(canvas),
        tagbuf, x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
            "blue" : bcol); 
95
96
}

97
static void my_canvas__clickhook(t_scalehandle *sh, int newstate)
98
{
Ivica Bukvic's avatar
Ivica Bukvic committed
99
    t_my_canvas *x = (t_my_canvas *)(sh->h_master);
100
    if (sh->h_dragon && newstate == 0 && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
101
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
102
103
104
        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
        if (sh->h_dragx || sh->h_dragy)
        {
105
106
            x->x_vis_w += sh->h_dragx;
            x->x_vis_h += sh->h_dragy;
Ivica Bukvic's avatar
Ivica Bukvic committed
107
108
            canvas_dirty(x->x_gui.x_glist, 1);
        }
109
110
111
112
113
114
115
116
117
118
119
120
        // if select area is larger tahn the visible arae
        // make select area match that of the dragged one
        // so that we don't have to go into properties to 
        // manually adjust this
        if (x->x_vis_w < x->x_gui.x_w)
            x->x_gui.x_w = x->x_vis_w;
        if (x->x_vis_h < x->x_gui.x_h)
            x->x_gui.x_h = x->x_vis_h;
        if (x->x_gui.x_w < x->x_gui.x_h)
            x->x_gui.x_h = x->x_gui.x_w;
        else
            x->x_gui.x_w = x->x_gui.x_h;
Ivica Bukvic's avatar
Ivica Bukvic committed
121
122
123
        if (glist_isvisible(x->x_gui.x_glist))
        {
            my_canvas_draw_move(x, x->x_gui.x_glist);
124
            scalehandle_unclick_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
125
        }
Miller Puckette's avatar
Miller Puckette committed
126
    }
127
    iemgui__clickhook3(sh,newstate);
128
129
}

130
static void my_canvas__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
131
{
132
    if (sh->h_dragon && sh->h_scale)
133
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
134
135
        t_my_canvas *x = (t_my_canvas *)(sh->h_master);
        int dx = (int)f1, dy = (int)f2;
136
137
        dx = maxi(dx,1-x->x_vis_w);
        dy = maxi(dy,1-x->x_vis_h);        
Ivica Bukvic's avatar
Ivica Bukvic committed
138
139
        sh->h_dragx = dx;
        sh->h_dragy = dy;
140
        scalehandle_drag_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
141
142
143
144

        int properties = gfxstub_haveproperties((void *)x);
        if (properties)
        {
145
146
            int new_w = x->x_vis_w + sh->h_dragx;
            int new_h = x->x_vis_h + sh->h_dragy;
147
148
149
            properties_set_field_int(properties,"rng.min_ent",new_w);
            properties_set_field_int(properties,"rng.max_ent",new_h);

Ivica Bukvic's avatar
Ivica Bukvic committed
150
151
152
            int min = (new_w < new_h ? new_w : new_h);
            if (min <= x->x_gui.x_w)
            {
153
                properties_set_field_int(properties,"dim.w_ent",min);
Ivica Bukvic's avatar
Ivica Bukvic committed
154
155
156
            }
        }
    }
157
    scalehandle_dragon_label(sh,f1,f2);
Miller Puckette's avatar
Miller Puckette committed
158
159
160
161
}

void my_canvas_draw(t_my_canvas *x, t_glist *glist, int mode)
{
162
163
164
165
    if(mode == IEM_GUI_DRAW_MODE_MOVE)        my_canvas_draw_move(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_NEW)    my_canvas_draw_new(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_SELECT) my_canvas_draw_select(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_CONFIG) my_canvas_draw_config(x, glist);
Miller Puckette's avatar
Miller Puckette committed
166
167
168
169
}

/* ------------------------ cnv widgetbehaviour----------------------------- */

Ivica Bukvic's avatar
Ivica Bukvic committed
170
171
static void my_canvas_getrect(t_gobj *z, t_glist *glist,
    int *xp1, int *yp1, int *xp2, int *yp2)
Miller Puckette's avatar
Miller Puckette committed
172
173
174
175
176
{
    t_my_canvas *x = (t_my_canvas *)z;
    
    *xp1 = text_xpix(&x->x_gui.x_obj, glist);
    *yp1 = text_ypix(&x->x_gui.x_obj, glist);
177
    if (!glist_istoplevel(glist) || !glist->gl_edit)
Ivica Bukvic's avatar
Ivica Bukvic committed
178
179
    {
        //if we are trying to calculate visibility of a widget inside a GOP
180
        //or are calculating getrect during runtime
Ivica Bukvic's avatar
Ivica Bukvic committed
181
182
183
184
185
186
187
188
189
        *xp2 = *xp1 + x->x_vis_w;
        *yp2 = *yp1 + x->x_vis_h;
    }
    else
    {
        *xp2 = *xp1 + x->x_gui.x_w;
        *yp2 = *yp1 + x->x_gui.x_h;
    }
    iemgui_label_getrect(x->x_gui, glist, xp1, yp1, xp2, yp2);
Miller Puckette's avatar
Miller Puckette committed
190
191
192
193
194
195
196
197
}

static void my_canvas_save(t_gobj *z, t_binbuf *b)
{
    t_my_canvas *x = (t_my_canvas *)z;
    int bflcol[3];
    t_symbol *srl[3];
    iemgui_save(&x->x_gui, srl, bflcol);
198
199
200
201
202
203
    binbuf_addv(b, "ssiisiiisssiiiiiii;", gensym("#X"),gensym("obj"),
        (int)x->x_gui.x_obj.te_xpix, (int)x->x_gui.x_obj.te_ypix,
        gensym("cnv"), x->x_gui.x_w, x->x_vis_w, x->x_vis_h,
        srl[0], srl[1], srl[2], x->x_gui.x_ldx, x->x_gui.x_ldy,
        iem_fstyletoint(&x->x_gui), x->x_gui.x_fontsize,
        bflcol[0], bflcol[2], iem_symargstoint(&x->x_gui));
Miller Puckette's avatar
Miller Puckette committed
204
205
206
207
208
}

static void my_canvas_properties(t_gobj *z, t_glist *owner)
{
    t_my_canvas *x = (t_my_canvas *)z;
209
    char buf[800], *gfx_tag;
Miller Puckette's avatar
Miller Puckette committed
210
211
212
    t_symbol *srl[3];

    iemgui_properties(&x->x_gui, srl);
Miller Puckette's avatar
Miller Puckette committed
213
    sprintf(buf, "pdtk_iemgui_dialog %%s |cnv| \
Miller Puckette's avatar
Miller Puckette committed
214
215
216
            ------selectable_dimensions(pix):------ %d %d size: 0.0 0.0 empty \
            ------visible_rectangle(pix)(pix):------ %d width: %d height: %d \
            %d empty empty %d %d empty %d \
Ivica Ico Bukvic's avatar
Ivica Ico Bukvic committed
217
218
            {%s} {%s} \
            {%s} %d %d \
Miller Puckette's avatar
Miller Puckette committed
219
220
221
222
223
224
225
            %d %d \
            %d %d %d\n",
            x->x_gui.x_w, 1,
            x->x_vis_w, x->x_vis_h, 0,/*no_schedule*/
            -1, -1, -1, -1,/*no linlog, no init, no multi*/
            srl[0]->s_name, srl[1]->s_name,
            srl[2]->s_name, x->x_gui.x_ldx, x->x_gui.x_ldy,
226
            x->x_gui.x_font_style, x->x_gui.x_fontsize,
Miller Puckette's avatar
Miller Puckette committed
227
            0xffffff & x->x_gui.x_bcol, -1/*no frontcolor*/, 0xffffff & x->x_gui.x_lcol);
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
    //gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);

    gfx_tag = gfxstub_new2(&x->x_gui.x_obj.ob_pd, x);
    /* todo: send along the x/y of the object here so we can
       create the window in the right place */

    gui_start_vmess("gui_iemgui_dialog", "s", gfx_tag);
    gui_start_array();

    gui_s("type");           gui_s("cnv");
    gui_s("selection-size"); gui_i(x->x_gui.x_w);
    gui_s("visible-width");  gui_i(x->x_vis_w);
    gui_s("visible-height"); gui_i(x->x_vis_h);
    gui_s("minimum-size");   gui_i(IEM_GUI_MINSIZE);

    gui_s("range-schedule"); // no idea what this is...
    gui_i(0);

    gui_s("send-symbol"); gui_s(srl[0]->s_name);
    gui_s("receive-symbol"); gui_s(srl[1]->s_name);
    gui_s("label"); gui_s(srl[2]->s_name);
    gui_s("x-offset"); gui_i(x->x_gui.x_ldx);
    gui_s("y-offset");  gui_i(x->x_gui.x_ldy);
    gui_s("font-style"); gui_i(x->x_gui.x_font_style);
    gui_s("font-size"); gui_i(x->x_gui.x_fontsize);
    gui_s("background-color"); gui_i(0xffffff & x->x_gui.x_bcol);
    gui_s("foreground-color"); gui_i(0xffffff & x->x_gui.x_fcol);
    gui_s("label-color"); gui_i(0xffffff & x->x_gui.x_lcol);
    
    gui_end_array();
    gui_end_vmess();
Miller Puckette's avatar
Miller Puckette committed
259
260
261
262
}

static void my_canvas_get_pos(t_my_canvas *x)
{
263
    if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
Miller Puckette's avatar
Miller Puckette committed
264
265
266
267
268
269
270
271
272
    {
        x->x_at[0].a_w.w_float = text_xpix(&x->x_gui.x_obj, x->x_gui.x_glist);
        x->x_at[1].a_w.w_float = text_ypix(&x->x_gui.x_obj, x->x_gui.x_glist);
        pd_list(x->x_gui.x_snd->s_thing, &s_list, 2, x->x_at);
    }
}

static void my_canvas_dialog(t_my_canvas *x, t_symbol *s, int argc, t_atom *argv)
{
273
    //printf("cnv_dialog: selected=%d\n",x->x_gui.x_selected);
Ivica Bukvic's avatar
Ivica Bukvic committed
274
    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
275
    //printf("cnv_dialog: selected=%d\n",x->x_gui.x_selected);
276
277
278
279
    x->x_gui.x_h =
    x->x_gui.x_w = maxi(atom_getintarg(0, argc, argv),1);
    x->x_vis_w = maxi(atom_getintarg(2, argc, argv),1);
    x->x_vis_h = maxi(atom_getintarg(3, argc, argv),1);
280
    post("FUCK OFF ASSHOLE!");
281
    iemgui_dialog(&x->x_gui, argc, argv);
282
    x->x_gui.x_loadinit = 0;
283
    iemgui_draw_config(&x->x_gui);
284
    iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
285
    scalehandle_draw(&x->x_gui);
286
    scrollbar_update(x->x_gui.x_glist);
Miller Puckette's avatar
Miller Puckette committed
287
288
289
290
291
292
293
294
295
296
}

static void my_canvas_size(t_my_canvas *x, t_symbol *s, int ac, t_atom *av)
{
    int i = (int)atom_getintarg(0, ac, av);

    if(i < 1)
        i = 1;
    x->x_gui.x_w = i;
    x->x_gui.x_h = i;
297
    iemgui_size(&x->x_gui);
Miller Puckette's avatar
Miller Puckette committed
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
}

static void my_canvas_vis_size(t_my_canvas *x, t_symbol *s, int ac, t_atom *av)
{
    int i;

    i = (int)atom_getintarg(0, ac, av);
    if(i < 1)
        i = 1;
    x->x_vis_w = i;
    if(ac > 1)
    {
        i = (int)atom_getintarg(1, ac, av);
        if(i < 1)
            i = 1;
    }
    x->x_vis_h = i;
315
    if(glist_isvisible(x->x_gui.x_glist)) iemgui_draw_move(&x->x_gui);
Miller Puckette's avatar
Miller Puckette committed
316
317
318
319
320
321
322
}

static void *my_canvas_new(t_symbol *s, int argc, t_atom *argv)
{
    t_my_canvas *x = (t_my_canvas *)pd_new(my_canvas_class);
    int bflcol[]={-233017, -1, -66577};
    int a=IEM_GUI_DEFAULTSIZE, w=100, h=60;
Mathieu L Bouchard's avatar
Mathieu L Bouchard committed
323
    int ldx=20, ldy=12, i=0;
Miller Puckette's avatar
Miller Puckette committed
324
325
    int fs=14;

326
327
    iem_inttosymargs(&x->x_gui, 0);
    iem_inttofstyle(&x->x_gui, 0);
Miller Puckette's avatar
Miller Puckette committed
328
329
330
331

    if(((argc >= 10)&&(argc <= 13))
       &&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,2))
    {
332
333
334
        a = maxi(atom_getintarg(0, argc, argv),1);
        w = maxi(atom_getintarg(1, argc, argv),1);
        h = maxi(atom_getintarg(2, argc, argv),1);
Miller Puckette's avatar
Miller Puckette committed
335
    }
Ivica Bukvic's avatar
Ivica Bukvic committed
336
337
    if((argc >= 12) && (IS_A_SYMBOL(argv,3) || IS_A_FLOAT(argv,3)) &&
        (IS_A_SYMBOL(argv,4) || IS_A_FLOAT(argv,4)))
Miller Puckette's avatar
Miller Puckette committed
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
    {
        i = 2;
        iemgui_new_getnames(&x->x_gui, 3, argv);
    }
    else if((argc == 11)&&(IS_A_SYMBOL(argv,3)||IS_A_FLOAT(argv,3)))
    {
        i = 1;
        iemgui_new_getnames(&x->x_gui, 3, argv);
    }
    else iemgui_new_getnames(&x->x_gui, 3, 0);

    if(((argc >= 10)&&(argc <= 13))
       &&(IS_A_SYMBOL(argv,i+3)||IS_A_FLOAT(argv,i+3))&&IS_A_FLOAT(argv,i+4)
       &&IS_A_FLOAT(argv,i+5)&&IS_A_FLOAT(argv,i+6)
       &&IS_A_FLOAT(argv,i+7)&&IS_A_FLOAT(argv,i+8)
       &&IS_A_FLOAT(argv,i+9))
    {
            /* disastrously, the "label" sits in a different part of the
            message.  So we have to track its location separately (in
            the slot x_labelbindex) and initialize it specially here. */
358
        iemgui_getfloatsym(argv+i+3);
Miller Puckette's avatar
Miller Puckette committed
359
        x->x_gui.x_labelbindex = i+4;
360
361
        ldx = atom_getintarg(i+4, argc, argv);
        ldy = atom_getintarg(i+5, argc, argv);
362
        iem_inttofstyle(&x->x_gui, atom_getintarg(i+6, argc, argv));
363
364
365
        fs = atom_getintarg(i+7, argc, argv);
        bflcol[0] = atom_getintarg(i+8, argc, argv);
        bflcol[2] = atom_getintarg(i+9, argc, argv);
Miller Puckette's avatar
Miller Puckette committed
366
367
368
    }
    if((argc == 13)&&IS_A_FLOAT(argv,i+10))
    {
369
        iem_inttosymargs(&x->x_gui, atom_getintarg(i+10, argc, argv));
Miller Puckette's avatar
Miller Puckette committed
370
371
372
    }
    x->x_gui.x_draw = (t_iemfunptr)my_canvas_draw;
    x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
373
    x->x_gui.x_h = x->x_gui.x_w = a;
Miller Puckette's avatar
Miller Puckette committed
374
375
    x->x_vis_w = w;
    x->x_vis_h = h;
376
377
    if (x->x_gui.x_font_style<0 || x->x_gui.x_font_style>2) x->x_gui.x_font_style=0;
    if (iemgui_has_rcv(&x->x_gui))
Miller Puckette's avatar
Miller Puckette committed
378
379
380
381
382
383
384
385
386
387
        pd_bind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
    x->x_gui.x_ldx = ldx;
    x->x_gui.x_ldy = ldy;
    if(fs < 4)
        fs = 4;
    x->x_gui.x_fontsize = fs;
    iemgui_all_colfromload(&x->x_gui, bflcol);
    x->x_at[0].a_type = A_FLOAT;
    x->x_at[1].a_type = A_FLOAT;
    iemgui_verify_snd_ne_rcv(&x->x_gui);
388

389
390
    x->x_gui. x_handle = scalehandle_new((t_object *)x,x->x_gui.x_glist,1,my_canvas__clickhook,my_canvas__motionhook);
    x->x_gui.x_lhandle = scalehandle_new((t_object *)x,x->x_gui.x_glist,0,my_canvas__clickhook,my_canvas__motionhook);
Ivica Bukvic's avatar
Ivica Bukvic committed
391
    x->x_gui.x_obj.te_iemgui = 1;
392

Miller Puckette's avatar
Miller Puckette committed
393
394
395
396
397
    return (x);
}

static void my_canvas_ff(t_my_canvas *x)
{
398
    if(iemgui_has_rcv(&x->x_gui))
Miller Puckette's avatar
Miller Puckette committed
399
400
        pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
    gfxstub_deleteforkey(x);
401

402
403
    if (x->x_gui. x_handle) scalehandle_free(x->x_gui. x_handle);
    if (x->x_gui.x_lhandle) scalehandle_free(x->x_gui.x_lhandle);
Miller Puckette's avatar
Miller Puckette committed
404
405
406
407
408
}

void g_mycanvas_setup(void)
{
    my_canvas_class = class_new(gensym("cnv"), (t_newmethod)my_canvas_new,
Ivica Bukvic's avatar
Ivica Bukvic committed
409
410
411
412
413
414
415
        (t_method)my_canvas_ff, sizeof(t_my_canvas), CLASS_NOINLET, A_GIMME, 0);
    class_addcreator((t_newmethod)my_canvas_new,
        gensym("my_canvas"), A_GIMME, 0);
    class_addmethod(my_canvas_class, (t_method)my_canvas_dialog,
        gensym("dialog"), A_GIMME, 0);
    class_addmethod(my_canvas_class, (t_method)my_canvas_size,
        gensym("size"), A_GIMME, 0);
416
    iemgui_class_addmethods(my_canvas_class);
Ivica Bukvic's avatar
Ivica Bukvic committed
417
418
419
420
    class_addmethod(my_canvas_class, (t_method)my_canvas_vis_size,
        gensym("vis_size"), A_GIMME, 0);
    class_addmethod(my_canvas_class, (t_method)my_canvas_get_pos,
        gensym("get_pos"), 0);
Miller Puckette's avatar
Miller Puckette committed
421

422
    wb_init(&my_canvas_widgetbehavior,my_canvas_getrect,0);
Miller Puckette's avatar
Miller Puckette committed
423
424
425
426
427
    class_setwidget(my_canvas_class, &my_canvas_widgetbehavior);
    class_sethelpsymbol(my_canvas_class, gensym("my_canvas"));
    class_setsavefn(my_canvas_class, my_canvas_save);
    class_setpropertiesfn(my_canvas_class, my_canvas_properties);
}