g_mycanvas.c 15.6 KB
Newer Older
Miller Puckette's avatar
Miller Puckette committed
1 2 3 4 5 6 7
/* 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 */

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
8
#include "config.h"
Miller Puckette's avatar
Miller Puckette committed
9 10 11 12 13 14 15 16 17 18 19

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

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
20
#ifdef HAVE_UNISTD_H
Miller Puckette's avatar
Miller Puckette committed
21 22 23
#include <unistd.h>
#endif

Hans-Christoph Steiner's avatar
Hans-Christoph Steiner committed
24 25 26 27
#ifdef HAVE_IO_H
#include <io.h>
#endif

28 29 30
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
31 32 33
/* ---------- cnv  my gui-canvas for a window ---------------- */

t_widgetbehavior my_canvas_widgetbehavior;
34
/*static*/ t_class *my_canvas_class;
Miller Puckette's avatar
Miller Puckette committed
35 36 37 38 39 40 41 42 43

/* widget helper functions */

void my_canvas_draw_new(t_my_canvas *x, t_glist *glist)
{
    int xpos=text_xpix(&x->x_gui.x_obj, glist);
    int ypos=text_ypix(&x->x_gui.x_obj, glist);
    t_canvas *canvas=glist_getcanvas(glist);

44 45
    scalehandle_draw_new(x->x_gui. x_handle,canvas);
    scalehandle_draw_new(x->x_gui.x_lhandle,canvas);
Ivica Bukvic's avatar
Ivica Bukvic committed
46 47 48 49 50 51 52 53 54 55 56 57 58

        char *nlet_tag = iem_get_tag(glist, (t_iemgui *)x);

        sys_vgui(".x%lx.c create prect %d %d %d %d -fill #%6.6x -stroke #%6.6x "
                 "-tags {%lxRECT %lxMYCNV %s text iemgui}\n",
                 canvas, xpos, ypos,
                 xpos + x->x_vis_w, ypos + x->x_vis_h,
                 x->x_gui.x_bcol, x->x_gui.x_bcol, x, x, nlet_tag);
        sys_vgui(".x%lx.c create prect %d %d %d %d -stroke #%6.6x "
                 "-tags {%lxBASE %lxMYCNV %s text iemgui}\n",
                 canvas, xpos, ypos,
                 xpos + x->x_gui.x_w, ypos + x->x_gui.x_h,
                 x->x_gui.x_bcol, x, x, nlet_tag);
59
    iemgui_label_draw_new(&x->x_gui,canvas,xpos,ypos,nlet_tag,"MYCNV");
Miller Puckette's avatar
Miller Puckette committed
60 61 62 63 64 65 66 67
}

void my_canvas_draw_move(t_my_canvas *x, t_glist *glist)
{
    int xpos=text_xpix(&x->x_gui.x_obj, glist);
    int ypos=text_ypix(&x->x_gui.x_obj, glist);
    t_canvas *canvas=glist_getcanvas(glist);

Ivica Bukvic's avatar
Ivica Bukvic committed
68 69 70 71 72 73 74 75 76
    if (glist_isvisible(canvas))
    {

        sys_vgui(".x%lx.c coords %lxRECT %d %d %d %d\n",
                 canvas, x, xpos, ypos, xpos + x->x_vis_w,
                 ypos + x->x_vis_h);
        sys_vgui(".x%lx.c coords %lxBASE %d %d %d %d\n",
                 canvas, x, xpos, ypos,
                 xpos + x->x_gui.x_w, ypos + x->x_gui.x_h);
77
        iemgui_label_draw_move(&x->x_gui,canvas,xpos,ypos);
Ivica Bukvic's avatar
Ivica Bukvic committed
78
        /* redraw scale handle rectangle if selected */
79
        if (x->x_gui.x_selected)
Ivica Bukvic's avatar
Ivica Bukvic committed
80 81 82 83
        {
            my_canvas_draw_select(x, x->x_gui.x_glist);
        }
    }
Miller Puckette's avatar
Miller Puckette committed
84 85 86 87 88
}

void my_canvas_draw_config(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
89 90
    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);
91
    if (x->x_gui.x_selected && x->x_gui.x_glist == canvas)
Ivica Bukvic's avatar
Ivica Bukvic committed
92
        sys_vgui(".x%lx.c itemconfigure %lxBASE "
93
                 "-stroke $pd_colors(selection)\n", canvas, x);
Ivica Bukvic's avatar
Ivica Bukvic committed
94 95
    else
        sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n", canvas, x,
96
             x->x_gui.x_bcol);
97
    iemgui_label_draw_config(&x->x_gui,canvas);
Miller Puckette's avatar
Miller Puckette committed
98 99 100 101 102
}

