[Bugfix - Snap Cursor]: Fully removed the bug from commit 0a0ef22. Solved by introducing breaking change in 'find_closest_net_or_symbol_pin()' function defined in 'src/xschem.h' and implemented in 'src/findnet.c'. The function now returns a boolean value indicating if the search yielded any valid results, instead of returning nothing (void).

This commit is contained in:
Chayan Deb 2025-01-24 14:40:29 +05:30
parent ea7d0d94c5
commit fefbd922d5
4 changed files with 54 additions and 15 deletions

View File

@ -1479,15 +1479,46 @@ void draw_snap_cursor(int what)
if(!xctx->mouse_inside) return;
xctx->draw_pixmap = 0;
xctx->draw_window = 1;
double prev_x = xctx->prev_snapx;
double prev_y = xctx->prev_snapy;
if(what != 2) {
if(fix_broken_tiled_fill || !_unix) {
MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], 0, 0, xctx->xrect[0].width, xctx->xrect[0].height, 0, 0);
} else {
double prev_x = xctx->prev_snapx;
double prev_y = xctx->prev_snapy;
double points_x[5] = {prev_x, prev_x+snapcursor_size, prev_x, prev_x-snapcursor_size, prev_x};
double points_y[5] = {prev_y-snapcursor_size, prev_y, prev_y+snapcursor_size, prev_y, prev_y-snapcursor_size};
drawtemppolygon(xctx->gctiled, NOW, points_x, points_y, 5, 0);
/*MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], 0, 0, xctx->xrect[0].width, xctx->xrect[0].height, 0, 0);*/
MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
(int)X_TO_SCREEN(prev_x) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size,
(int)Y_TO_SCREEN(prev_y) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size,
4 * INT_WIDTH(xctx->lw) + 4 * snapcursor_size,
4 * INT_WIDTH(xctx->lw) + 4 * snapcursor_size,
(int)X_TO_SCREEN(prev_x) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size,
(int)Y_TO_SCREEN(prev_y) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size);
MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
(int)X_TO_SCREEN(prev_x) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size,
(int)Y_TO_SCREEN(prev_y) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size,
4 * INT_WIDTH(xctx->lw) + 4 * snapcursor_size,
4 * INT_WIDTH(xctx->lw) + 4 * snapcursor_size,
(int)X_TO_SCREEN(prev_x) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size,
(int)Y_TO_SCREEN(prev_y) - 2 * INT_WIDTH(xctx->lw) - snapcursor_size);
} else {
draw_xhair_line(xctx->gctiled, snapcursor_size,
X_TO_SCREEN(prev_x),
Y_TO_SCREEN(prev_y) - snapcursor_size,
X_TO_SCREEN(prev_x) + snapcursor_size,
Y_TO_SCREEN(prev_y));
draw_xhair_line(xctx->gctiled, snapcursor_size,
X_TO_SCREEN(prev_x) + snapcursor_size,
Y_TO_SCREEN(prev_y),
X_TO_SCREEN(prev_x),
Y_TO_SCREEN(prev_y) + snapcursor_size);
draw_xhair_line(xctx->gctiled, snapcursor_size,
X_TO_SCREEN(prev_x),
Y_TO_SCREEN(prev_y) + snapcursor_size,
X_TO_SCREEN(prev_x) - snapcursor_size,
Y_TO_SCREEN(prev_y));
draw_xhair_line(xctx->gctiled, snapcursor_size,
X_TO_SCREEN(prev_x) - snapcursor_size,
Y_TO_SCREEN(prev_y),
X_TO_SCREEN(prev_x),
Y_TO_SCREEN(prev_y) - snapcursor_size);
}
}
if(what != 1) {
@ -1496,11 +1527,8 @@ void draw_snap_cursor(int what)
x = xctx->prev_snapx;
y = xctx->prev_snapy;
} else { /* Only search for nearest pin if the grid-snap-point has changed */
find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y);
xctx->closest_pin_found = find_closest_net_or_symbol_pin(xctx->mousex, xctx->mousey, &x, &y);
}
/*double points_x[5] = {x, x+snapcursor_size, x, x-snapcursor_size, x};*/
/*double points_y[5] = {y-snapcursor_size, y, y+snapcursor_size, y, y-snapcursor_size};*/
/*drawpolygon(xctx->crosshair_layer, NOW, points_x, points_y, 5, 0, 0, 0);*/
draw_xhair_line(xctx->gc[xctx->crosshair_layer], snapcursor_size,
X_TO_SCREEN(x),
Y_TO_SCREEN(y) - snapcursor_size,
@ -4250,8 +4278,11 @@ int rstate; /* (reduced state, without ShiftMask) */
if(tclgetboolvar("persistent_command") && xctx->last_command) {
if(xctx->last_command == STARTLINE) start_line(xctx->mousex_snap, xctx->mousey_snap);
if(xctx->last_command == STARTWIRE){
if(tclgetboolvar("snap_cursor") && (xctx->prev_snapx == xctx->mousex_snap && xctx->prev_snapy == xctx->mousey_snap)
&& (xctx->ui_state & STARTWIRE)){
if(tclgetboolvar("snap_cursor")
&& (xctx->prev_snapx == xctx->mousex_snap
&& xctx->prev_snapy == xctx->mousey_snap)
&& (xctx->ui_state & STARTWIRE)
&& xctx->closest_pin_found){
new_wire(PLACE|END, xctx->mousex_snap, xctx->mousey_snap);
xctx->ui_state &= ~STARTWIRE;
}

View File

@ -185,7 +185,7 @@ static void find_closest_line(double mx, double my)
/* snap wire to closest pin or net endpoint (if it is inside the current screen viewport) */
/* use spatial hash table iterators to avoid O(N) */
void find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
int find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
{
double x1, y1, x2, y2;
Iterator_ctx ctx;
@ -193,6 +193,7 @@ void find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
Wireentry *wireptr;
double curr_dist = DBL_MAX;
double xx, yy, dist, min_dist_x = xctx->mousex_snap, min_dist_y = xctx->mousey_snap;
int found_net_or_pin = 0;
x1 = X_TO_XSCHEM(xctx->areax1);
y1 = Y_TO_XSCHEM(xctx->areay1);
@ -218,6 +219,7 @@ void find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
curr_dist = dist;
min_dist_x = xx;
min_dist_y = yy;
found_net_or_pin = 1;
}
}
}
@ -236,6 +238,7 @@ void find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
curr_dist = dist;
min_dist_x = xx;
min_dist_y = yy;
found_net_or_pin = 1;
}
xx = wire[i].x2;
yy = wire[i].y2;
@ -245,11 +248,13 @@ void find_closest_net_or_symbol_pin(double mx, double my, double *x, double *y)
curr_dist = dist;
min_dist_x = xx;
min_dist_y = yy;
found_net_or_pin = 1;
}
}
*x = min_dist_x;
*y = min_dist_y;
return found_net_or_pin;
}
#if 0

