diff --git a/src/callback.c b/src/callback.c index 52801657..a0ba080a 100644 --- a/src/callback.c +++ b/src/callback.c @@ -1260,7 +1260,7 @@ int rstate; /* (reduced state, without ShiftMask) */ } redraw_w_a_l_r_p_rubbers(); - /* start of a mouse area select */ + /* start of a mouse area select. No shift pressed */ if(!(xctx->ui_state & STARTPOLYGON) && (state&Button1Mask) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTPAN) && !(SET_MODMASK) && !(state & ShiftMask) && !(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT))) @@ -1280,6 +1280,7 @@ int rstate; /* (reduced state, without ShiftMask) */ } } } + /* Unselect by area */ if((state & Button1Mask) && (SET_MODMASK) && !(state & ShiftMask) && !(xctx->ui_state & STARTPAN) && !(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT))) { /* unselect area */ @@ -1287,6 +1288,7 @@ int rstate; /* (reduced state, without ShiftMask) */ select_rect(START,0); } } + /* Select by area. Shift pressed */ else if((state&Button1Mask) && (state & ShiftMask) && !(xctx->ui_state & (PLACE_SYMBOL | PLACE_TEXT)) && !(xctx->ui_state & STARTPAN) ) { @@ -1296,8 +1298,10 @@ int rstate; /* (reduced state, without ShiftMask) */ } if(abs(mx-xctx->mx_save) > 8 || abs(my-xctx->my_save) > 8 ) { /* set reasonable threshold before unsel */ - select_object(X_TO_XSCHEM(xctx->mx_save), - Y_TO_XSCHEM(xctx->my_save), 0, 0); /* remove near obj if dragging */ + if(!xctx->already_selected) { + select_object(X_TO_XSCHEM(xctx->mx_save), + Y_TO_XSCHEM(xctx->my_save), 0, 0); /* remove near obj if dragging */ + } rebuild_selected_array(); } } @@ -2714,17 +2718,12 @@ int rstate; /* (reduced state, without ShiftMask) */ xctx->yorigin-=-CADMOVESTEP*xctx->zoom/2.; draw(); } + /* Alt - Button1 click to unselect */ else if(button==Button1 && (SET_MODMASK) ) { xctx->last_command = 0; xctx->mx_save = mx; xctx->my_save = my; xctx->mx_double_save=xctx->mousex_snap; xctx->my_double_save=xctx->mousey_snap; - - /* useless code ? 20200905 */ - /* if(xctx->semaphore<2) { - rebuild_selected_array(); - } */ - select_object(xctx->mousex, xctx->mousey, 0, 0); rebuild_selected_array(); /* sets or clears xctx->ui_state SELECTION flag */ } @@ -2902,6 +2901,7 @@ int rstate; /* (reduced state, without ShiftMask) */ tcleval("set constrained_move 0" ); break; } + /* Button1Press to select objects */ if( !(xctx->ui_state & STARTSELECT) && !(xctx->ui_state & STARTWIRE) && !(xctx->ui_state & STARTLINE) ) { Selected sel; int prev_last_sel = xctx->lastsel; diff --git a/src/select.c b/src/select.c index 41f49e97..e051b3da 100644 --- a/src/select.c +++ b/src/select.c @@ -1224,31 +1224,38 @@ void select_line(int c, int i, unsigned short select_mode, int fast ) Selected select_object(double mx,double my, unsigned short select_mode, int override_lock) { Selected sel; + xctx->already_selected = 0; sel = find_closest_obj(mx, my, override_lock); - dbg(1, "select_object(): sel.n=%d, sel.col=%d, sel.type=%d\n", sel.n, sel.col, sel.type); switch(sel.type) { case WIRE: + if(xctx->wire[sel.n].sel) xctx->already_selected = 1; select_wire(sel.n, select_mode, 0); break; case xTEXT: + if(xctx->text[sel.n].sel) xctx->already_selected = 1; select_text(sel.n, select_mode, 0); break; case LINE: + if(xctx->line[sel.col][sel.n].sel) xctx->already_selected = 1; select_line(sel.col, sel.n, select_mode,0); break; case POLYGON: + if(xctx->poly[sel.col][sel.n].sel) xctx->already_selected = 1; select_polygon(sel.col, sel.n, select_mode,0); break; case xRECT: + if(xctx->rect[sel.col][sel.n].sel) xctx->already_selected = 1; select_box(sel.col,sel.n, select_mode,0, override_lock); break; case ARC: + if(xctx->arc[sel.col][sel.n].sel) xctx->already_selected = 1; select_arc(sel.col,sel.n, select_mode,0); break; case ELEMENT: + if(xctx->inst[sel.n].sel) xctx->already_selected = 1; select_element(sel.n,select_mode,0, override_lock); break; default: diff --git a/src/xinit.c b/src/xinit.c index 3e816bf8..6f888d2b 100644 --- a/src/xinit.c +++ b/src/xinit.c @@ -613,6 +613,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path) xctx->only_probes = 0; xctx->menu_removed = 0; /* fullscreen previous setting */ 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->save_netlist_type = 0; xctx->some_nets_added = 0; diff --git a/src/xschem.h b/src/xschem.h index 9b9fe849..0be7c974 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -972,6 +972,7 @@ typedef struct { int *node_mult; int node_mult_size; /* callback.c */ + int already_selected; /* when clicking on an object that is already selected this will be 1 */ int mx_save, my_save, last_command; char sel_or_clip[PATH_MAX]; int onetime;