[PD-cvs] pd/src g_canvas.c,1.1.1.4.2.7.2.7,1.1.1.4.2.7.2.8 g_editor.c,1.1.1.4.2.3.2.6,1.1.1.4.2.3.2.7 u_main.tk,1.1.1.4.2.7.4.27,1.1.1.4.2.7.4.28

Mathieu Bouchard matju at users.sourceforge.net
Tue Mar 30 06:57:57 CEST 2004


Update of /cvsroot/pure-data/pd/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7154

Modified Files:
      Tag: impd_0_37
	g_canvas.c g_editor.c u_main.tk 
Log Message:
patchcord click detection now moved to Tk


Index: g_editor.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/g_editor.c,v
retrieving revision 1.1.1.4.2.3.2.6
retrieving revision 1.1.1.4.2.3.2.7
diff -C2 -d -r1.1.1.4.2.3.2.6 -r1.1.1.4.2.3.2.7
*** g_editor.c	30 Mar 2004 01:54:09 -0000	1.1.1.4.2.3.2.6
--- g_editor.c	30 Mar 2004 04:57:55 -0000	1.1.1.4.2.3.2.7
***************
*** 30,62 ****
  /* ---------------- generic widget behavior ------------------------- */
  
! void gobj_getrect(t_gobj *x, t_glist *glist, int *x1, int *y1, int *x2, int *y2)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_getrectfn)
!     	(*x->g_pd->c_wb->w_getrectfn)(x, glist, x1, y1, x2, y2);}
  
! void gobj_displace(t_gobj *x, t_glist *glist, int dx, int dy)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_displacefn)
!     	(*x->g_pd->c_wb->w_displacefn)(x, glist, dx, dy);}
  
! void gobj_select(t_gobj *x, t_glist *glist, int state)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_selectfn)
!     	(*x->g_pd->c_wb->w_selectfn)(x, glist, state);}
  
! void gobj_activate(t_gobj *x, t_glist *glist, int state)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_activatefn)
!     	(*x->g_pd->c_wb->w_activatefn)(x, glist, state);}
  
! void gobj_delete(t_gobj *x, t_glist *glist)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_deletefn)
!     	(*x->g_pd->c_wb->w_deletefn)(x, glist);}
  
! void gobj_vis(t_gobj *x, struct _glist *glist, int flag)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_visfn)
!     	(*x->g_pd->c_wb->w_visfn)(x, glist, flag);}
  
  int gobj_click(t_gobj *x, struct _glist *glist,
!     int xpix, int ypix, int shift, int alt, int dbl, int doit)
! {if (x->g_pd->c_wb && x->g_pd->c_wb->w_clickfn)
!     	return (*x->g_pd->c_wb->w_clickfn)(x, glist, xpix, ypix, shift, alt, dbl, doit);
!     else return 0;}
  
  /* ------------------------ managing the selection ----------------- */
--- 30,62 ----
  /* ---------------- generic widget behavior ------------------------- */
  
! void gobj_getrect(t_gobj *x, t_glist *glist, int *x1, int *y1, int *x2, int *y2) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_getrectfn) (*b->w_getrectfn)(x, glist, x1, y1, x2, y2);}
  
! void gobj_displace(t_gobj *x, t_glist *glist, int dx, int dy) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_displacefn) (*b->w_displacefn)(x, glist, dx, dy);}
  
! void gobj_select(t_gobj *x, t_glist *glist, int state) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_selectfn) (*b->w_selectfn)(x, glist, state);}
  
! void gobj_activate(t_gobj *x, t_glist *glist, int state) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_activatefn) (*b->w_activatefn)(x, glist, state);}
  
! void gobj_delete(t_gobj *x, t_glist *glist) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_deletefn) (*b->w_deletefn)(x, glist);}
  
! void gobj_vis(t_gobj *x, struct _glist *glist, int flag) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_visfn) (*b->w_visfn)(x, glist, flag);}
  
  int gobj_click(t_gobj *x, struct _glist *glist,
!     int xpix, int ypix, int shift, int alt, int dbl, int doit) {
! struct _widgetbehavior *b = x->g_pd->c_wb;
! if (b && b->w_clickfn) return (*b->w_clickfn)(x, glist, xpix, ypix, shift, alt, dbl, doit);
! return 0;}
  
  /* ------------------------ managing the selection ----------------- */
***************
*** 880,901 ****
  #endif
  
