diff --git a/src/callback.c b/src/callback.c index 4ec62b85..a6bff131 100644 --- a/src/callback.c +++ b/src/callback.c @@ -273,7 +273,7 @@ static int waves_callback(int event, int mx, int my, KeySym key, int button, int } } - if(need_redraw) draw_graph(c, n); /* draw data in each graph box */ + if(need_redraw) draw_graph(c, n, 1); /* draw data in each graph box */ } draw_selection(xctx->gc[SELLAYER], 0); diff --git a/src/draw.c b/src/draw.c index bbb3b2c6..e66b3529 100644 --- a/src/draw.c +++ b/src/draw.c @@ -1657,7 +1657,7 @@ void calc_graph_area(int c, int i, double *x1, double *y1,double *x2,double *y2, /* #define W_Y(y) (y2 - (y2 - y1) / (wy2 - wy1) * ((y) - wy1)) */ #define W_X(x) (cx * (x) + dx) #define W_Y(y) (cy * (y) + dy) -void draw_graph(int c, int i) +void draw_graph(int c, int i, int flags) { /* container box */ double rx1, ry1, rx2, ry2, rw; @@ -1847,7 +1847,7 @@ void draw_graph(int c, int i) bbox(START, 0.0, 0.0, 0.0, 0.0); bbox(ADD, rx1, ry1, rx2, ry2); bbox(SET, 0.0, 0.0, 0.0, 0.0); - if(!xctx->draw_window) { + if((flags & 1) && !xctx->draw_window) { XCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gctiled, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y); } @@ -1862,7 +1862,12 @@ void draw_graph(int c, int i) } /* fill graph boxes with data from ngspice simulations */ -void draw_waves(void) +/* flags: + * 1: do final XCopyArea (copy 2nd buffer areas to screen) + * If draw_waves() is called from draw() no need to do XCopyArea, as draw() does it already. + * This makes drawing faster and removes a 'tearing' effect when moving around. + */ +void draw_waves(int flags) { int c, i; int bbox_set = 0; @@ -1887,7 +1892,7 @@ void draw_waves(void) if(xctx->enable_layer[c]) for(i = 0; i < xctx->rects[c]; i++) { xRect *r = &xctx->rect[c][i]; if(r->flags == 1) { - draw_graph(c, i); /* draw data in each graph box */ + draw_graph(c, i, flags); /* draw data in each graph box */ } } } @@ -1931,7 +1936,7 @@ void draw(void) xctx->areaw, xctx->areah); dbg(1, "draw(): window: %d %d %d %d\n",xctx->areax1, xctx->areay1, xctx->areax2, xctx->areay2); drawgrid(); - draw_waves(); + draw_waves(0); x1 = X_TO_XSCHEM(xctx->areax1); y1 = Y_TO_XSCHEM(xctx->areay1); x2 = X_TO_XSCHEM(xctx->areax2); diff --git a/src/xschem.h b/src/xschem.h index 43631f55..3926c93a 100644 --- a/src/xschem.h +++ b/src/xschem.h @@ -891,8 +891,8 @@ extern Xschem_ctx *xctx; /* FUNCTIONS */ extern void calc_graph_area(int c, int i, double *x1, double *y1,double *x2, double *y2, double *marginx,double *marginy); -extern void draw_graph(int c, int i); -extern void draw_waves(void); +extern void draw_graph(int c, int i, int flags); +extern void draw_waves(int flags); extern void free_rawfile(void); extern int read_rawfile(const char *f); extern double timer(int start);