void my_canvas_draw_select(t_my_canvas* x, t_glist* glist)
{
    t_canvas *canvas=glist_getcanvas(glist);
103
    if(x->x_gui.x_selected)
104 105 106 107 108
    {
        // check if we are drawing inside a gop abstraction
        // visible on parent canvas
        // if so, disable highlighting
        if (x->x_gui.x_glist == glist_getcanvas(glist))
Ivica Bukvic's avatar
Ivica Bukvic committed
109
        {
110 111 112 113
            sys_vgui(".x%lx.c itemconfigure %lxBASE "
                     "-stroke $pd_colors(selection)\n", canvas, x);
            scalehandle_draw_select2(&x->x_gui,glist,"MYCNV",
                x->x_vis_w,x->x_vis_h);
Ivica Bukvic's avatar
Ivica Bukvic committed
114
        }
115 116 117 118 119 120 121 122 123 124 125
        sys_vgui(".x%lx.c addtag selected withtag %lxMYCNV\n", canvas, x);
    }
    else
    {
        sys_vgui(".x%lx.c itemconfigure %lxBASE -stroke #%6.6x\n",
            canvas, x, x->x_gui.x_bcol);
        sys_vgui(".x%lx.c dtag %lxMYCNV selected\n", canvas, x);
        scalehandle_draw_erase2(&x->x_gui,glist);
    }
    iemgui_label_draw_select(&x->x_gui,canvas);
    iemgui_tag_selected(&x->x_gui,canvas,"MYCNV");
126 127
}

Ivica Bukvic's avatar
Ivica Bukvic committed
128 129
static void my_canvas__clickhook(t_scalehandle *sh, t_floatarg f,
    t_floatarg xxx, t_floatarg yyy)
130
{
Ivica Bukvic's avatar
Ivica Bukvic committed
131
    t_my_canvas *x = (t_my_canvas *)(sh->h_master);
132
    int newstate = (int)f;
133
    if (sh->h_dragon && newstate == 0 && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
134
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
135 136 137
        canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
        if (sh->h_dragx || sh->h_dragy)
        {
138 139
            x->x_vis_w += sh->h_dragx;
            x->x_vis_h += sh->h_dragy;
Ivica Bukvic's avatar
Ivica Bukvic committed
140 141 142 143 144
            canvas_dirty(x->x_gui.x_glist, 1);
        }
        if (glist_isvisible(x->x_gui.x_glist))
        {
            my_canvas_draw_move(x, x->x_gui.x_glist);
145
            scalehandle_unclick_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
146
        }
Miller Puckette's avatar
Miller Puckette committed
147
    }
148
    else if (!sh->h_dragon && newstate && sh->h_scale)
Miller Puckette's avatar
Miller Puckette committed
149
    {
150
        scalehandle_click_scale(sh);
151
    }
152 153
    else if (sh->h_dragon && newstate == 0 && !sh->h_scale)
    {
154
        scalehandle_unclick_label(sh);
155 156 157
    }
    else if (!sh->h_dragon && newstate && !sh->h_scale)
    {
158
        scalehandle_click_label(sh);
159
    }
160 161 162
    sh->h_dragon = newstate;
}

163
static void my_canvas__motionhook(t_scalehandle *sh, t_floatarg f1, t_floatarg f2)
164
{
165
    if (sh->h_dragon && sh->h_scale)
166
    {
Ivica Bukvic's avatar
Ivica Bukvic committed
167 168
        t_my_canvas *x = (t_my_canvas *)(sh->h_master);
        int dx = (int)f1, dy = (int)f2;
169 170
        dx = maxi(dx,1-x->x_vis_w);
        dy = maxi(dy,1-x->x_vis_h);        
Ivica Bukvic's avatar
Ivica Bukvic committed
171 172
        sh->h_dragx = dx;
        sh->h_dragy = dy;
173
        scalehandle_drag_scale(sh);
Ivica Bukvic's avatar
Ivica Bukvic committed
174 175 176 177

        int properties = gfxstub_haveproperties((void *)x);
        if (properties)
        {
178 179
            int new_w = x->x_vis_w + sh->h_dragx;
            int new_h = x->x_vis_h + sh->h_dragy;
180 181 182
            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
183 184 185
            int min = (new_w < new_h ? new_w : new_h);
            if (min <= x->x_gui.x_w)
            {
186
                properties_set_field_int(properties,"dim.w_ent",min);
Ivica Bukvic's avatar
Ivica Bukvic committed
187 188 189
            }
        }
    }
190
    scalehandle_dragon_label(sh,f1,f2);
Miller Puckette's avatar
Miller Puckette committed
191 192 193 194 195 196
}