!     /* mouse click */
  void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
      int mod, int doit)
  {
!     t_gobj *y;
!     int shiftmod, runmode, altmod, rightclick;
      int x1, y1, x2, y2, clickreturned = 0;
!     
      if (!x->gl_editor) {bug("editor"); return;}
      
-     shiftmod = mod & SHIFTMOD;
-     runmode = (mod & CTRLMOD) || !x->gl_edit;
-     altmod = mod & ALTMOD;
-     rightclick = mod & RIGHTCLICK;
- 
      canvas_undo_already_set_move = 0;
  
!     	    /* if keyboard was grabbed, notify grabber and cancel the grab */
      if (doit && x->gl_editor->e_grab && x->gl_editor->e_keyfn)
      {
--- 880,933 ----
  #endif
  
! void canvas_find_wire(t_canvas *self, t_symbol *linesym, t_outconnect **oc,
! int *obj1, int *port1, int *obj2, int *port2) {
!     	t_outconnect *w;
! 	t_linetraverser t;
! 	t_glist *g = glist_getcanvas(self);
! 	if (sscanf(linesym->s_name,"l%x",oc)<1) {
! 		bug("%s:%d BERSERK!\n",__FILE__,__LINE__);
! 	}
!     	linetraverser_start(&t, g);
! 	while (0!=(w=linetraverser_next(&t))) if (*oc==w) break;
! 	if (!w) bug("%s:%d BERSERK!\n",__FILE__,__LINE__);
! 	*obj1 = canvas_getindex(g,  &t.tr_ob->ob_g); *port1 = t.tr_outno;
! 	*obj2 = canvas_getindex(g, &t.tr_ob2->ob_g); *port2 = t.tr_inno;
!     	canvas_setcursor(self, CURSOR_EDITMODE_DISCONNECT);
! }
! 
! void canvas_click_on_wire(t_canvas *self, t_symbol *linesym,
! t_float x, t_float y, t_float b, t_float f) {
! 	post("canvas_click_on_wire: 0x%08x %s %f %f %f %f",
! 		(unsigned)self, linesym->s_name, x, y, b, f);
!     int mod = (int)f;
!     int shiftmod = mod & SHIFTMOD;
!     int runmode = (mod & CTRLMOD) || !self->gl_edit;
!     int altmod = mod & ALTMOD;
!     int rightclick = mod & RIGHTCLICK;
!     //post("shiftmod=%d runmode=%d altmod=%d rightclick=%d b=%f f=%f",shiftmod,runmode,altmod,rightclick,b,f);
!     if (!runmode && !altmod && !shiftmod && !rightclick) {
!     	t_outconnect *oc;
! 	int obj1,port1,obj2,port2;
! 	post("canvas_click_on_wire: selecting this one...");
!     	canvas_find_wire(self,linesym,&oc,&obj1,&port1,&obj2,&port2);
!     	glist_selectline(glist_getcanvas(self),oc,obj1,port1,obj2,port2);
!     }
! }
! 
! /* mouse click */
  void canvas_doclick(t_canvas *x, int xpos, int ypos, int which,
      int mod, int doit)
  {
!     int shiftmod = mod & SHIFTMOD;
!     int runmode = (mod & CTRLMOD) || !x->gl_edit;
!     int altmod = mod & ALTMOD;
!     int rightclick = mod & RIGHTCLICK;
      int x1, y1, x2, y2, clickreturned = 0;
!     t_gobj *y;
      if (!x->gl_editor) {bug("editor"); return;}
      
      canvas_undo_already_set_move = 0;
  
!     /* if keyboard was grabbed, notify grabber and cancel the grab */
      if (doit && x->gl_editor->e_grab && x->gl_editor->e_keyfn)
      {
***************
*** 992,997 ****
      	    	    else canvas_setcursor(x, CURSOR_EDITMODE_CONNECT);
      	    	}
! 		else if (doit)
! 		    goto nooutletafterall;
      	    }
      	    	/* look for an inlet */
--- 1024,1028 ----
      	    	    else canvas_setcursor(x, CURSOR_EDITMODE_CONNECT);
      	    	}
! 		else if (doit) goto nooutletafterall;
      	    }
      	    	/* look for an inlet */
***************
*** 1005,1010 ****
  			canvas_inlettip(x,ob,closest,xpos,ypos);
      	    }
! 
!     	    	/* not in an outlet; select and move */
      	    else if (doit)
      	    {
--- 1036,1040 ----
  			canvas_inlettip(x,ob,closest,xpos,ypos);
      	    }
