g_mycanvas.c 15.1 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
    int x1=text_xpix(&x->x_gui.x_obj, glist);
    int y1=text_ypix(&x->x_gui.x_obj, glist);

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

void my_canvas_draw_move(t_my_canvas *x, t_glist *glist)
{
47 48
    t_canvas *canvas=glist_getcanvas(glist);
    if (!glist_isvisible(canvas)) return;
49 50
    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
51

52 53
    iemgui_base_draw_move(&x->x_gui);

54 55 56 57
    //sys_vgui(".x%lx.c coords %lxRECT %d %d %d %d\n",
    //    canvas, x, x1, y1, x1+x->x_vis_w, y1+x->x_vis_h);
    //sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n",
    //    canvas, x, x1, y1, x1+x->x_gui.x_w, y1+x->x_gui.x_h);
58 59
    gui_vmess("gui_mycanvas_coords", "xxiiii",
        canvas, x,
60
        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
61 62 63 64 65
}

void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
66 67 68
    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);
69
    char bcol[8]; sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
70 71 72 73
    //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;
74 75
    gui_vmess("gui_update_mycanvas", "xxsi",
        canvas, x, bcol, isselected);
Miller Puckette's avatar
Miller Puckette committed
76 77 78 79 80
}

void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
81 82
    if (x->x_gui.x_glist != glist_getcanvas(glist)) return;
    char bcol[8]; sprintf(bcol, "#%6.6x", x->x_gui.x_bcol);
83 84 85
    //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);
86 87
    gui_vmess("gui_mycanvas_select_color", "xxs",
        canvas, x,
88
        x->x_gui.x_selected == canvas && x->x_gui.x_glist == canvas ?
Jonathan Wilkes's avatar
Jonathan Wilkes committed
89
            "blue" : bcol); 
90 91
}

92
static void my_canvas__clickhook(t_scalehandle *sh, int newstate)
93
{
Ivica Bukvic's avatar
Ivica Bukvic committed
94
    t_my_canvas *x = (t_my_canvas *)(sh->h_master);
95
    if (sh->h_dragon && newstate == 0 && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
96
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
97 98 99
        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
        if (sh->h_dragx || sh->h_dragy)
        {
100 101
            x->x_vis_w += sh->h_dragx;
            x->x_vis_h += sh->h_dragy;
Ivica Bukvic's avatar
Ivica Bukvic committed
102 103
            canvas_dirty(x->x_gui.x_glist, 1);
        }
104 105 106 107 108 109 110 111 112 113 114 115
        // 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
116 117 118
        if (glist_isvisible(x->x_gui.x_glist))
        {
            my_canvas_draw_move(x, x->x_gui.x_glist);
119
            scalehandle_unclick_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
120
        }
Miller Puckette's avatar
Miller Puckette committed
121
    }
122
    iemgui__clickhook3(sh,newstate);
123 124
}

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

        int properties = gfxstub_haveproperties((void *)x);
        if (properties)
        {
140 141
            int new_w = x->x_vis_w + sh->h_dragx;
            int new_h = x->x_vis_h + sh->h_dragy;
142 143 144
            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
145 146 147
            int min = (new_w < new_h ? new_w : new_h);
            if (min <= x->x_gui.x_w)
            {
148
                properties_set_field_int(properties,"dim.w_ent",min);
Ivica Bukvic's avatar
Ivica Bukvic committed
149 150 151
            }
        }
    }
152
    scalehandle_dragon_label(sh,f1,f2);
Miller Puckette's avatar
Miller Puckette committed
153 154 155 156
}

void my_canvas_draw(t_my_canvas *x, t_glist *glist, int mode)
{
157 158 159 160
    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
161 162 163 164
}

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

Ivica Bukvic's avatar
Ivica Bukvic committed
165 166
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
167 168 169 170 171
{
    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);
172
    if (!glist_istoplevel(glist) || !glist->gl_edit)
Ivica Bukvic's avatar
Ivica Bukvic committed
173 174
    {
        //if we are trying to calculate visibility of a widget inside a GOP
175
        //or are calculating getrect during runtime
Ivica Bukvic's avatar
Ivica Bukvic committed
176 177 178 179 180 181 182 183 184
        *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
185 186 187 188 189 190 191 192
}

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);
193 194 195 196 197 198
    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
199 200 201 202 203
}