void my_canvas_draw(t_my_canvas *x, t_glist *glist, int mode)
{
    if(mode == IEM_GUI_DRAW_MODE_MOVE)
        my_canvas_draw_move(x, glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
197 198
    else if(mode == IEM_GUI_DRAW_MODE_NEW)
    {
Miller Puckette's avatar
Miller Puckette committed
199
        my_canvas_draw_new(x, glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
200 201
        sys_vgui(".x%lx.c raise all_cords\n", glist_getcanvas(glist));
    }
Miller Puckette's avatar
Miller Puckette committed
202 203 204
    else if(mode == IEM_GUI_DRAW_MODE_SELECT)
        my_canvas_draw_select(x, glist);
    else if(mode == IEM_GUI_DRAW_MODE_ERASE)
205
        iemgui_draw_erase(&x->x_gui, glist, "MYCNV");
Miller Puckette's avatar
Miller Puckette committed
206 207 208 209 210 211
    else if(mode == IEM_GUI_DRAW_MODE_CONFIG)
        my_canvas_draw_config(x, glist);
}

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

Ivica Bukvic's avatar
Ivica Bukvic committed
212 213
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
214 215 216 217 218
{
    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);
Ivica Bukvic's avatar
Ivica Bukvic committed
219 220 221 222 223 224 225 226 227 228 229 230
    if (!glist_istoplevel(glist))
    {
        //if we are trying to calculate visibility of a widget inside a GOP
        *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
231 232 233 234 235 236 237 238 239 240 241 242 243
}

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);
    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,
244 245
                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
246 247 248 249 250 251 252 253 254 255
    binbuf_addv(b, ";");
}

static void my_canvas_properties(t_gobj *z, t_glist *owner)
{
    t_my_canvas *x = (t_my_canvas *)z;
    char buf[800];
    t_symbol *srl[3];

    iemgui_properties(&x->x_gui, srl);
Miller Puckette's avatar
Miller Puckette committed
256
    sprintf(buf, "pdtk_iemgui_dialog %%s |cnv| \
Miller Puckette's avatar
Miller Puckette committed
257 258 259
            ------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
260 261
            {%s} {%s} \
            {%s} %d %d \
Miller Puckette's avatar
Miller Puckette committed
262 263 264 265 266 267 268
            %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,
269
            x->x_gui.x_font_style, x->x_gui.x_fontsize,
Miller Puckette's avatar
Miller Puckette committed
270 271 272 273 274 275
            0xffffff & x->x_gui.x_bcol, -1/*no frontcolor*/, 0xffffff & x->x_gui.x_lcol);
    gfxstub_new(&x->x_gui.x_obj.ob_pd, x, buf);
}

static void my_canvas_get_pos(t_my_canvas *x)
{
276
    if(iemgui_has_snd(&x->x_gui) && x->x_gui.x_snd->s_thing)
Miller Puckette's avatar
Miller Puckette committed
277 278 279 280 281 282 283 284 285
    {
        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)
{
Ivica Bukvic's avatar
Ivica Bukvic committed
286
    canvas_apply_setundo(x->x_gui.x_glist, (t_gobj *)x);
287

Miller Puckette's avatar
Miller Puckette committed
288 289 290 291
    t_symbol *srl[3];
    int a = (int)atom_getintarg(0, argc, argv);
    int w = (int)atom_getintarg(2, argc, argv);
    int h = (int)atom_getintarg(3, argc, argv);
Mathieu L Bouchard's avatar
Mathieu L Bouchard committed
292
    iemgui_dialog(&x->x_gui, srl, argc, argv);
Miller Puckette's avatar
Miller Puckette committed
293

294
    x->x_gui.x_loadinit = 0;
Miller Puckette's avatar
Miller Puckette committed
295 296 297 298 299 300 301 302 303 304 305
    if(a < 1)
        a = 1;
    x->x_gui.x_w = a;
    x->x_gui.x_h = x->x_gui.x_w;
    if(w < 1)
        w = 1;
    x->x_vis_w = w;
    if(h < 1)
        h = 1;
    x->x_vis_h = h;
    (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_CONFIG);
306
    //(*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
307
    iemgui_shouldvis(&x->x_gui, IEM_GUI_DRAW_MODE_MOVE);
308

Ivica Bukvic's avatar
Ivica Bukvic committed
309
    /* forcing redraw of the scale handle */
310
    if (x->x_gui.x_selected)
Ivica Bukvic's avatar
Ivica Bukvic committed
311 312 313
    {
        my_canvas_draw_select(x, x->x_gui.x_glist);
    }
314

Ivica Bukvic's avatar
Ivica Bukvic committed
315 316
    //ico@bukvic.net 100518 update scrollbars when object
    //potentially exceeds window size
317
    t_canvas *canvas=(t_canvas *)glist_getcanvas(x->x_gui.x_glist);
Ivica Bukvic's avatar
Ivica Bukvic committed
318
    sys_vgui("pdtk_canvas_getscroll .x%lx.c\n", (long unsigned int)canvas);
Miller Puckette's avatar
Miller Puckette committed
319 320 321 322 323 324 325 326 327 328
}

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;
329
    iemgui_size(&x->x_gui);
Miller Puckette's avatar
Miller Puckette committed
330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
}

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;
    if(glist_isvisible(x->x_gui.x_glist))
        (*x->x_gui.x_draw)(x, x->x_gui.x_glist, IEM_GUI_DRAW_MODE_MOVE);
}

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

