From 6d53ed426b076478725c9a614311d25c490c6dc4 Mon Sep 17 00:00:00 2001
From: Ivica Ico Bukvic <ico@vt.edu>
Date: Tue, 9 Sep 2014 15:26:42 -0400
Subject: [PATCH] *refined displacement and positioning of objects on new
 canvases

---
 pd/src/g_canvas.c |  2 ++
 pd/src/g_editor.c | 10 +++++-----
 pd/src/g_text.c   | 27 +++++++++++++++++++++++----
 3 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/pd/src/g_canvas.c b/pd/src/g_canvas.c
index 48414eeab..31feaba78 100644
--- a/pd/src/g_canvas.c
+++ b/pd/src/g_canvas.c
@@ -351,6 +351,7 @@ void glist_init(t_glist *x)
 
 void canvasgop__clickhook(t_scalehandle *sh, int newstate);
 void canvasgop__motionhook(t_scalehandle *sh,t_floatarg f1, t_floatarg f2);
+extern void glist_setlastxy(t_glist *gl, int xval, int yval);
 
     /* make a new glist.  It will either be a "root" canvas or else
     it appears as a "text" object in another window (canvas_getcurrent() 
@@ -456,6 +457,7 @@ t_canvas *canvas_new(void *dummy, t_symbol *sel, int argc, t_atom *argv)
     x->x_mhandle = scalehandle_new((t_object *)x,x,0,canvasgop__clickhook,canvasgop__motionhook);
 
     x->u_queue = canvas_undo_init(x);
+    glist_setlastxy(x, 20, 20);
     return(x);
 }
 
diff --git a/pd/src/g_editor.c b/pd/src/g_editor.c
index d2c8a1690..759a69018 100644
--- a/pd/src/g_editor.c
+++ b/pd/src/g_editor.c
@@ -72,7 +72,7 @@ int canvas_apply_restore_original_position(t_canvas *x, int orig_pos);
 extern void canvas_draw_gop_resize_hooks(t_canvas *x);
 static void canvas_font(t_canvas *x, t_floatarg font, t_floatarg oldfont,
     t_floatarg resize, t_floatarg preview);
-static void canvas_displaceselection(t_canvas *x, int dx, int dy);
+void canvas_displaceselection(t_canvas *x, int dx, int dy);
 void canvas_motion(t_canvas *x, t_floatarg xpos, t_floatarg ypos,
     t_floatarg fmod);
 /* for updating preset_node locations in case of operations that alter
@@ -98,7 +98,7 @@ int glob_ctrl = 0;
 int glob_alt = 0;
 
 static t_glist *canvas_last_glist;
-static int canvas_last_glist_x, canvas_last_glist_y, canvas_last_glist_mod;
+static int canvas_last_glist_x=20, canvas_last_glist_y=20, canvas_last_glist_mod;
 
 struct _outlet
 {
@@ -4653,7 +4653,7 @@ void canvas_mousedown_middle(t_canvas *x, t_floatarg xpos, t_floatarg ypos,
 }
 
     /* displace the selection by (dx, dy) pixels */
-static void canvas_displaceselection(t_canvas *x, int dx, int dy)
+void canvas_displaceselection(t_canvas *x, int dx, int dy)
 {
     //fprintf(stderr,"canvas_displaceselection %d %d\n", dx, dy);
     t_selection *y;
@@ -5110,7 +5110,7 @@ void canvas_startmotion(t_canvas *x)
     int xval, yval;
     if (!x->gl_editor) return;
     glist_getnextxy(x, &xval, &yval);
-    if (xval == 0 && yval == 0) return;
+    //if (xval == 0 && yval == 0) return;
     x->gl_editor->e_onmotion = MA_MOVE;
     x->gl_editor->e_xwas = xval;
     x->gl_editor->e_ywas = yval;
@@ -7239,7 +7239,7 @@ void glist_getnextxy(t_glist *gl, int *xpix, int *ypix)
 {
     if (canvas_last_glist == gl)
         *xpix = canvas_last_glist_x, *ypix = canvas_last_glist_y;
-    else *xpix = *ypix = 40;
+    else *xpix = *ypix = 20;
 }
 
 void glist_setlastxy(t_glist *gl, int xval, int yval)
diff --git a/pd/src/g_text.c b/pd/src/g_text.c
index 6779eff72..408588aec 100644
--- a/pd/src/g_text.c
+++ b/pd/src/g_text.c
@@ -35,6 +35,7 @@ t_widgetbehavior text_widgetbehavior;
 
 static char *invalid_fill = "$::pd_colors(dash_fill)";
 
+extern void canvas_displaceselection(t_canvas *x, int dx, int dy);
 extern void canvas_apply_setundo(t_canvas *x, t_gobj *y);
 extern void canvas_setundo(t_canvas *x, t_undofn undofn, void *buf,
     const char *name);
@@ -99,7 +100,11 @@ void glist_text(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
         if (!we_are_undoing)
             canvas_undo_add(glist_getcanvas(gl), 9, "create",
                 (void *)canvas_undo_set_create(glist_getcanvas(gl)));
-        if (connectme == 0) canvas_startmotion(glist_getcanvas(gl));
+        if (connectme == 0)
+        {
+            canvas_displaceselection(glist_getcanvas(gl), -10, -10);
+            canvas_startmotion(glist_getcanvas(gl));
+        }
     }
 }
 