static void my_canvas_properties(t_gobj *z, t_glist *owner)
{
    t_my_canvas *x = (t_my_canvas *)z;
204
    char buf[800], *gfx_tag;
Miller Puckette's avatar
Miller Puckette committed
205 206 207
    t_symbol *srl[3];

    iemgui_properties(&x->x_gui, srl);
Miller Puckette's avatar
Miller Puckette committed
208
    sprintf(buf, "pdtk_iemgui_dialog %%s |cnv| \
Miller Puckette's avatar
Miller Puckette committed
209 210 211
            ------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
212 213
            {%s} {%s} \
            {%s} %d %d \
Miller Puckette's avatar
Miller Puckette committed
214 215 216 217 218 219 220
            %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,
221
            x->x_gui.x_font_style, x->x_gui.x_fontsize,
Miller Puckette's avatar
Miller Puckette committed
222
            0xffffff & x->x_gui.x_bcol, -1/*no frontcolor*/, 0xffffff & x->x_gui.x_lcol);
223 224 225 226 227 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
    //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
254 255 256 257
}

static void my_canvas_get_pos(t_my_canvas *x)
{
258
    if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
Miller Puckette's avatar
Miller Puckette committed
259 260 261 262 263 264 265 266 267
    {
        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)
{
268
    //printf("cnv_dialog: selected=%d\n",x->x_gui.x_selected);
Ivica Bukvic's avatar
Ivica Bukvic committed
269
    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
270
    //printf("cnv_dialog: selected=%d\n",x->x_gui.x_selected);
271 272 273 274
    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);
275
    iemgui_dialog(&x->x_gui, argc, argv);
276
    x->x_gui.x_loadinit = 0;
277
    iemgui_draw_config(&x->x_gui);
278
    iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
279
    scalehandle_draw(&x->x_gui);
280
    scrollbar_update(x->x_gui.x_glist);
Miller Puckette's avatar
Miller Puckette committed
281 282 283 284 285 286 287 288 289 290
}

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;
291
    iemgui_size(&x->x_gui);
Miller Puckette's avatar
Miller Puckette committed
292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
}

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;
309
    if(glist_isvisible(x->x_gui.x_glist)) iemgui_draw_move(&x->x_gui);
Miller Puckette's avatar
Miller Puckette committed
310 311 312 313 314 315 316
}

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
317
    int ldx=20, ldy=12, i=0;
Miller Puckette's avatar
Miller Puckette committed
318 319
    int fs=14;

320 321
    iem_inttosymargs(&x->x_gui, 0);
    iem_inttofstyle(&x->x_gui, 0);
Miller Puckette's avatar
Miller Puckette committed
322 323 324 325

    if(((argc >= 10)&&(argc <= 13))
       &&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,2))
    {
326 327 328
        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
329
    }
Ivica Bukvic's avatar
Ivica Bukvic committed
330 331
    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
332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
    {
        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. */
352
        iemgui_getfloatsym(argv+i+3);
Miller Puckette's avatar
Miller Puckette committed
353
        x->x_gui.x_labelbindex = i+4;
354 355
        ldx = atom_getintarg(i+4, argc, argv);
        ldy = atom_getintarg(i+5, argc, argv);
356
        iem_inttofstyle(&x->x_gui, atom_getintarg(i+6, argc, argv));
357 358 359
        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
360 361 362
    }
    if((argc == 13)&&IS_A_FLOAT(argv,i+10))
    {
363
        iem_inttosymargs(&x->x_gui, atom_getintarg(i+10, argc, argv));
Miller Puckette's avatar
Miller Puckette committed
364 365 366
    }
    x->x_gui.x_draw = (t_iemfunptr)my_canvas_draw;
    x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
367
    x->x_gui.x_h = x->x_gui.x_w = a;
Miller Puckette's avatar
Miller Puckette committed
368 369
    x->x_vis_w = w;
    x->x_vis_h = h;
370 371
    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
372 373 374 375 376 377 378 379 380 381
        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);
382

383
    x->x_gui.x_handle = scalehandle_new((t_object *)x,x->x_gui.x_glist,1,my_canvas__clickhook,my_canvas__motionhook);
384
    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
385
    x->x_gui.x_obj.te_iemgui = 1;
386

387
    x->x_gui.legacy_x = 0;
388
    x->x_gui.legacy_y = 0;
389

Miller Puckette's avatar
Miller Puckette committed
390 391 392 393 394
    return (x);
}

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

399 400
    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
401 402 403 404 405
}

void g_mycanvas_setup(void)
{
    my_canvas_class = class_new(gensym("cnv"), (t_newmethod)my_canvas_new,
Ivica Bukvic's avatar
Ivica Bukvic committed
406 407 408 409 410 411 412
        (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);
413
    iemgui_class_addmethods(my_canvas_class);
Ivica Bukvic's avatar
Ivica Bukvic committed
414 415 416 417
    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
418

419
    wb_init(&my_canvas_widgetbehavior,my_canvas_getrect,0);
Miller Puckette's avatar
Miller Puckette committed
420 421 422 423 424
    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);
}