359 360
    iem_inttosymargs(&x->x_gui, 0);
    iem_inttofstyle(&x->x_gui, 0);
Miller Puckette's avatar
Miller Puckette committed
361 362 363 364 365 366 367 368

    if(((argc >= 10)&&(argc <= 13))
       &&IS_A_FLOAT(argv,0)&&IS_A_FLOAT(argv,1)&&IS_A_FLOAT(argv,2))
    {
        a = (int)atom_getintarg(0, argc, argv);
        w = (int)atom_getintarg(1, argc, argv);
        h = (int)atom_getintarg(2, argc, argv);
    }
Ivica Bukvic's avatar
Ivica Bukvic committed
369 370
    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
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394
    {
        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. */
        iemgui_new_dogetname(&x->x_gui, i+3, argv);
        x->x_gui.x_labelbindex = i+4;
        ldx = (int)atom_getintarg(i+4, argc, argv);
        ldy = (int)atom_getintarg(i+5, argc, argv);
395
        iem_inttofstyle(&x->x_gui, atom_getintarg(i+6, argc, argv));
Miller Puckette's avatar
Miller Puckette committed
396 397 398 399 400 401
        fs = (int)atom_getintarg(i+7, argc, argv);
        bflcol[0] = (int)atom_getintarg(i+8, argc, argv);
        bflcol[2] = (int)atom_getintarg(i+9, argc, argv);
    }
    if((argc == 13)&&IS_A_FLOAT(argv,i+10))
    {
402
        iem_inttosymargs(&x->x_gui, atom_getintarg(i+10, argc, argv));
Miller Puckette's avatar
Miller Puckette committed
403 404 405 406 407 408 409 410 411 412 413 414 415
    }
    x->x_gui.x_draw = (t_iemfunptr)my_canvas_draw;
    x->x_gui.x_glist = (t_glist *)canvas_getcurrent();
    if(a < 1)
        a = 1;
    x->x_gui.x_w = a;
    x->x_gui.x_h = x->x_gui.x_w;
    if(w < 1)
        w = 1;
    x->x_vis_w = w;
    if(h < 1)
        h = 1;
    x->x_vis_h = h;
416 417
    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
418 419 420 421 422 423 424 425 426 427
        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);
428

429 430
    x->x_gui. x_handle = scalehandle_new(scalehandle_class,(t_iemgui *)x,1);
    x->x_gui.x_lhandle = scalehandle_new(scalehandle_class,(t_iemgui *)x,0);
Ivica Bukvic's avatar
Ivica Bukvic committed
431
    x->x_gui.x_obj.te_iemgui = 1;
432

Miller Puckette's avatar
Miller Puckette committed
433 434 435 436 437
    return (x);
}

static void my_canvas_ff(t_my_canvas *x)
{
438
    if(iemgui_has_rcv(&x->x_gui))
Miller Puckette's avatar
Miller Puckette committed
439 440
        pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv);
    gfxstub_deleteforkey(x);
441

442 443
    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
444 445 446 447 448
}

void g_mycanvas_setup(void)
{
    my_canvas_class = class_new(gensym("cnv"), (t_newmethod)my_canvas_new,
Ivica Bukvic's avatar
Ivica Bukvic committed
449 450 451 452 453 454 455
        (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);
456
    iemgui_class_addmethods(my_canvas_class);
Ivica Bukvic's avatar
Ivica Bukvic committed
457 458 459 460
    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
461

462
    scalehandle_class = class_new(gensym("_scalehandle"), 0, 0,
Ivica Bukvic's avatar
Ivica Bukvic committed
463
                  sizeof(t_scalehandle), CLASS_PD, 0);
464
    class_addmethod(scalehandle_class, (t_method)my_canvas__clickhook,
Ivica Bukvic's avatar
Ivica Bukvic committed
465
            gensym("_click"), A_FLOAT, A_FLOAT, A_FLOAT, 0);
466
    class_addmethod(scalehandle_class, (t_method)my_canvas__motionhook,
Ivica Bukvic's avatar
Ivica Bukvic committed
467
            gensym("_motion"), A_FLOAT, A_FLOAT, 0);
468

469
    wb_init(&my_canvas_widgetbehavior,my_canvas_getrect,0);
Miller Puckette's avatar
Miller Puckette committed
470 471 472 473 474
    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);
}