View File

@ -648,6 +648,7 @@ static void alloc_xschem_data(const char *top_path, const char *win_path)
xctx->prev_crossx = xctx->prev_crossy = 0.0;
xctx->prev_gridx = xctx->prev_gridy = 0.0;
xctx->prev_snapx = xctx->prev_snapy = 0.0;
xctx->closest_pin_found = 0;
xctx->mouse_inside = 0;
xctx->pending_fullzoom = 0;
my_strncpy(xctx->hiersep, ".", S(xctx->hiersep));

View File

@ -1051,6 +1051,7 @@ typedef struct {
double prev_crossx, prev_crossy;
double prev_gridx, prev_gridy;
double prev_snapx, prev_snapy;
int closest_pin_found;
int mouse_inside;
/* set_modify */
int prev_set_modify;
@ -1397,7 +1398,8 @@ extern int callback(const char *winpath, int event, int mx, int my, KeySym key,
int button, int aux, int state);
extern void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h);
extern Selected find_closest_obj(double mx,double my, int override_lock);
extern void find_closest_net_or_symbol_pin(double mx,double my, double *x, double *y);
/*extern void find_closest_net_or_symbol_pin(double mx,double my, double *x, double *y);*/
extern int find_closest_net_or_symbol_pin(double mx,double my, double *x, double *y);
extern void drawline(int c, int what, double x1,double y1,double x2,double y2, int dash, void *ct);
extern void draw_xhair_line(GC gc, int size, double linex1, double liney1, double linex2, double liney2);