@@ -341,6 +346,7 @@ void canvas_obj(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
         else if (connectme == 0)
         {
             //fprintf(stderr,"canvas_obj calls canvas_startmotion\n");
+            canvas_displaceselection(glist_getcanvas(gl), -10, -10);
             canvas_startmotion(glist_getcanvas(gl));
         }
         //canvas_setundo(glist_getcanvas(gl),
@@ -411,6 +417,7 @@ void canvas_iemguis(t_glist *gl, t_symbol *guiobjname)
         glist_noselect(gl);
 
     int connectme, xpix, ypix, indx, nobj;
+
     canvas_howputnew(gl, &connectme, &xpix, &ypix, &indx, &nobj);
 
     /* NOT NECESSARY ANY MORE: compensate for the iemgui sliders' xyoffset
@@ -437,7 +444,11 @@ void canvas_iemguis(t_glist *gl, t_symbol *guiobjname)
         canvas_connect(gl, indx, 0, nobj, 0);
     //glist_getnextxy(gl, &xpix, &ypix);
     //canvas_objtext(gl, xpix, ypix, 1, b);
-    else if (connectme == 0 ) canvas_startmotion(glist_getcanvas(gl));
+    else if (connectme == 0)
+    {
+        canvas_displaceselection(glist_getcanvas(gl), -10, -10);
+        canvas_startmotion(glist_getcanvas(gl));
+    }
     //canvas_setundo(glist_getcanvas(gl),
     //    canvas_undo_create, canvas_undo_set_create(gl), "create");
     canvas_undo_add(glist_getcanvas(gl), 9, "create",
@@ -751,7 +762,11 @@ void canvas_msg(t_glist *gl, t_symbol *s, int argc, t_atom *argv)
         gobj_activate(&x->m_text.te_g, gl, 1);
         if (connectme == 1)
             canvas_connect(gl, indx, 0, nobj, 0);
-        else if (connectme == 0) canvas_startmotion(glist_getcanvas(gl));
+        else if (connectme == 0)
+        {
+            canvas_displaceselection(glist_getcanvas(gl), -10, -10);
+            canvas_startmotion(glist_getcanvas(gl));
+        }
         //canvas_setundo(glist_getcanvas(gl),
         //    canvas_undo_create, canvas_undo_set_create(gl), "create");
         canvas_undo_add(glist_getcanvas(gl), 9, "create",
@@ -1246,7 +1261,11 @@ void canvas_atom(t_glist *gl, t_atomtype type,
         glist_select(gl, &x->a_text.te_g);
         if (connectme == 1)
             canvas_connect(gl, indx, 0, nobj, 0);
-        else if (connectme == 0) canvas_startmotion(glist_getcanvas(gl));
+        else if (connectme == 0)
+        {
+            canvas_displaceselection(glist_getcanvas(gl), -10, -10);
+            canvas_startmotion(glist_getcanvas(gl));
+        }
         //canvas_setundo(glist_getcanvas(gl),
         //    canvas_undo_create, canvas_undo_set_create(gl), "create");
         canvas_undo_add(glist_getcanvas(gl), 9, "create",
-- 
GitLab