diff --git a/doc/xschem_man/commands.html b/doc/xschem_man/commands.html
index 6df1e7aa..f22487cd 100644
--- a/doc/xschem_man/commands.html
+++ b/doc/xschem_man/commands.html
@@ -167,6 +167,7 @@ alt 'l' add lab_pin.sym to schematic
ctrl+shift 'o' Load most recent schematic
ctrl 'o' Load schematic
- 'm' Move selected obj.
+shift 'M' Move selected obj, insert wire when separating touching instance pins.
shift 'N' Top level only netlist
- 'n' Hierarchical Netlist
ctrl 'n' Clear schematic
diff --git a/src/callback.c b/src/callback.c
index 7b101c17..26f9e288 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -2183,7 +2183,14 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key,
move_objects(START,0,0,0);
break;
}
-
+ if(key=='M' && state==ShiftMask && !(xctx->ui_state & (STARTMOVE | STARTCOPY))) /* move selection */
+ {
+ xctx->mx_double_save=xctx->mousex_snap;
+ xctx->my_double_save=xctx->mousey_snap;
+ tclsetintvar("connect_by_kissing", 2); /* 2 will be used to reset var to 0 at end of move */
+ move_objects(START,0,0,0);
+ break;
+ }
if(key=='c' && state==0 && /* duplicate selection */
!(xctx->ui_state & (STARTMOVE | STARTCOPY)))
{
diff --git a/src/check.c b/src/check.c
index f4472ec1..d41b0bfc 100644
--- a/src/check.c
+++ b/src/check.c
@@ -394,7 +394,7 @@ static int touches_inst_pin(double x, double y, int inst)
}
}
}
- dbg(0, "touches_inst_pin(): %g %g : touches =%d on inst %d\n", x, y, touches, inst);
+ dbg(1, "touches_inst_pin(): %g %g : touches =%d on inst %d\n", x, y, touches, inst);
return touches;
}
@@ -440,7 +440,7 @@ void break_wires_at_pins(int remove)
xctx->wire[xctx->wires].end2 = 0;
xctx->wire[xctx->wires].x2=x0;
xctx->wire[xctx->wires].y2=y0;
- xctx->wire[xctx->wires].sel=0;
+ xctx->wire[xctx->wires].sel=SELECTED;
xctx->wire[xctx->wires].prop_ptr=NULL;
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr);
if(!strcmp(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0), "true"))
@@ -456,7 +456,7 @@ void break_wires_at_pins(int remove)
xctx->need_reb_sel_arr=1;
xctx->wires++;
} else {
- dbg(0, "break_wires_at_pins(): skipping wire creation on wire %d, end1=%d\n",
+ dbg(1, "break_wires_at_pins(): skipping wire creation on wire %d, end1=%d\n",
i, xctx->wire[xctx->wires].end1);
deleted_wire = 1;
}
@@ -471,7 +471,7 @@ void break_wires_at_pins(int remove)
/* mark for deletion only if no other nets attached */
xctx->wire[i].sel = SELECTED4; /* use a special flag to later delete these wires
* only and not other seleted wires */
- dbg(0, "break_wires_at_pins(): mark wire %d for deletion: end2=%d\n", i, xctx->wire[i].end2);
+ dbg(1, "break_wires_at_pins(): mark wire %d for deletion: end2=%d\n", i, xctx->wire[i].end2);
}
}
}
@@ -521,7 +521,7 @@ void break_wires_at_pins(int remove)
xctx->wire[xctx->wires].y1=xctx->wire[i].y1;
xctx->wire[xctx->wires].x2=x0;
xctx->wire[xctx->wires].y2=y0;
- xctx->wire[xctx->wires].sel=0;
+ xctx->wire[xctx->wires].sel=SELECTED;
xctx->wire[xctx->wires].prop_ptr=NULL;
my_strdup(_ALLOC_ID_, &xctx->wire[xctx->wires].prop_ptr, xctx->wire[i].prop_ptr);
if(!strcmp(get_tok_value(xctx->wire[xctx->wires].prop_ptr,"bus",0), "true"))
diff --git a/src/keys.help b/src/keys.help
index d66afa57..b412ca13 100644
--- a/src/keys.help
+++ b/src/keys.help
@@ -127,6 +127,7 @@ alt 'l' add lab_pin.sym to schematic
ctrl+shift 'o' Load most recent schematic
ctrl 'o' Load schematic
- 'm' Move selected obj.
+shift 'M' Move selected obj, insert wire when separating touching instance pins.
shift 'N' Top level only netlist
- 'n' Hierarchical Netlist
ctrl 'n' Clear schematic
diff --git a/src/move.c b/src/move.c
index 386c51aa..191917cf 100644
--- a/src/move.c
+++ b/src/move.c
@@ -1073,7 +1073,8 @@ void move_objects(int what, int merge, double dx, double dy)
xctx->rotatelocal=0;
xctx->deltax = xctx->deltay = 0.0;
rebuild_selected_array();
- if(tclgetboolvar("connect_by_kissing")) xctx->kissing = connect_by_kissing();
+ /* if connect_by_kissing==2 it was set in callback.c ('M' command) */
+ if(tclgetintvar("connect_by_kissing")) xctx->kissing = connect_by_kissing();
else xctx->kissing = 0;
xctx->movelastsel = xctx->lastsel;
if(xctx->lastsel==1 && xctx->sel_array[0].type==ARC &&
@@ -1086,7 +1087,10 @@ void move_objects(int what, int merge, double dx, double dy)
}
if(what & ABORT) /* draw objects while moving */
{
- if(xctx->kissing) pop_undo(0, 0);
+ if(xctx->kissing) {
+ pop_undo(0, 0);
+ if(tclgetintvar("connect_by_kissing") == 2) tclsetintvar("connect_by_kissing", 0);
+ }
draw_selection(xctx->gctiled,0);
xctx->move_rot=xctx->move_flip=0;
xctx->deltax=xctx->deltay=0.;
@@ -1119,6 +1123,9 @@ void move_objects(int what, int merge, double dx, double dy)
int firsti, firstw;
int floaters = there_are_floaters();
+ if(tclgetintvar("connect_by_kissing") == 2) {
+ tclsetintvar("connect_by_kissing", 0);
+ }
if(!floaters) bbox(START, 0.0 , 0.0 , 0.0 , 0.0);
/* no undo push for MERGE ad PLACE, already done before */
if( !xctx->kissing && !(xctx->ui_state & (STARTMERGE | PLACE_SYMBOL | PLACE_TEXT)) ) {