! 	    /* not in an outlet; select and move */
      	    else if (doit)
      	    {
***************
*** 1035,1076 ****
      	return;
      }
! 
!     /* if right click doesn't hit any boxes, call rightclick
! 	routine anyway */
      if (rightclick) canvas_rightclick(x, xpos, ypos, 0);
  
- 
      /* if not an editing action, and if we didn't hit a
    	box, set cursor and return */
      if (runmode || rightclick) {canvas_setcursor(x, CURSOR_RUNMODE_NOTHING); return;}
- 
-     /* having failed to find a box, we try lines now. */
-     if (!runmode && !altmod && !shiftmod)
-     {
-     	t_linetraverser t;
-     	t_outconnect *oc;
-     	float fx = xpos, fy = ypos;
- 	t_glist *glist2 = glist_getcanvas(x);
-     	linetraverser_start(&t, glist2);
-     	while (oc = linetraverser_next(&t))
-     	{
-     	    float lx1 = t.tr_lx1, ly1 = t.tr_ly1;
- 	    float lx2 = t.tr_lx2, ly2 = t.tr_ly2;
- 	    float dlx = lx2-lx1,  dly = ly2-ly1;
-     	    float area = dlx*(fy-ly1) - dly*(fx - lx1);
-     	    float dsquare = dlx*dlx + dly*dly;
-     	    if (area * area >= 50 * dsquare) continue;
-     	    if (dlx*(fx-lx1) + dly*(fy-ly1) < 0) continue;
-     	    if (dlx*(lx2-fx) + dly*(ly2-fy) < 0) continue;
-     	    if (doit)
-     	    {
- 	    	glist_selectline(glist2, oc, 
- 		    canvas_getindex(glist2, &t.tr_ob->ob_g), t.tr_outno,
- 		    canvas_getindex(glist2, &t.tr_ob2->ob_g), t.tr_inno);
-     	    }
-     	    canvas_setcursor(x, CURSOR_EDITMODE_DISCONNECT);
-     	    return;
-     	}
-     }
      canvas_setcursor(x, CURSOR_EDITMODE_NOTHING);
      if (doit)
--- 1065,1074 ----
      	return;
      }
!     /* if right click doesn't hit any boxes, call rightclick routine anyway */
      if (rightclick) canvas_rightclick(x, xpos, ypos, 0);
  
      /* if not an editing action, and if we didn't hit a
    	box, set cursor and return */
      if (runmode || rightclick) {canvas_setcursor(x, CURSOR_RUNMODE_NOTHING); return;}
      canvas_setcursor(x, CURSOR_EDITMODE_NOTHING);
      if (doit)

Index: u_main.tk
===================================================================
RCS file: /cvsroot/pure-data/pd/src/u_main.tk,v
retrieving revision 1.1.1.4.2.7.4.27
retrieving revision 1.1.1.4.2.7.4.28
diff -C2 -d -r1.1.1.4.2.7.4.27 -r1.1.1.4.2.7.4.28
*** u_main.tk	30 Mar 2004 01:35:09 -0000	1.1.1.4.2.7.4.27
--- u_main.tk	30 Mar 2004 04:57:55 -0000	1.1.1.4.2.7.4.28
***************
*** 765,776 ****
  }
  
! proc pdtk_canvas_click {name x y b f} {
!     pd [canvastosym $name] mouse [$name canvasx $x] [$name canvasy $y] $b $f \;
!     set tags [$name gettags [lindex [$name find overlapping $x $y $x $y] end]]
!     puts stderr "click $name $x $y $b $f : $tags "
!     if {![regexp {^([a-f0-9]{7})} $tags tag]} {return}
!     global _
!     if {[info exists _($tag:class)]} {set class $_($tag:class)} {set class unknown}
!     puts stderr " -> $tag ($class)"
  }
  
--- 765,785 ----
  }
  
! proc pdtk_canvas_click {canvas x y b f} {
!     pd [canvastosym $canvas] mouse [$canvas canvasx $x] [$canvas canvasy $y] $b $f \;
!     set stack [$canvas find overlapping [expr $x-2] [expr $y-2] [expr $x+2] [expr $y+2]]
!     set tags [$canvas gettags [lindex $stack end]]
!     puts stderr "(click) $canvas $x $y $b $f : $tags "
!     if {[regexp {^([a-f0-9]{7})} $tags tag]} {
! 	    global _
! 	    if {[info exists _($tag:class)]} {set class $_($tag:class)} {set class unknown}
! 	    puts stderr "(.....) $tag is a \[$class\] object"
! 	    return
!     }
!     if {[regexp {^l([a-f0-9]{7})} $tags tag]} {
! 	    puts stderr "(.....) this is a wire"
! 	    pd "[canvastosym $canvas] click-on-wire $tag $x $y $b $f;"
! 	    return
!     }
!     puts stderr "(.....) nothing in particular"
  }
  

