diff --git a/doc/xschem_man/commands.html b/doc/xschem_man/commands.html
index 04ac17a2..742fb29c 100644
--- a/doc/xschem_man/commands.html
+++ b/doc/xschem_man/commands.html
@@ -182,7 +182,7 @@ ctrl 'o' Load schematic
ctrl 'm' Move selected objects, stretching wires attached to them
Alt 'm' Move selected objects, insert wires when separating touching instance pins/wires
shift 'M' Move selected objects, insert wires when separating touching instance pins/wires
- Stretch wires that land on selected instance pins.
+ctrl+shift 'M' Move selected objects, combine Shift-M and Ctrl-m
shift 'N' Top level only netlist
- 'n' Hierarchical Netlist
ctrl 'n' Clear schematic
diff --git a/src/callback.c b/src/callback.c
index 06d08e97..ae9199dc 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -72,24 +72,24 @@ static int waves_selected(int event, KeySym key, int state, int button)
void redraw_w_a_l_r_p_rubbers(void)
{
if(xctx->ui_state & STARTWIRE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTARC) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_arc(RUBBER, 0, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTLINE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTRECT) new_rect(RUBBER,xctx->mousex_snap, xctx->mousey_snap);
if(xctx->ui_state & STARTPOLYGON) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_polygon(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
}
@@ -98,9 +98,9 @@ void redraw_w_a_l_r_p_rubbers(void)
void abort_operation(void)
{
xctx->no_draw = 0;
- tcleval("set constrained_move 0" );
+ tcleval("set constr_mv 0" );
dbg(1, "abort_operation(): Escape: ui_state=%d, last_command=%d\n", xctx->ui_state, xctx->last_command);
- constrained_move=0;
+ xctx->constr_mv=0;
if(xctx->last_command && xctx->ui_state & (STARTWIRE | STARTLINE)) {
if(xctx->ui_state & STARTWIRE) new_wire(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap);
if(xctx->ui_state & STARTLINE) new_line(RUBBER|CLEAR, xctx->mousex_snap, xctx->mousey_snap);
@@ -160,14 +160,14 @@ static void start_line(double mx, double my)
{
xctx->last_command = STARTLINE;
if(xctx->ui_state & STARTLINE) {
- if(constrained_move != 2) {
+ if(xctx->constr_mv != 2) {
xctx->mx_double_save=mx;
}
- if(constrained_move != 1) {
+ if(xctx->constr_mv != 1) {
xctx->my_double_save=my;
}
- if(constrained_move == 1) my = xctx->my_double_save;
- if(constrained_move == 2) mx = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) my = xctx->my_double_save;
+ if(xctx->constr_mv == 2) mx = xctx->mx_double_save;
} else {
xctx->mx_double_save=mx;
xctx->my_double_save=my;
@@ -179,14 +179,14 @@ static void start_wire(double mx, double my)
{
xctx->last_command = STARTWIRE;
if(xctx->ui_state & STARTWIRE) {
- if(constrained_move != 2) {
+ if(xctx->constr_mv != 2) {
xctx->mx_double_save = mx;
}
- if(constrained_move != 1) {
+ if(xctx->constr_mv != 1) {
xctx->my_double_save = my;
}
- if(constrained_move == 1) my = xctx->my_double_save;
- if(constrained_move == 2) mx = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) my = xctx->my_double_save;
+ if(xctx->constr_mv == 2) mx = xctx->mx_double_save;
} else {
xctx->mx_double_save=mx;
xctx->my_double_save=my;
@@ -1109,7 +1109,7 @@ void draw_crosshair(int del)
}
/* complete the STARTWIRE, STARTRECT, STARTZOOM, STARTCOPY ... operations */
-static int end_place_move_copy_zoom(int constrained_move)
+static int end_place_move_copy_zoom()
{
if(xctx->ui_state & STARTZOOM) {
zoom_rectangle(END);
@@ -1117,21 +1117,21 @@ static int end_place_move_copy_zoom(int constrained_move)
}
else if(xctx->ui_state & STARTWIRE) {
if(tclgetboolvar("persistent_command")) {
- if(constrained_move != 2) {
+ if(xctx->constr_mv != 2) {
xctx->mx_double_save=xctx->mousex_snap;
}
- if(constrained_move != 1) {
+ if(xctx->constr_mv != 1) {
xctx->my_double_save=xctx->mousey_snap;
}
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(PLACE, xctx->mousex_snap, xctx->mousey_snap);
} else {
new_wire(PLACE|END, xctx->mousex_snap, xctx->mousey_snap);
}
- constrained_move=0;
- tcleval("set constrained_move 0" );
+ xctx->constr_mv=0;
+ tcleval("set constr_mv 0" );
return 1;
}
else if(xctx->ui_state & STARTARC) {
@@ -1140,20 +1140,20 @@ static int end_place_move_copy_zoom(int constrained_move)
}
else if(xctx->ui_state & STARTLINE) {
if(tclgetboolvar("persistent_command")) {
- if(constrained_move != 2) {
+ if(xctx->constr_mv != 2) {
xctx->mx_double_save=xctx->mousex_snap;
}
- if(constrained_move == 1) {
+ if(xctx->constr_mv == 1) {
xctx->my_double_save=xctx->mousey_snap;
}
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(PLACE, xctx->mousex_snap, xctx->mousey_snap);
} else {
new_line(PLACE|END, xctx->mousex_snap, xctx->mousey_snap);
}
- constrained_move=0;
- tcleval("set constrained_move 0" );
+ xctx->constr_mv=0;
+ tcleval("set constr_mv 0" );
return 1;
}
else if(xctx->ui_state & STARTRECT) {
@@ -1161,26 +1161,26 @@ static int end_place_move_copy_zoom(int constrained_move)
return 1;
}
else if(xctx->ui_state & STARTPOLYGON) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_polygon(ADD, xctx->mousex_snap, xctx->mousey_snap);
xctx->mx_double_save=xctx->mousex_snap;
xctx->my_double_save=xctx->mousey_snap;
- constrained_move=0;
- tcleval("set constrained_move 0" );
+ xctx->constr_mv=0;
+ tcleval("set constr_mv 0" );
return 1;
}
else if(xctx->ui_state & STARTMOVE) {
move_objects(END,0,0,0);
xctx->ui_state &=~START_SYMPIN;
- constrained_move=0;
- tcleval("set constrained_move 0" );
+ xctx->constr_mv=0;
+ tcleval("set constr_mv 0" );
return 1;
}
else if(xctx->ui_state & STARTCOPY) {
copy_objects(END);
- constrained_move=0;
- tcleval("set constrained_move 0" );
+ xctx->constr_mv=0;
+ tcleval("set constr_mv 0" );
return 1;
}
return 0;
@@ -1526,16 +1526,16 @@ static void context_menu_action(double mx, double my)
prev_state = xctx->ui_state;
start_wire(mx, my);
if(prev_state == STARTWIRE) {
- tcleval("set constrained_move 0" );
- constrained_move=0;
+ tcleval("set constr_mv 0" );
+ xctx->constr_mv=0;
}
break;
case 3:
prev_state = xctx->ui_state;
start_line(mx, my);
if(prev_state == STARTLINE) {
- tcleval("set constrained_move 0" );
- constrained_move=0;
+ tcleval("set constr_mv 0" );
+ xctx->constr_mv=0;
}
break;
case 4:
@@ -1950,13 +1950,13 @@ int rstate; /* (reduced state, without ShiftMask) */
}
}
if(xctx->ui_state & STARTMOVE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
move_objects(RUBBER,0,0,0);
}
if(xctx->ui_state & STARTCOPY) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
copy_objects(RUBBER);
}
@@ -2123,21 +2123,21 @@ int rstate; /* (reduced state, without ShiftMask) */
}
if(key == 'h' && rstate == 0) {
/* horizontally constrained drag 20171023 */
- if ( constrained_move == 1 ) {
- tcleval("set constrained_move 0" );
- constrained_move = 0;
+ if ( xctx->constr_mv == 1 ) {
+ tcleval("set constr_mv 0" );
+ xctx->constr_mv = 0;
} else {
- tcleval("set constrained_move 1" );
- constrained_move = 1;
+ tcleval("set constr_mv 1" );
+ xctx->constr_mv = 1;
}
if(xctx->ui_state & STARTWIRE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTLINE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
break;
@@ -2152,21 +2152,21 @@ int rstate; /* (reduced state, without ShiftMask) */
}
if(key == 'v' && rstate==0) {
/* vertically constrained drag 20171023 */
- if ( constrained_move == 2 ) {
- tcleval("set constrained_move 0" );
- constrained_move = 0;
+ if ( xctx->constr_mv == 2 ) {
+ tcleval("set constr_mv 0" );
+ xctx->constr_mv = 0;
} else {
- tcleval("set constrained_move 2" );
- constrained_move = 2;
+ tcleval("set constr_mv 2" );
+ xctx->constr_mv = 2;
}
if(xctx->ui_state & STARTWIRE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_wire(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
if(xctx->ui_state & STARTLINE) {
- if(constrained_move == 1) xctx->mousey_snap = xctx->my_double_save;
- if(constrained_move == 2) xctx->mousex_snap = xctx->mx_double_save;
+ if(xctx->constr_mv == 1) xctx->mousey_snap = xctx->my_double_save;
+ if(xctx->constr_mv == 2) xctx->mousex_snap = xctx->mx_double_save;
new_line(RUBBER, xctx->mousex_snap, xctx->mousey_snap);
}
break;
@@ -2262,8 +2262,8 @@ int rstate; /* (reduced state, without ShiftMask) */
find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y);
new_wire(RUBBER, x, y);
new_wire(PLACE|END, x, y);
- constrained_move=0;
- tcleval("set constrained_move 0" );
+ xctx->constr_mv=0;
+ tcleval("set constr_mv 0" );
}
break;
}
@@ -2273,8 +2273,8 @@ int rstate; /* (reduced state, without ShiftMask) */
if(xctx->semaphore >= 2) break;
start_wire(xctx->mousex_snap, xctx->mousey_snap);
if(prev_state == STARTWIRE) {
- tcleval("set constrained_move 0" );
- constrained_move=0;
+ tcleval("set constr_mv 0" );
+ xctx->constr_mv=0;
}
break;
}
@@ -2944,8 +2944,8 @@ int rstate; /* (reduced state, without ShiftMask) */
int prev_state = xctx->ui_state;
start_line(xctx->mousex_snap, xctx->mousey_snap);
if(prev_state == STARTLINE) {
- tcleval("set constrained_move 0" );
- constrained_move=0;
+ tcleval("set constr_mv 0" );
+ xctx->constr_mv=0;
}
break;
}
@@ -3109,6 +3109,18 @@ int rstate; /* (reduced state, without ShiftMask) */
move_objects(START,0,0,0);
break;
}
+ if(key=='M' && state == (ControlMask | ShiftMask) &&
+ !(xctx->ui_state & (STARTMOVE | STARTCOPY))) /* move selection */
+ {
+ xctx->mx_double_save=xctx->mousex_snap;
+ xctx->my_double_save=xctx->mousey_snap;
+ if(!tclgetboolvar("enable_stretch"))
+ select_attached_nets(); /* stretch nets that land on selected instance pins */
+ xctx->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' && EQUAL_MODMASK && /* duplicate selection */
!(xctx->ui_state & (STARTMOVE | STARTCOPY)))
@@ -3439,7 +3451,7 @@ int rstate; /* (reduced state, without ShiftMask) */
/* handle all object insertions started from Tools menu */
if(check_menu_start_commands(c_snap)) break;
/* complete the STARTWIRE, STARTRECT, STARTZOOM, STARTCOPY ... operations */
- if(end_place_move_copy_zoom(constrained_move)) break;
+ if(end_place_move_copy_zoom()) break;
/* Button1Press to select objects */
if( !(xctx->ui_state & STARTSELECT) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) {
@@ -3478,7 +3490,6 @@ int rstate; /* (reduced state, without ShiftMask) */
if(add_wire_from_inst_pin(&sel, xctx->mousex_snap, xctx->mousey_snap)) break;
}
-
if(xctx->intuitive_interface && !already_selected && no_shift_no_ctrl ) unselect_all(1);
if(!already_selected) select_object(xctx->mousex, xctx->mousey, SELECTED, 0, &sel);
@@ -3502,10 +3513,15 @@ int rstate; /* (reduced state, without ShiftMask) */
xctx->push_undo();
xctx->drag_elements = 1;
- if( state == ControlMask && !tclgetboolvar("enable_stretch")) {
+ if( state & ControlMask && !tclgetboolvar("enable_stretch")) {
select_attached_nets(); /* stretch nets that land on selected instance pins */
}
- if(state == ShiftMask) copy_objects(START);
+
+ if(state == (ShiftMask | ControlMask) ) {
+ xctx->connect_by_kissing = 2; /* 2 will be used to reset var to 0 at end of move */
+ move_objects(START,0,0,0);
+ }
+ else if(state == ShiftMask) copy_objects(START);
else move_objects(START,0,0,0);
}
diff --git a/src/globals.c b/src/globals.c
index ac3c9829..0de06eb7 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -161,7 +161,6 @@ double nocairo_vert_correct=0.0;
/* compared to the nocairo xschem version. */
/* allowed values should be in the range [-4, 4] */
double cairo_vert_correct=0.0;
-int constrained_move = 0;
double cairo_font_scale=1.0; /* default: 1.0, allows to adjust font size */
double cairo_font_line_spacing = 1.0; /* value taken from xschemrc / xschem.tcl */
int debug_var=-10; /* will be set to 0 in xinit.c */
diff --git a/src/keys.help b/src/keys.help
index 3a3c5f26..01ec1c4a 100644
--- a/src/keys.help
+++ b/src/keys.help
@@ -142,7 +142,7 @@ ctrl 'o' Load schematic
ctrl 'm' Move selected objects, stretching wires attached to them
Alt 'm' Move selected objects, insert wires when separating touching instance pins/wires
shift 'M' Move selected objects, insert wires when separating touching instance pins/wires
- Stretch wires that land on selected instance pins.
+ctrl+shift 'M' Move selected objects, combine Shift-M and Ctrl-m
shift 'N' Top level only netlist
- 'n' Hierarchical Netlist
ctrl 'n' Clear schematic
diff --git a/src/scheduler.c b/src/scheduler.c
index e66295f1..d7ee49d1 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -1163,6 +1163,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
if(color_ps != 0 ) Tcl_SetResult(interp, "1",TCL_STATIC);
else Tcl_SetResult(interp, "0",TCL_STATIC);
}
+ else if(!strcmp(argv[2], "constr_mv")) { /* color postscript flag */
+ if(xctx->constr_mv != 0 ) Tcl_SetResult(interp, "1",TCL_STATIC);
+ else Tcl_SetResult(interp, "0",TCL_STATIC);
+ }
else if(!strcmp(argv[2], "current_dirname")) { /* directory name of current design */
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
Tcl_SetResult(interp, xctx->current_dirname, TCL_VOLATILE);
@@ -4595,8 +4599,8 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
else if(!strcmp(argv[2], "color_ps")) { /* set color psoscript (1 or 0) */
color_ps=atoi(argv[3]);
}
- else if(!strcmp(argv[2], "constrained_move")) { /* set constrained move (1=horiz, 2=vert, 0=none) */
- constrained_move = atoi(argv[3]);
+ else if(!strcmp(argv[2], "constr_mv")) { /* set constrained move (1=horiz, 2=vert, 0=none) */
+ xctx->constr_mv = atoi(argv[3]);
}
else if(!strcmp(argv[2], "cursor1_x")) { /* set graph cursor1 position */
xctx->graph_cursor1_x = atof_spice(argv[3]);
diff --git a/src/xinit.c b/src/xinit.c
index 97b86810..2b3facc9 100644
--- a/src/xinit.c
+++ b/src/xinit.c
@@ -505,6 +505,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path)
xctx->header_text = NULL;
xctx->rectcolor= 4; /* this is the current layer when xschem started. */
xctx->currsch = 0;
+ xctx->constr_mv = 0; /* constrained move (vertical (2) / horizontal (1) ) */
xctx->ui_state = 0;
xctx->ui_state2 = 0;
xctx->lw = 0.0;
diff --git a/src/xschem.h b/src/xschem.h
index acd100ba..94440c9a 100644
--- a/src/xschem.h
+++ b/src/xschem.h
@@ -929,6 +929,7 @@ typedef struct {
unsigned int ui_state; /* this signals that we are doing a net place,panning etc.
* used to prevent nesting of some commands */
unsigned int ui_state2; /* sub states of ui_state MENUSTART bit */
+ int constr_mv; /* constrained move (vertical (2) / horizontal (1) ) */
double mousex,mousey; /* mouse coord. */
double mousex_snap,mousey_snap; /* mouse coord. snapped to grid */
double mx_double_save, my_double_save;
diff --git a/src/xschem.tcl b/src/xschem.tcl
index 49b315d8..9b0c0348 100644
--- a/src/xschem.tcl
+++ b/src/xschem.tcl
@@ -6866,7 +6866,7 @@ set tctx::global_list {
INITIALINSTDIR INITIALLOADDIR INITIALPROPDIR INITIALTEXTDIR XSCHEM_LIBRARY_PATH
add_all_windows_drives auto_hilight autofocus_mainwindow
autotrim_wires bespice_listen_port big_grid_points bus_replacement_char cadgrid cadlayers
- cadsnap cairo_font_name change_lw color_ps tctx::colors compare_sch constrained_move
+ cadsnap cairo_font_name change_lw color_ps tctx::colors compare_sch constr_mv
copy_cell crosshair_layer custom_label_prefix custom_token dark_colors dark_colorscheme
dark_gui_colorscheme delay_flag dim_bg dim_value disable_unique_names
do_all_inst draw_crosshair
@@ -7520,12 +7520,12 @@ proc build_widgets { {topwin {} } } {
-command {xschem flip} -accelerator {Shift-F}
$topwin.menubar.edit.menu add command -label "Rotate selected objects" -state normal \
-command {xschem rotate} -accelerator {Shift-R}
- $topwin.menubar.edit.menu add radiobutton -label "Unconstrained move" -variable constrained_move \
- -selectcolor $selectcolor -background grey60 -value 0 -command {xschem set constrained_move 0}
- $topwin.menubar.edit.menu add radiobutton -label "Constrained Horizontal move" -variable constrained_move \
- -selectcolor $selectcolor -background grey60 -value 1 -accelerator H -command {xschem set constrained_move 1}
- $topwin.menubar.edit.menu add radiobutton -label "Constrained Vertical move" -variable constrained_move \
- -selectcolor $selectcolor -background grey60 -value 2 -accelerator V -command {xschem set constrained_move 2}
+ $topwin.menubar.edit.menu add radiobutton -label "Unconstrained move" -variable constr_mv \
+ -selectcolor $selectcolor -background grey60 -value 0 -command {xschem set constr_mv 0}
+ $topwin.menubar.edit.menu add radiobutton -label "Constrained Horizontal move" -variable constr_mv \
+ -selectcolor $selectcolor -background grey60 -value 1 -accelerator H -command {xschem set constr_mv 1}
+ $topwin.menubar.edit.menu add radiobutton -label "Constrained Vertical move" -variable constr_mv \
+ -selectcolor $selectcolor -background grey60 -value 2 -accelerator V -command {xschem set constr_mv 2}
$topwin.menubar.edit.menu add command -label "Push schematic" -command "xschem descend" -accelerator E
toolbar_add EditPushSch "xschem descend" "Push schematic" $topwin
$topwin.menubar.edit.menu add command -label "Push symbol" -command "xschem descend_symbol" -accelerator I
@@ -8318,7 +8318,7 @@ set_ne draw_window 0
set_ne show_hidden_texts 0
set_ne incr_hilight 1
set_ne enable_stretch 0
-set_ne constrained_move 0
+set_ne constr_mv 0
set_ne unselect_partial_sel_wires 0
set_ne load_file_dialog_fullpath 1