From 1bee3d766f675bed2cda62cea232acc86553d6cc Mon Sep 17 00:00:00 2001 From: stefan schippers Date: Sat, 25 Jan 2025 23:41:39 +0100 Subject: [PATCH] included TheSUPERCD commit 260beff, if (full and only full) crosshair is displayed use snap mouse coordinates since mouse pointer is turned off; fixed an issue when selecting ridicolously small rectangles in find_closest_box() --- src/callback.c | 10 ++++++++-- src/findnet.c | 7 ++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/callback.c b/src/callback.c index e21cfb07..498d9a95 100644 --- a/src/callback.c +++ b/src/callback.c @@ -2252,6 +2252,7 @@ int callback(const char *winpath, int event, int mx, int my, KeySym key, XKeyboardState kbdstate; #endif int draw_xhair = tclgetboolvar("draw_crosshair"); +int crosshair_size = tclgetintvar("crosshair_size"); int infix_interface = tclgetboolvar("infix_interface"); int rstate; /* (reduced state, without ShiftMask) */ @@ -2373,7 +2374,7 @@ int rstate; /* (reduced state, without ShiftMask) */ dbg(2, "callback(): Enter event, ui_state=%d\n", xctx->ui_state); xctx->mouse_inside = 1; if(draw_xhair) { - if(tclgetintvar("crosshair_size") == 0) { + if(crosshair_size == 0) { tclvareval(xctx->top_path, ".drw configure -cursor none" , NULL); } } else @@ -4140,7 +4141,12 @@ int rstate; /* (reduced state, without ShiftMask) */ } if(!xctx->intuitive_interface && no_shift_no_ctrl ) unselect_all(1); - sel = find_closest_obj(xctx->mousex, xctx->mousey, 0); + + if(draw_xhair && crosshair_size == 0) { + sel = find_closest_obj(xctx->mousex_snap, xctx->mousey_snap, 0); + } else { + sel = find_closest_obj(xctx->mousex, xctx->mousey, 0); + } switch(sel.type) { case WIRE: if(xctx->wire[sel.n].sel) already_selected = 1; break; diff --git a/src/findnet.c b/src/findnet.c index cc9801e1..8f7cda41 100644 --- a/src/findnet.c +++ b/src/findnet.c @@ -375,8 +375,12 @@ static void find_closest_box(double mx ,double my, int override_lock) { double tmp; double ds = xctx->cadhalfdotsize; - int i, c, r=-1, col = 0; + + /* correction for very small boxes */ + double min = MINOR(xctx->rect[c][i].x2 - xctx->rect[c][i].x1, + xctx->rect[c][i].y2 - xctx->rect[c][i].y1); + ds = (ds * 8 <= min ) ? ds : min / 8; for(c=0;cenable_layer[c]) continue; @@ -471,6 +475,7 @@ Selected find_closest_obj(double mx, double my, int override_lock) distance = DBL_MAX; find_closest_line(mx, my); find_closest_polygon(mx, my); + dbg(0, "find_closest_obj(): mx=%g, my=%g\n", mx, my); /* dbg(1, "1 find_closest_obj(): sel.n=%d, sel.col=%d, sel.type=%d\n", sel.n, sel.col, sel.type); */ find_closest_box(mx, my, override_lock); find_closest_arc(mx, my);