diff --git a/src/callback.c b/src/callback.c index a33d1c49..6e7ad662 100644 --- a/src/callback.c +++ b/src/callback.c @@ -2119,22 +2119,23 @@ int rstate; /* (reduced state, without ShiftMask) */ * Do not start an area select if user is dragging a polygon/bezier point */ if(!(xctx->ui_state & STARTPOLYGON) && (state&Button1Mask) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTPAN) && !(SET_MODMASK) && !xctx->shape_point_selected && - !xctx->drag_elements && !(state & ShiftMask) && !(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT))) { - if(mx != xctx->mx_save || my != xctx->my_save) { - if( !(xctx->ui_state & STARTSELECT)) { - select_rect(START,1); - xctx->onetime=1; - } - if(abs(mx-xctx->mx_save) > 8 || - abs(my-xctx->my_save) > 8 ) { /* set reasonable threshold before unsel */ - if(xctx->onetime) { - unselect_all(1); /* 20171026 avoid multiple calls of unselect_all() */ - xctx->onetime=0; + xctx->mouse_moved = 1; + if(!xctx->drag_elements) { + if( !(xctx->ui_state & STARTSELECT)) { + select_rect(START,1); + xctx->onetime=1; + } + if(abs(mx-xctx->mx_save) > 8 || + abs(my-xctx->my_save) > 8 ) { /* set reasonable threshold before unsel */ + if(xctx->onetime) { + unselect_all(1); /* 20171026 avoid multiple calls of unselect_all() */ + xctx->onetime=0; + } + xctx->ui_state|=STARTSELECT; /* set it again cause unselect_all(1) clears it... */ } - xctx->ui_state|=STARTSELECT; /* set it again cause unselect_all(1) clears it... */ } } } @@ -3573,16 +3574,17 @@ int rstate; /* (reduced state, without ShiftMask) */ pan(START, mx, my); xctx->ui_state |= STARTPAN; } - else if(xctx->semaphore >= 2) { /* button1 click to select another instance while edit prop dialog open */ + /* button1 click to select another instance while edit prop dialog open */ + else if(button==Button1 && xctx->semaphore >= 2) { if(tcleval("winfo exists .dialog.textinput")[0] == '1') { /* proc text_line */ tcleval(".dialog.f1.b1 invoke"); break; } else if(tcleval("winfo exists .dialog.txt")[0] == '1') { /* proc enter_text */ tcleval(".dialog.buttons.ok invoke"); break; - } else if(button==Button1 && state==0 && tclgetvar("edit_symbol_prop_new_sel")[0]) { + } else if(state==0 && tclgetvar("edit_symbol_prop_new_sel")[0]) { tcleval("set edit_symbol_prop_new_sel 1; .dialog.f1.b1 invoke"); /* invoke 'OK' of edit prop dialog */ - } else if(button==Button1 && (state & ShiftMask) && tclgetvar("edit_symbol_prop_new_sel")[0]) { + } else if((state & ShiftMask) && tclgetvar("edit_symbol_prop_new_sel")[0]) { select_object(xctx->mousex, xctx->mousey, SELECTED, 0, NULL); tclsetvar("preserve_unchanged_attrs", "1"); rebuild_selected_array(); @@ -3590,6 +3592,8 @@ int rstate; /* (reduced state, without ShiftMask) */ } else if(button==Button1) /* MOD button is not pressed here. Processed above */ { + xctx->onetime = 0; + xctx->mouse_moved = 0; xctx->drag_elements = 0; if(tclgetboolvar("persistent_command") && xctx->last_command) { if(xctx->last_command == STARTLINE) start_line(xctx->mousex_snap, xctx->mousey_snap); @@ -3709,8 +3713,7 @@ int rstate; /* (reduced state, without ShiftMask) */ /* launcher, intuitive_interface, only if no movement has been done */ else if(xctx->intuitive_interface && state == (Button1Mask | ControlMask) && - !xctx->shape_point_selected && (xctx->ui_state & STARTMOVE) && - xctx->deltax == 0 && xctx->deltay == 0) { + !xctx->shape_point_selected && (xctx->ui_state & STARTMOVE) && xctx->mouse_moved == 0) { int savesem = xctx->semaphore; move_objects(ABORT, 0, 0.0, 0.0); unselect_all(1); diff --git a/src/xinit.c b/src/xinit.c index 1058d531..a9fad1b3 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -656,6 +656,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path) xctx->save_lw = 0.0; /* used to save linewidth when selecting 'only_probes' view */ xctx->already_selected = 0; xctx->onetime = 0; /* callback() static var */ + xctx->mouse_moved = 0; /* set to 0 on button1 press, set o 1 on mouse move */ xctx->max_globals = 0; xctx->size_globals = 0; xctx->globals = NULL; diff --git a/src/xschem.h b/src/xschem.h index 13bf4763..8d7bae63 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -1013,6 +1013,7 @@ typedef struct { int already_selected; /* when clicking on an object that is already selected this will be 1 */ int mx_save, my_save, last_command; int onetime; + int mouse_moved; /* set to 0 on button1 press, set to 1 if mouse moved */ /* move.c */ double rx1, rx2, ry1, ry2; short move_rot;