Index: g_canvas.c
===================================================================
RCS file: /cvsroot/pure-data/pd/src/g_canvas.c,v
retrieving revision 1.1.1.4.2.7.2.7
retrieving revision 1.1.1.4.2.7.2.8
diff -C2 -d -r1.1.1.4.2.7.2.7 -r1.1.1.4.2.7.2.8
*** g_canvas.c	30 Mar 2004 01:35:09 -0000	1.1.1.4.2.7.2.7
--- g_canvas.c	30 Mar 2004 04:57:55 -0000	1.1.1.4.2.7.2.8
***************
*** 1303,1329 ****
  /* ------------------------------- setup routine ------------------------ */
  
!     /* why are some of these "glist" and others "canvas"? */
! extern void glist_text(t_glist *x, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_obj(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_bng(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_toggle(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_vslider(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_hslider(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_vdial(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
!     /* old version... */
! extern void canvas_hdial(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_hdial(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
!     /* new version: */
! extern void canvas_hradio(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_vradio(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_vumeter(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_mycnv(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_numbox(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_msg(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_floatatom(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void canvas_symbolatom(t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! extern void glist_scalar(t_glist *canvas, t_symbol *s, int argc, t_atom *argv);
  
! void canvas_guiext(t_glist *gl, t_symbol *guiobjname, int argc, t_atom *argv);
  
  void g_graph_setup(void);
--- 1303,1329 ----
  /* ------------------------------- setup routine ------------------------ */
  
! /* why are some of these "glist" and others "canvas"? */
! #define DECL(_name) extern void _name (t_glist *gl, t_symbol *s, int argc, t_atom *argv);
! DECL(glist_text)
! DECL(canvas_obj)
! DECL(canvas_bng)
! DECL(canvas_toggle)
! DECL(canvas_vslider)
! DECL(canvas_hslider)
! DECL(canvas_vdial)
! DECL(canvas_hdial)
! DECL(canvas_hradio)
! DECL(canvas_vradio)
! DECL(canvas_vumeter)
! DECL(canvas_mycnv)
! DECL(canvas_numbox)
! DECL(canvas_msg)
! DECL(canvas_floatatom)
! DECL(canvas_symbolatom)
! DECL(glist_scalar)
! //DECL(canvas_guiext)
  
! void canvas_click_on_wire(t_canvas *self, t_symbol linesym,
! t_float x, t_float y, t_float b, t_float f);
  
  void g_graph_setup(void);
***************
*** 1336,1340 ****
      	/* we prevent the user from typing "canvas" in an object box
  	by sending 0 for a creator function. */
!     canvas_class = class_new(gensym("canvas"), 0,
      	(t_method)canvas_free, sizeof(t_canvas), CLASS_NOINLET, 0);
  	    /* here is the real creator function, invoked in patch files
--- 1336,1340 ----
      	/* we prevent the user from typing "canvas" in an object box
  	by sending 0 for a creator function. */
!     t_class *c = canvas_class = class_new(gensym("canvas"), 0,
      	(t_method)canvas_free, sizeof(t_canvas), CLASS_NOINLET, 0);
  	    /* here is the real creator function, invoked in patch files
***************
*** 1343,1347 ****
      class_addmethod(pd_canvasmaker, (t_method)canvas_new, gensym("canvas"),
      	A_GIMME, 0);
! #define DEF(_f_,_s_) class_addmethod(canvas_class, (t_method)_f_, gensym(_s_), A_GIMME, 0);
      DEF(canvas_restore,"restore");
      DEF(canvas_coords,"coords");
--- 1343,1347 ----
      class_addmethod(pd_canvasmaker, (t_method)canvas_new, gensym("canvas"),
      	A_GIMME, 0);
! #define DEF(_f_,_s_) class_addmethod(c, (t_method)_f_, gensym(_s_), A_GIMME, 0);
      DEF(canvas_restore,"restore");
      DEF(canvas_coords,"coords");
***************
*** 1365,1390 ****
      DEF(canvas_mycnv,"mycnv");
      DEF(canvas_numbox,"numbox");
!     DEF(canvas_guiext,"guiext");
      
  /* ------------------------ gui stuff --------------------------- */
!     class_addmethod(canvas_class, (t_method)canvas_pop, gensym("pop"),
!     	A_DEFFLOAT, A_NULL);
!     class_addmethod(canvas_class, (t_method)canvas_loadbang,
!     	gensym("loadbang"), A_NULL);
!     class_addmethod(canvas_class, (t_method)canvas_relocate,
!     	gensym("relocate"), A_SYMBOL, A_SYMBOL, A_NULL);
!     class_addmethod(canvas_class, (t_method)canvas_vis,
!     	gensym("vis"), A_FLOAT, A_NULL);
!     class_addmethod(canvas_class, (t_method)glist_menu_open,
!     	gensym("menu-open"), A_NULL);
!     class_addmethod(canvas_class, (t_method)canvas_map,
!     	gensym("map"), A_FLOAT, A_NULL);
! /*    class_addmethod(canvas_class, (t_method)canvas_redraw,
!     	gensym("redraw"), A_NULL);*/
      class_setpropertiesfn(canvas_class, graph_properties);
  
  /* ---------------------- list handling ------------------------ */
!     class_addmethod(canvas_class, (t_method)glist_clear, gensym("clear"),
!     	A_NULL);
  
  /* ----- subcanvases, which you get by typing "pd" in a box ---- */
--- 1365,1384 ----
      DEF(canvas_mycnv,"mycnv");
      DEF(canvas_numbox,"numbox");
! //  DEF(canvas_guiext,"guiext");
      
  /* ------------------------ gui stuff --------------------------- */
!     class_addmethod(c, (t_method)canvas_click_on_wire, gensym("click-on-wire"),
! 	A_SYMBOL, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_NULL);
!     class_addmethod(c, (t_method)canvas_pop, gensym("pop"), A_DEFFLOAT, A_NULL);
!     class_addmethod(c, (t_method)canvas_loadbang, gensym("loadbang"), A_NULL);
!     class_addmethod(c, (t_method)canvas_relocate, gensym("relocate"), A_SYMBOL, A_SYMBOL, A_NULL);
!     class_addmethod(c, (t_method)canvas_vis, gensym("vis"), A_FLOAT, A_NULL);
!     class_addmethod(c, (t_method)glist_menu_open, gensym("menu-open"), A_NULL);
!     class_addmethod(c, (t_method)canvas_map, gensym("map"), A_FLOAT, A_NULL);
! /*  class_addmethod(c, (t_method)canvas_redraw, gensym("redraw"), A_NULL);*/
      class_setpropertiesfn(canvas_class, graph_properties);
  
  /* ---------------------- list handling ------------------------ */
!     class_addmethod(canvas_class, (t_method)glist_clear, gensym("clear"), A_NULL);
  
  /* ----- subcanvases, which you get by typing "pd" in a box ---- */
***************
*** 1392,1405 ****
      class_addcreator((t_newmethod)subcanvas_new, gensym("page"),  A_DEFSYMBOL, 0);
  
!     class_addmethod(canvas_class, (t_method)canvas_click,
      	gensym("click"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
!     class_addmethod(canvas_class, (t_method)canvas_dsp, gensym("dsp"), 0);
!     class_addmethod(canvas_class, (t_method)canvas_rename_method,
!     	gensym("rename"), A_GIMME, 0);
  
  /*---------------------------- tables -- GG ------------------- */
  
!     class_addcreator((t_newmethod)table_new, gensym("table"),
! 	A_DEFSYM, A_DEFFLOAT, 0);
  
  /* -------------- setups from other files for canvas_class ---------------- */
--- 1386,1397 ----
      class_addcreator((t_newmethod)subcanvas_new, gensym("page"),  A_DEFSYMBOL, 0);
  
!     class_addmethod(c, (t_method)canvas_click,
      	gensym("click"), A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, A_FLOAT, 0);
!     class_addmethod(c, (t_method)canvas_dsp, gensym("dsp"), 0);
!     class_addmethod(c, (t_method)canvas_rename_method, gensym("rename"), A_GIMME, 0);
  
  /*---------------------------- tables -- GG ------------------- */
  
!     class_addcreator((t_newmethod)table_new, gensym("table"), A_DEFSYM, A_DEFFLOAT, 0);
  
  /* -------------- setups from other files for canvas_class ---------------- */





More information about the Pd-cvs mailing list