Update of /cvsroot/pure-data/pd/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10318
Modified Files: Tag: devel_0_39 desire.c Log Message: trying to code objectbox deletion undo...
Index: desire.c =================================================================== RCS file: /cvsroot/pure-data/pd/src/Attic/desire.c,v retrieving revision 1.1.2.116 retrieving revision 1.1.2.117 diff -C2 -d -r1.1.2.116 -r1.1.2.117 *** desire.c 20 Aug 2006 21:46:58 -0000 1.1.2.116 --- desire.c 21 Aug 2006 00:04:29 -0000 1.1.2.117 *************** *** 282,286 **** t_class *canvas_class; int canvas_dspstate; /* whether DSP is on or off */ - t_canvas *canvas_editing; /* last canvas to start text edting */ t_canvas *canvas_whichfind; /* last canvas we did a find in */ t_canvas *canvas_list; /* list of all root canvases */ --- 282,285 ---- *************** *** 898,920 **** }
! int glist_isvisible(t_glist *x) ! { ! return ((!x->gl_loading) && glist_getcanvas(x)->gl_mapped); ! }
! int glist_istoplevel(t_glist *x) ! { ! /* we consider a graph "toplevel" if it has its own window ! or if it appears as a box in its parent window so that we ! don't draw the actual contents there. */ ! return (x->gl_havewindow || !x->gl_isgraph); ! }
! int glist_getfont(t_glist *x) ! { ! while (!x->gl_env) ! if (!(x = x->gl_owner)) ! bug("t_canvasenvironment"); ! return (x->gl_font); }
--- 897,910 ---- }
! int glist_isvisible(t_glist *x) {return !x->gl_loading && glist_getcanvas(x)->gl_mapped;}
! /* we consider a graph "toplevel" if it has its own window ! or if it appears as a box in its parent window so that we ! don't draw the actual contents there. */ ! int glist_istoplevel(t_glist *x) {return x->gl_havewindow || !x->gl_isgraph;}
! int glist_getfont(t_glist *x) { ! while (!x->gl_env) if (!(x = x->gl_owner)) bug("t_canvasenvironment"); ! return x->gl_font; }
*************** *** 923,927 **** t_gobj *y; int dspstate = canvas_suspend_dsp(); - if (canvas_editing == x) canvas_editing = 0; if (canvas_whichfind == x) canvas_whichfind = 0; glist_noselect(x); --- 913,916 ---- *************** *** 929,937 **** canvas_vis(x, 0); sys_mgui(x,"delete",""); - if (strcmp(x->gl_name->s_name, "Pd")) pd_unbind(&x->gl_pd, canvas_makebindsym(x->gl_name)); ! if (x->gl_env) ! { freebytes(x->gl_env->ce_argv, x->gl_env->ce_argc * sizeof(t_atom)); freebytes(x->gl_env, sizeof(*x->gl_env)); --- 918,924 ---- canvas_vis(x, 0); sys_mgui(x,"delete",""); if (strcmp(x->gl_name->s_name, "Pd")) pd_unbind(&x->gl_pd, canvas_makebindsym(x->gl_name)); ! if (x->gl_env) { freebytes(x->gl_env->ce_argv, x->gl_env->ce_argc * sizeof(t_atom)); freebytes(x->gl_env, sizeof(*x->gl_env)); *************** *** 939,945 **** canvas_resume_dsp(dspstate); glist_cleanup(x); ! gfxstub_deleteforkey(x); /* probably unnecessary */ ! if (!x->gl_owner) ! canvas_takeofflist(x); }
--- 926,931 ---- canvas_resume_dsp(dspstate); glist_cleanup(x); ! gfxstub_deleteforkey(x); /* probably unnecessary */ ! if (!x->gl_owner) canvas_takeofflist(x); }
*************** *** 954,961 **** }
! void canvas_fixlinesfor(t_canvas *x, t_text *text) ! {sys_mgui(text,"draw_wires","");} ! void canvas_deletelinesfor(t_canvas *x, t_text *text) ! {sys_mgui(text,"delete_wires","");}
/* kill all lines for one inlet or outlet */ --- 940,944 ---- }
! void canvas_fixlinesfor(t_canvas *x, t_text *text) {sys_mgui(text,"draw_wires","");}
/* kill all lines for one inlet or outlet */ *************** *** 989,1009 **** void canvas_objfor(t_glist *gl, t_text *x, int argc, t_atom *argv);
- void canvas_restore(t_canvas *x, t_symbol *s, int argc, t_atom *argv) ! { /* IOhannes */ t_pd *z; /* this should be unnecessary, but sometimes the canvas's name gets out of sync with the owning box's argument; this fixes that */ ! if (argc > 3) ! { t_atom *ap=argv+3; ! if (ap->a_type == A_SYMBOL) ! { char *buf=ap->a_w.w_symbol->s_name, *bufp; ! if (*buf == '$' && buf[1] >= '0' && buf[1] <= '9') ! { ! for (bufp = buf+2; *bufp; bufp++) ! if (*bufp < '0' || *bufp > '9') ! { SETDOLLSYM(ap, gensym(buf+1)); goto didit; --- 972,986 ---- void canvas_objfor(t_glist *gl, t_text *x, int argc, t_atom *argv);
void canvas_restore(t_canvas *x, t_symbol *s, int argc, t_atom *argv) ! { t_pd *z; /* this should be unnecessary, but sometimes the canvas's name gets out of sync with the owning box's argument; this fixes that */ ! if (argc > 3) { t_atom *ap=argv+3; ! if (ap->a_type == A_SYMBOL) { char *buf=ap->a_w.w_symbol->s_name, *bufp; ! if (*buf == '$' && buf[1] >= '0' && buf[1] <= '9') { ! for (bufp = buf+2; *bufp; bufp++) if (*bufp < '0' || *bufp > '9') { SETDOLLSYM(ap, gensym(buf+1)); goto didit; *************** *** 1013,1024 **** } } ! ! if (ap->a_type == A_DOLLSYM) ! { t_canvasenvironment *e = canvas_getenv(canvas_getcurrent()); canvas_rename(x, binbuf_realizedollsym(ap->a_w.w_symbol, e->ce_argc, e->ce_argv, 1), 0); ! } ! else if (ap->a_type == A_SYMBOL) canvas_rename(x, argv[3].a_w.w_symbol, 0); } --- 990,998 ---- } } ! if (ap->a_type == A_DOLLSYM) { t_canvasenvironment *e = canvas_getenv(canvas_getcurrent()); canvas_rename(x, binbuf_realizedollsym(ap->a_w.w_symbol, e->ce_argc, e->ce_argv, 1), 0); ! } else if (ap->a_type == A_SYMBOL) canvas_rename(x, argv[3].a_w.w_symbol, 0); } *************** *** 1027,1032 **** if (!z) error("canvas_restore: out of context"); else if (*z != canvas_class) error("canvas_restore: wasn't a canvas"); ! else ! { t_canvas *x2 = (t_canvas *)z; x->gl_owner = x2; --- 1001,1005 ---- if (!z) error("canvas_restore: out of context"); else if (*z != canvas_class) error("canvas_restore: wasn't a canvas"); ! else { t_canvas *x2 = (t_canvas *)z; x->gl_owner = x2; *************** *** 2270,2374 **** #define NHIST 15
- /* LATER might have to speed this up */ - static void canvas_tidy(t_canvas *x) - { - t_gobj *y, *y2; - int ax1, ay1, ax2, ay2, bx1, by1, bx2, by2; - int histogram[NHIST], *ip, i, besthist, bestdist; - /* if nobody is selected, this means do it to all boxes; - othewise just the selection */ - int all = (x->gl_editor ? (x->gl_editor->e_selection == 0) : 1); - - /* tidy horizontally */ - for (y = x->gl_list; y; y = y->g_next) - if (all || glist_isselected(x, y)) - { - gobj_getrect(y, x, &ax1, &ay1, &ax2, &ay2); - - for (y2 = x->gl_list; y2; y2 = y2->g_next) - if (all || glist_isselected(x, y2)) - { - gobj_getrect(y2, x, &bx1, &by1, &bx2, &by2); - if (by1 <= ay1 + YTOLERANCE && by1 >= ay1 - YTOLERANCE && - bx1 < ax1) - goto nothorizhead; - } - - for (y2 = x->gl_list; y2; y2 = y2->g_next) - if (all || glist_isselected(x, y2)) - { - gobj_getrect(y2, x, &bx1, &by1, &bx2, &by2); - if (by1 <= ay1 + YTOLERANCE && by1 >= ay1 - YTOLERANCE - && by1 != ay1) - gobj_displace(y2, x, 0, ay1-by1); - } - nothorizhead: ; - } - /* tidy vertically. First guess the user's favorite vertical spacing */ - for (i = NHIST, ip = histogram; i--; ip++) *ip = 0; - for (y = x->gl_list; y; y = y->g_next) - if (all || glist_isselected(x, y)) - { - gobj_getrect(y, x, &ax1, &ay1, &ax2, &ay2); - for (y2 = x->gl_list; y2; y2 = y2->g_next) - if (all || glist_isselected(x, y2)) - { - gobj_getrect(y2, x, &bx1, &by1, &bx2, &by2); - if (bx1 <= ax1 + XTOLERANCE && bx1 >= ax1 - XTOLERANCE) - { - int distance = by1-ay2; - if (distance >= 0 && distance < NHIST) - histogram[distance]++; - } - } - } - for (i = 1, besthist = 0, bestdist = 4, ip = histogram + 1; - i < (NHIST-1); i++, ip++) - { - int hit = ip[-1] + 2 * ip[0] + ip[1]; - if (hit > besthist) - { - besthist = hit; - bestdist = i; - } - } - post("best vertical distance %d", bestdist); - for (y = x->gl_list; y; y = y->g_next) - if (all || glist_isselected(x, y)) - { - int keep = 1; - gobj_getrect(y, x, &ax1, &ay1, &ax2, &ay2); - for (y2 = x->gl_list; y2; y2 = y2->g_next) - if (all || glist_isselected(x, y2)) - { - gobj_getrect(y2, x, &bx1, &by1, &bx2, &by2); - if (bx1 <= ax1 + XTOLERANCE && bx1 >= ax1 - XTOLERANCE && - ay1 >= by2 - 10 && ay1 < by2 + NHIST) - goto nothead; - } - while (keep) - { - keep = 0; - for (y2 = x->gl_list; y2; y2 = y2->g_next) - if (all || glist_isselected(x, y2)) - { - gobj_getrect(y2, x, &bx1, &by1, &bx2, &by2); - if (bx1 <= ax1 + XTOLERANCE && bx1 >= ax1 - XTOLERANCE && - by1 > ay1 && by1 < ay2 + NHIST) - { - int vmove = ay2 + bestdist - by1; - gobj_displace(y2, x, ax1-bx1, vmove); - ay1 = by1 + vmove; - ay2 = by2 + vmove; - keep = 1; - break; - } - } - } - nothead: ; - } - canvas_dirty(x, 1); - } - static void canvas_texteditor(t_canvas *x) { --- 2243,2246 ---- *************** *** 4884,4894 **** } } ! else if (template->t_vec[i].ds_type == DT_LIST) ! { ! while (1) ! { ! if (!glist_readscalar(w->w_list, natoms, vec, ! p_nextmsg, 0)) ! break; } } --- 4756,4762 ---- } } ! else if (template->t_vec[i].ds_type == DT_LIST) { ! while (1) { ! if (!glist_readscalar(w->w_list, natoms, vec, p_nextmsg, 0)) break; } } *************** *** 4906,4913 **** int wasvis = glist_isvisible(x);
! if (nextmsg >= natoms || vec[nextmsg].a_type != A_SYMBOL) ! { ! if (nextmsg < natoms) ! post("stopping early: type %d", vec[nextmsg].a_type); *p_nextmsg = natoms; return (0); --- 4774,4779 ---- int wasvis = glist_isvisible(x);
! if (nextmsg >= natoms || vec[nextmsg].a_type != A_SYMBOL) { ! if (nextmsg < natoms) post("stopping early: type %d", vec[nextmsg].a_type); *p_nextmsg = natoms; return (0); *************** *** 4915,4921 **** templatesym = canvas_makebindsym(vec[nextmsg].a_w.w_symbol); *p_nextmsg = nextmsg + 1; ! ! if (!(template = template_findbyname(templatesym))) ! { error("canvas_read: %s: no such template", templatesym->s_name); *p_nextmsg = natoms; --- 4781,4786 ---- templatesym = canvas_makebindsym(vec[nextmsg].a_w.w_symbol); *p_nextmsg = nextmsg + 1; ! ! if (!(template = template_findbyname(templatesym))) { error("canvas_read: %s: no such template", templatesym->s_name); *p_nextmsg = natoms; *************** *** 4923,4953 **** } sc = scalar_new(x, templatesym); ! if (!sc) ! { error("couldn't create scalar "%s"", templatesym->s_name); *p_nextmsg = natoms; return (0); } ! if (wasvis) ! { ! /* temporarily lie about vis flag while this is built */ glist_getcanvas(x)->gl_mapped = 0; } glist_add(x, &sc->sc_gobj); - nline = canvas_scanbinbuf(natoms, vec, &message, p_nextmsg); ! glist_readatoms(x, natoms, vec, p_nextmsg, templatesym, sc->sc_vec, ! nline, vec + message); ! if (wasvis) ! { ! /* reset vis flag as before */ glist_getcanvas(x)->gl_mapped = 1; gobj_vis(&sc->sc_gobj, x, 1); } ! if (selectit) ! { ! glist_select(x, &sc->sc_gobj); ! } ! return (1); }
--- 4788,4810 ---- } sc = scalar_new(x, templatesym); ! if (!sc) { error("couldn't create scalar "%s"", templatesym->s_name); *p_nextmsg = natoms; return (0); } ! if (wasvis) { ! /* temporarily lie about vis flag while this is built */ glist_getcanvas(x)->gl_mapped = 0; } glist_add(x, &sc->sc_gobj); nline = canvas_scanbinbuf(natoms, vec, &message, p_nextmsg); ! glist_readatoms(x, natoms, vec, p_nextmsg, templatesym, sc->sc_vec, nline, vec + message); ! if (wasvis) { ! /* reset vis flag as before */ glist_getcanvas(x)->gl_mapped = 1; gobj_vis(&sc->sc_gobj, x, 1); } ! if (selectit) glist_select(x, &sc->sc_gobj); ! return 1; }
*************** *** 5028,5070 **** }
! static void glist_doread(t_glist *x, t_symbol *filename, t_symbol *format, ! int clearme) ! { t_binbuf *b = binbuf_new(); t_canvas *canvas = glist_getcanvas(x); int wasvis = glist_isvisible(canvas); int cr = 0;
! if (!strcmp(format->s_name, "cr")) ! cr = 1; ! else if (*format->s_name) ! error("qlist_read: unknown flag: %s", format->s_name); ! ! if (binbuf_read_via_path(b, filename->s_name, ! canvas_getdir(canvas)->s_name, cr)) ! { pd_error(x, "read failed"); binbuf_free(b); return; } ! if (wasvis) ! canvas_vis(canvas, 0); ! if (clearme) ! glist_clear(x); glist_readfrombinbuf(x, b, filename->s_name, 0); ! if (wasvis) ! canvas_vis(canvas, 1); binbuf_free(b); }
void glist_read(t_glist *x, t_symbol *filename, t_symbol *format) ! { ! glist_doread(x, filename, format, 1); ! } ! void glist_mergefile(t_glist *x, t_symbol *filename, t_symbol *format) ! { ! glist_doread(x, filename, format, 0); ! }
/* read text from a "properties" window, called from a gfxstub set --- 4885,4912 ---- }
! static void glist_doread(t_glist *x, t_symbol *filename, t_symbol *format, int clearme) { t_binbuf *b = binbuf_new(); t_canvas *canvas = glist_getcanvas(x); int wasvis = glist_isvisible(canvas); int cr = 0; + if (!strcmp(format->s_name, "cr")) cr = 1; + else if (*format->s_name) error("glist_read: unknown flag: %s", format->s_name);
! if (binbuf_read_via_path(b, filename->s_name, canvas_getdir(canvas)->s_name, cr)) { pd_error(x, "read failed"); binbuf_free(b); return; } ! if (wasvis) canvas_vis(canvas, 0); ! if (clearme) glist_clear(x); glist_readfrombinbuf(x, b, filename->s_name, 0); ! if (wasvis) canvas_vis(canvas, 1); binbuf_free(b); }
void glist_read(t_glist *x, t_symbol *filename, t_symbol *format) ! {glist_doread(x, filename, format, 1);} void glist_mergefile(t_glist *x, t_symbol *filename, t_symbol *format) ! {glist_doread(x, filename, format, 0);}
/* read text from a "properties" window, called from a gfxstub set *************** *** 5075,5113 **** int ntotal, nnew, scindex; t_gobj *y, *y2 = 0, *newone, *oldone = 0; ! for (y = x->gl_list, ntotal = 0, scindex = -1; y; y = y->g_next) ! { ! if (y == &sc->sc_gobj) ! scindex = ntotal, oldone = y; ntotal++; } ! if (scindex == -1) bug("data_properties: scalar disappeared"); glist_readfrombinbuf(x, b, "properties dialog", 0); newone = 0; ! if (scindex >= 0) ! { /* take the new object off the list */ ! if (ntotal) ! { ! for (y = x->gl_list, nnew = 1; (y2 = y->g_next); y = y2, nnew++) ! if (nnew == ntotal) ! { newone = y2; y->g_next = y2->g_next; ! break; } } else newone = x->gl_list, x->gl_list = newone->g_next; } ! if (!newone) ! error("couldn't update properties (perhaps a format problem?)"); ! else if (!oldone) ! bug("data_properties: couldn't find old element"); ! else ! { glist_delete(x, oldone); ! if (scindex > 0) ! { for (y = x->gl_list, nnew = 1; y; y = y->g_next, nnew++) --- 4917,4945 ---- int ntotal, nnew, scindex; t_gobj *y, *y2 = 0, *newone, *oldone = 0; ! for (y = x->gl_list, ntotal = 0, scindex = -1; y; y = y->g_next) { ! if (y == &sc->sc_gobj) {scindex = ntotal; oldone = y;} ntotal++; } ! if (scindex == -1) bug("data_properties: scalar disappeared"); glist_readfrombinbuf(x, b, "properties dialog", 0); newone = 0; ! if (scindex >= 0) { /* take the new object off the list */ ! if (ntotal) { ! for (y = x->gl_list, nnew = 1; (y2 = y->g_next); y = y2, nnew++) if (nnew == ntotal) { newone = y2; y->g_next = y2->g_next; ! break; } } else newone = x->gl_list, x->gl_list = newone->g_next; } ! if (!newone) error("couldn't update properties (perhaps a format problem?)"); ! else if (!oldone) bug("data_properties: couldn't find old element"); ! else { glist_delete(x, oldone); ! if (scindex > 0) { for (y = x->gl_list, nnew = 1; y; y = y->g_next, nnew++) *************** *** 9533,9537 **** void canvas_getargs(int *argcp, t_atom **argvp);
! static void canvas_objtext(t_glist *gl, int xpix, int ypix, int selected, t_binbuf *b) { t_text *x=0; int argc, n; --- 9365,9370 ---- void canvas_getargs(int *argcp, t_atom **argvp);
! /* i = insertion point; -1 = end */ ! static void canvas_objtext(t_glist *gl, int xpix, int ypix, int selected, t_binbuf *b, int i) { t_text *x=0; int argc, n; *************** *** 9564,9568 **** gobj_activate(&x->te_g, gl, 1); } ! if (pd_class(&x->ob_pd) == vinlet_class) canvas_resortinlets(glist_getcanvas(gl)); if (pd_class(&x->ob_pd) == voutlet_class) canvas_resortoutlets(glist_getcanvas(gl)); canvas_unsetcurrent((t_canvas *)gl); --- 9397,9401 ---- gobj_activate(&x->te_g, gl, 1); } ! if (pd_class(&x->ob_pd) == vinlet_class) canvas_resortinlets(glist_getcanvas(gl)); if (pd_class(&x->ob_pd) == voutlet_class) canvas_resortoutlets(glist_getcanvas(gl)); canvas_unsetcurrent((t_canvas *)gl); *************** *** 9574,9578 **** binbuf_restore(b, argc-2, argv+2); canvas_objtext(gl, atom_getintarg(0, argc, argv), ! atom_getintarg(1, argc, argv), 0, b); } else { int xpix, ypix; --- 9407,9411 ---- binbuf_restore(b, argc-2, argv+2); canvas_objtext(gl, atom_getintarg(0, argc, argv), ! atom_getintarg(1, argc, argv), 0, b, -1); } else { int xpix, ypix; *************** *** 9580,9584 **** glist_noselect(gl); glist_getnextxy(gl, &xpix, &ypix); ! canvas_objtext(gl, xpix, ypix, 1, b); canvas_startmotion(glist_getcanvas(gl)); } --- 9413,9417 ---- glist_noselect(gl); glist_getnextxy(gl, &xpix, &ypix); ! canvas_objtext(gl, xpix, ypix, 1, b, -1); canvas_startmotion(glist_getcanvas(gl)); } *************** *** 9594,9598 **** binbuf_restore(b, 1, &at); glist_getnextxy(gl, &xpix, &ypix); ! canvas_objtext(gl, xpix, ypix, 1, b); canvas_startmotion(glist_getcanvas(gl)); } --- 9427,9431 ---- binbuf_restore(b, 1, &at); glist_getnextxy(gl, &xpix, &ypix); ! canvas_objtext(gl, xpix, ypix, 1, b, -1); canvas_startmotion(glist_getcanvas(gl)); } *************** *** 10100,10105 **** };
- void glist_drawiofor(t_glist *glist, t_object *ob, int firsttime, char *tag, int x1, int y1, int x2, int y2) {} - void text_setto(t_text *x, t_glist *glist, char *buf, int bufsize) { if (x->te_type == T_OBJECT) { --- 9933,9936 ---- *************** *** 10124,10128 **** int xwas = x->te_xpix, ywas = x->te_ypix; glist_delete(glist, &x->te_g); ! canvas_objtext(glist, xwas, ywas, 0, b); /* if it's an abstraction loadbang it here */ if (newest && pd_class(newest) == canvas_class) --- 9955,9959 ---- int xwas = x->te_xpix, ywas = x->te_ypix; glist_delete(glist, &x->te_g); ! canvas_objtext(glist, xwas, ywas, 0, b, -1); /* if it's an abstraction loadbang it here */ if (newest && pd_class(newest) == canvas_class) *************** *** 10161,10174 ****
/* ! static void canvas_object_insert(t_canvas *x, int argc, t_atom *argv) { t_text *o; ! t_symbol *name; ! if (argc<1 || argv[0]->a_type != T_SYMBOL) {error("$1 must be symbol"); return;} ! name = atom_getsymbol(argv[0]); ! if (sscanf(name->s_name,"!x%lx",(long*)&o)<1) {error("gargamel was here"); return;} ! glist_delete(x,(t_gobj *)o); gobj_changed(x,0); } - */
void g_text_setup(void) { --- 9992,10019 ----
/* ! static void canvas_reorder_last(t_canvas *x, int dest) { ! t_gobj *y = x->gl_list; ! for (y = x->gl_list; y->g_next; y = y2->g_next) {} ! if (y==x->gl_list) return; ! y->g_next = y; ! } ! */ ! ! /* this supposes that $2=#X and $3=obj */ ! static void canvas_object_insert(t_canvas *x, t_symbol *s, int argc, t_atom *argv) { t_text *o; ! t_binbuf *b; ! int i; ! if (argc<1) {error("not enough args"); return;} ! if (argv[0].a_type != A_FLOAT) {error("$1 must be float"); return;} ! i = atom_getfloat(argv); ! printf("canvas_object_insert: HELLO\n"); ! b = binbuf_new(); ! binbuf_restore(b, argc-5, argv+5); ! canvas_objtext(x,atom_getintarg(3,argc,argv),atom_getintarg(4,argc,argv),0,b,-1); ! /*canvas_reorder_last(x,i);*/ gobj_changed(x,0); + /*err: canvas_unsetcurrent(x);*/ }
void g_text_setup(void) { *************** *** 11516,11520 ****
/* should die: */ - class_addmethod3(c,canvas_tidy, "tidy",""); class_addmethod3(c,canvas_texteditor,"texteditor",""); /* end die */ --- 11361,11364 ---- *************** *** 11557,11561 **** class_addmethod3(c,canvas_object_moveto,"object_moveto","sff"); class_addmethod3(c,canvas_object_delete,"object_delete","s"); ! class_addmethod3(c,canvas_object_delete,"object_insert","*"); class_addmethod3(c,canvas_text_setto,"text_setto","*"); class_setnotice(c, canvas_notice); --- 11401,11405 ---- class_addmethod3(c,canvas_object_moveto,"object_moveto","sff"); class_addmethod3(c,canvas_object_delete,"object_delete","s"); ! class_addmethod3(c,canvas_object_insert,"object_insert","*"); class_addmethod3(c,canvas_text_setto,"text_setto","*"); class_setnotice(c, canvas_notice);