put cairo save surface and context into xctx, faster and smoother preview (avoid unload/load if no filename change)

This commit is contained in:
Stefan Frederik 2020-12-03 18:21:23 +01:00
parent 66a73e4e99
commit 3732bd8d01
12 changed files with 237 additions and 224 deletions

View File

@ -198,42 +198,46 @@ const char *add_ext(const char *f, const char *ext)
static void reset_cairo(int create, int clear) static void reset_cairo(int create, int clear)
{ {
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
/* save_sfc is based on pixmap and pixmaps are not resizeable, so on resize if(clear) {
* we must destroy & recreate everything. sfc can be resized using cairo_*_surface_set_size /* xctx->save_sfc is based on pixmap and pixmaps are not resizeable, so on resize
* being based on window */ * we must destroy & recreate everything. sfc can be resized using cairo_*_surface_set_size
cairo_destroy(cairo_save_ctx); * being based on window */
cairo_surface_destroy(save_sfc); cairo_destroy(xctx->cairo_save_ctx);
#if HAS_XRENDER==1 cairo_surface_destroy(xctx->save_sfc);
#if HAS_XCB==1 }
save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, if(create) {
&format_rgb, xctx->xschem_w, xctx->xschem_h); #if HAS_XRENDER==1
#else #if HAS_XCB==1
save_sfc = cairo_xlib_surface_create_with_xrender_format(display, xctx->save_pixmap, xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap,
DefaultScreenOfDisplay(display), format, xctx->xschem_w, xctx->xschem_h); &format_rgb, xctx->xschem_w, xctx->xschem_h);
#endif /* HAS_XCB */ #else
#else xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format(display, xctx->save_pixmap,
save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, xctx->xschem_w, xctx->xschem_h); DefaultScreenOfDisplay(display), format, xctx->xschem_w, xctx->xschem_h);
#endif /* HAS_XRENDER */ #endif /* HAS_XCB */
if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { #else
fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, xctx->xschem_w, xctx->xschem_h);
exit(-1); #endif /* HAS_XRENDER */
if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) {
fprintf(errfp, "ERROR: invalid cairo xcb surface\n");
exit(-1);
}
xctx->cairo_save_ctx = cairo_create(xctx->save_sfc);
cairo_set_line_width(xctx->cairo_save_ctx, 1);
cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND);
cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND);
cairo_select_font_face (xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (xctx->cairo_save_ctx, 20);
} }
cairo_save_ctx = cairo_create(save_sfc);
cairo_set_line_width(cairo_save_ctx, 1);
cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND);
cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND);
cairo_select_font_face (cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cairo_save_ctx, 20);
/* 20171125 select xlib or xcb :-) */ /* 20171125 select xlib or xcb :-) */
#if HAS_XCB==1 && HAS_XRENDER==1 #if HAS_XCB==1 && HAS_XRENDER==1
cairo_xcb_surface_set_size(sfc, xctx->xschem_w, xctx->xschem_h); cairo_xcb_surface_set_size(sfc, xctx->xschem_w, xctx->xschem_h);
#else #else
cairo_xlib_surface_set_size(sfc, xctx->xschem_w, xctx->xschem_h); cairo_xlib_surface_set_size(sfc, xctx->xschem_w, xctx->xschem_h);
#endif /* HAS_XCB */ #endif /* HAS_XCB && HAS_XRENDER */
#endif /* HAS_CAIRO */ #endif /* HAS_CAIRO */
} }
void resetwin(int create_pixmap, int clear_pixmap, int preview_window) void resetwin(int create_pixmap, int clear_pixmap, int force)
{ {
int i; int i;
XWindowAttributes wattr; XWindowAttributes wattr;
@ -255,9 +259,8 @@ void resetwin(int create_pixmap, int clear_pixmap, int preview_window)
xctx->areaw = xctx->areax2-xctx->areax1; xctx->areaw = xctx->areax2-xctx->areax1;
xctx->areah = xctx->areay2-xctx->areay1; xctx->areah = xctx->areay2-xctx->areay1;
/* if no preview_window or create_pixmap==1 avoid unnecessary work if no resize */ /* if no force avoid unnecessary work if no resize */
/* !create_pixmap ensures the XSetTile is executed when done with the preview */ if( force || xctx->xschem_w !=xctx->xrect[0].width || xctx->xschem_h !=xctx->xrect[0].height) {
if( preview_window || xctx->xschem_w !=xctx->xrect[0].width || xctx->xschem_h !=xctx->xrect[0].height) {
dbg(1, "resetwin(): x=%d y=%d xctx->xschem_w=%d xctx->xschem_h=%d\n", dbg(1, "resetwin(): x=%d y=%d xctx->xschem_w=%d xctx->xschem_h=%d\n",
wattr.x, wattr.y, xctx->xschem_w,xctx->xschem_h); wattr.x, wattr.y, xctx->xschem_w,xctx->xschem_h);
dbg(1, "resetwin(): changing size\n\n"); dbg(1, "resetwin(): changing size\n\n");
@ -278,11 +281,11 @@ void resetwin(int create_pixmap, int clear_pixmap, int preview_window)
xctx->save_pixmap = XCreatePixmap(display, xctx->window, xctx->xschem_w, xctx->xschem_h, depth); xctx->save_pixmap = XCreatePixmap(display, xctx->window, xctx->xschem_w, xctx->xschem_h, depth);
} }
XSetTile(display,gctiled, xctx->save_pixmap); XSetTile(display,gctiled, xctx->save_pixmap);
reset_cairo(create_pixmap, clear_pixmap);
} }
reset_cairo(create_pixmap, clear_pixmap);
#else #else
HWND hwnd; HWND hwnd;
if (preview_window) { if (force) {
hwnd = Tk_GetHWND(pre_window); hwnd = Tk_GetHWND(pre_window);
} }
else { else {
@ -302,9 +305,8 @@ void resetwin(int create_pixmap, int clear_pixmap, int preview_window)
xctx->areay1 = -2 * INT_WIDTH(xctx->lw); xctx->areay1 = -2 * INT_WIDTH(xctx->lw);
xctx->areaw = xctx->areax2 - xctx->areax1; xctx->areaw = xctx->areax2 - xctx->areax1;
xctx->areah = xctx->areay2 - xctx->areay1; xctx->areah = xctx->areay2 - xctx->areay1;
/* if no preview_window or create_pixmap==1 avoid unnecessary work if no resize */ /* if no force avoid unnecessary work if no resize */
/* !create_pixmap ensures the XSetTile is executed when done with the preview */ if( force || xctx->xschem_w !=xctx->xrect[0].width ||
if( preview_window || xctx->xschem_w !=xctx->xrect[0].width ||
xctx->xschem_h !=xctx->xrect[0].height) { xctx->xschem_h !=xctx->xrect[0].height) {
dbg(1, "resetwin(): x=%d y=%d xctx->xschem_w=%d xctx->xschem_h=%d\n", dbg(1, "resetwin(): x=%d y=%d xctx->xschem_w=%d xctx->xschem_h=%d\n",
rct.right, rct.bottom, xctx->xschem_w, xctx->xschem_h); rct.right, rct.bottom, xctx->xschem_w, xctx->xschem_h);
@ -2358,9 +2360,9 @@ void place_text(int draw_text, double mx, double my)
if(t->flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; if(t->flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC;
if(t->flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; if(t->flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(cairo_ctx); cairo_save(cairo_ctx);
cairo_save(cairo_save_ctx); cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (cairo_ctx, textfont, slant, weight); cairo_select_font_face (cairo_ctx, textfont, slant, weight);
cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
} }
#endif #endif
save_draw=draw_window; save_draw=draw_window;
@ -2372,7 +2374,7 @@ void place_text(int draw_text, double mx, double my)
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
if((textfont && textfont[0]) || t->flags) { if((textfont && textfont[0]) || t->flags) {
cairo_restore(cairo_ctx); cairo_restore(cairo_ctx);
cairo_restore(cairo_save_ctx); cairo_restore(xctx->cairo_save_ctx);
} }
#endif #endif
select_text(xctx->texts, SELECTED, 0); select_text(xctx->texts, SELECTED, 0);

View File

@ -108,30 +108,30 @@ void print_image()
XSetTile(display, gctiled, xctx->save_pixmap); XSetTile(display, gctiled, xctx->save_pixmap);
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
cairo_destroy(cairo_save_ctx); cairo_destroy(xctx->cairo_save_ctx);
cairo_surface_destroy(save_sfc); cairo_surface_destroy(xctx->save_sfc);
#if HAS_XRENDER==1 #if HAS_XRENDER==1
#if HAS_XCB==1 #if HAS_XCB==1
save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h); xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h);
#else #else
save_sfc = cairo_xlib_surface_create_with_xrender_format(display, xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format(display,
xctx->save_pixmap, DefaultScreenOfDisplay(display), format, w, h); xctx->save_pixmap, DefaultScreenOfDisplay(display), format, w, h);
#endif /*HAS_XCB */ #endif /*HAS_XCB */
#else #else
save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h); xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h);
#endif /*HAS_XRENDER */ #endif /*HAS_XRENDER */
if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) {
fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); fprintf(errfp, "ERROR: invalid cairo xcb surface\n");
exit(-1); exit(-1);
} }
cairo_save_ctx = cairo_create(save_sfc); xctx->cairo_save_ctx = cairo_create(xctx->save_sfc);
cairo_set_line_width(cairo_save_ctx, 1); cairo_set_line_width(xctx->cairo_save_ctx, 1);
cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND);
cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND);
cairo_select_font_face (cairo_save_ctx, cairo_font_name, cairo_select_font_face (xctx->cairo_save_ctx, cairo_font_name,
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cairo_save_ctx, 20); cairo_set_font_size (xctx->cairo_save_ctx, 20);
#endif /*HAS_CAIRO */ #endif /*HAS_CAIRO */
for(tmp=0;tmp<cadlayers;tmp++) for(tmp=0;tmp<cadlayers;tmp++)
{ {
@ -184,29 +184,29 @@ void print_image()
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
cairo_destroy(cairo_save_ctx); cairo_destroy(xctx->cairo_save_ctx);
cairo_surface_destroy(save_sfc); cairo_surface_destroy(xctx->save_sfc);
#if HAS_XRENDER==1 #if HAS_XRENDER==1
#if HAS_XCB==1 #if HAS_XCB==1
save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h); xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, screen_xcb, xctx->save_pixmap, &format_rgb, w, h);
#else #else
save_sfc = cairo_xlib_surface_create_with_xrender_format (display, xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format (display,
xctx->save_pixmap, DefaultScreenOfDisplay(display), format, w, h); xctx->save_pixmap, DefaultScreenOfDisplay(display), format, w, h);
#endif /*HAS_XCB */ #endif /*HAS_XCB */
#else #else
save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h); xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, w, h);
#endif /*HAS_XRENDER */ #endif /*HAS_XRENDER */
if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) {
fprintf(errfp, "ERROR: invalid cairo xcb surface\n"); fprintf(errfp, "ERROR: invalid cairo xcb surface\n");
exit(-1); exit(-1);
} }
cairo_save_ctx = cairo_create(save_sfc); xctx->cairo_save_ctx = cairo_create(xctx->save_sfc);
cairo_set_line_width(cairo_save_ctx, 1); cairo_set_line_width(xctx->cairo_save_ctx, 1);
cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND);
cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND);
cairo_select_font_face (cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_select_font_face (xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size (cairo_save_ctx, 20); cairo_set_font_size (xctx->cairo_save_ctx, 20);
#endif /*HAS_CAIRO */ #endif /*HAS_CAIRO */
for(tmp=0;tmp<cadlayers;tmp++) for(tmp=0;tmp<cadlayers;tmp++)
@ -230,7 +230,7 @@ void set_cairo_color(int layer)
(double)xcolor_array[layer].red/65535.0, (double)xcolor_array[layer].red/65535.0,
(double)xcolor_array[layer].green/65535.0, (double)xcolor_array[layer].green/65535.0,
(double)xcolor_array[layer].blue/65535.0); (double)xcolor_array[layer].blue/65535.0);
cairo_set_source_rgb(cairo_save_ctx, cairo_set_source_rgb(xctx->cairo_save_ctx,
(double)xcolor_array[layer].red/65535.0, (double)xcolor_array[layer].red/65535.0,
(double)xcolor_array[layer].green/65535.0, (double)xcolor_array[layer].green/65535.0,
(double)xcolor_array[layer].blue/65535.0); (double)xcolor_array[layer].blue/65535.0);
@ -265,7 +265,7 @@ int set_text_custom_font(xText *txt)
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
static void cairo_draw_string_line(cairo_t *cairo_ctx, char *s, static void cairo_draw_string_line(cairo_t *c_ctx, char *s,
double x, double y, int rot, int flip, double x, double y, int rot, int flip,
int lineno, double fontheight, double fontascent, double fontdescent, int llength) int lineno, double fontheight, double fontascent, double fontdescent, int llength)
{ {
@ -301,13 +301,13 @@ static void cairo_draw_string_line(cairo_t *cairo_ctx, char *s,
else if(rot==2 && flip==1) {iy=iy-fontheight-lines+line_delta+fontascent+vc;} else if(rot==2 && flip==1) {iy=iy-fontheight-lines+line_delta+fontascent+vc;}
else if(rot==3 && flip==1) {iy=iy+line_offset;ix+=line_delta+fontascent-vc;} else if(rot==3 && flip==1) {iy=iy+line_offset;ix+=line_delta+fontascent-vc;}
cairo_save(cairo_ctx); cairo_save(c_ctx);
cairo_translate(cairo_ctx, ix, iy); cairo_translate(c_ctx, ix, iy);
cairo_rotate(cairo_ctx, XSCH_PI/2*rot1); cairo_rotate(c_ctx, XSCH_PI/2*rot1);
cairo_move_to(cairo_ctx, 0,0); cairo_move_to(c_ctx, 0,0);
cairo_show_text(cairo_ctx, s); cairo_show_text(c_ctx, s);
cairo_restore(cairo_ctx); cairo_restore(c_ctx);
} }
/* CAIRO version */ /* CAIRO version */
@ -356,7 +356,7 @@ void draw_string(int layer, int what, const char *str, int rot, int flip, int hc
set_cairo_color(layer); set_cairo_color(layer);
cairo_set_font_size (cairo_ctx, size*xctx->mooz); cairo_set_font_size (cairo_ctx, size*xctx->mooz);
cairo_set_font_size (cairo_save_ctx, size*xctx->mooz); cairo_set_font_size (xctx->cairo_save_ctx, size*xctx->mooz);
cairo_font_extents(cairo_ctx, &fext); cairo_font_extents(cairo_ctx, &fext);
dbg(1, "draw_string(): size * mooz=%g height=%g ascent=%g descent=%g\n", dbg(1, "draw_string(): size * mooz=%g height=%g ascent=%g descent=%g\n",
size * xctx->mooz, fext.height, fext.ascent, fext.descent); size * xctx->mooz, fext.height, fext.ascent, fext.descent);
@ -370,7 +370,7 @@ void draw_string(int layer, int what, const char *str, int rot, int flip, int hc
/*fprintf(errfp, "cairo_draw_string(): tt=%s, longest line: %d\n", tt, cairo_longest_line); */ /*fprintf(errfp, "cairo_draw_string(): tt=%s, longest line: %d\n", tt, cairo_longest_line); */
if(draw_window) cairo_draw_string_line(cairo_ctx, tt, x, y, rot, flip, if(draw_window) cairo_draw_string_line(cairo_ctx, tt, x, y, rot, flip,
lineno, fext.height, fext.ascent, fext.descent, llength); lineno, fext.height, fext.ascent, fext.descent, llength);
if(draw_pixmap) cairo_draw_string_line(cairo_save_ctx, tt, x, y, rot, flip, if(draw_pixmap) cairo_draw_string_line(xctx->cairo_save_ctx, tt, x, y, rot, flip,
lineno, fext.height, fext.ascent, fext.descent, llength); lineno, fext.height, fext.ascent, fext.descent, llength);
lineno++; lineno++;
if(c==0) break; if(c==0) break;
@ -603,9 +603,9 @@ void draw_symbol(int what,int c, int n,int layer,int tmp_flip, int rot,
if(symptr->text[j].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; if(symptr->text[j].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(cairo_ctx); cairo_save(cairo_ctx);
cairo_save(cairo_save_ctx); cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (cairo_ctx, textfont, slant, weight); cairo_select_font_face (cairo_ctx, textfont, slant, weight);
cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
} }
#endif #endif
dbg(1, "drawing string: str=%s prop=%s\n", txtptr, text.prop_ptr); dbg(1, "drawing string: str=%s prop=%s\n", txtptr, text.prop_ptr);
@ -620,7 +620,7 @@ void draw_symbol(int what,int c, int n,int layer,int tmp_flip, int rot,
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
if( (textfont && textfont[0]) || symptr->text[j].flags) { if( (textfont && textfont[0]) || symptr->text[j].flags) {
cairo_restore(cairo_ctx); cairo_restore(cairo_ctx);
cairo_restore(cairo_save_ctx); cairo_restore(xctx->cairo_save_ctx);
} }
#endif #endif
} }
@ -1736,9 +1736,9 @@ void draw(void)
if(xctx->text[i].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; if(xctx->text[i].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(cairo_ctx); cairo_save(cairo_ctx);
cairo_save(cairo_save_ctx); cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (cairo_ctx, textfont, slant, weight); cairo_select_font_face (cairo_ctx, textfont, slant, weight);
cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
} }
#endif #endif
@ -1749,7 +1749,7 @@ void draw(void)
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
if((textfont && textfont[0]) || xctx->text[i].flags ) { if((textfont && textfont[0]) || xctx->text[i].flags ) {
cairo_restore(cairo_ctx); cairo_restore(cairo_ctx);
cairo_restore(cairo_save_ctx); cairo_restore(xctx->cairo_save_ctx);
} }
#endif #endif
#ifndef HAS_CAIRO #ifndef HAS_CAIRO

View File

@ -103,9 +103,9 @@ XPoint *gridpoint; /* pointer to array of gridpoints, used in draw() */
XColor xcolor_array[256]; XColor xcolor_array[256];
Visual *visual; Visual *visual;
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
cairo_surface_t *sfc, *save_sfc;
cairo_t *cairo_ctx, *cairo_save_ctx;
XRenderPictFormat *format; XRenderPictFormat *format;
cairo_surface_t *sfc;
cairo_t *cairo_ctx;
#if HAS_XCB==1 #if HAS_XCB==1
xcb_connection_t *xcbconn; xcb_connection_t *xcbconn;
@ -200,7 +200,6 @@ int head_undo_ptr=0;
int max_undo=MAX_UNDO; int max_undo=MAX_UNDO;
int draw_dots=1; int draw_dots=1;
int draw_single_layer=-1; int draw_single_layer=-1;
int check_version = 0; /* if set ensures 'v' version header line is present before loading file */
int yyparse_error = 0; int yyparse_error = 0;
int *enable_layer; int *enable_layer;
int n_active_layers=0; int n_active_layers=0;

View File

@ -849,9 +849,9 @@ void copy_objects(int what)
if(flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; if(flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC;
if(flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; if(flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(cairo_ctx); cairo_save(cairo_ctx);
cairo_save(cairo_save_ctx); cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (cairo_ctx, textfont, slant, weight); cairo_select_font_face (cairo_ctx, textfont, slant, weight);
cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
} }
#endif #endif
draw_string(textlayer, ADD, xctx->text[xctx->texts].txt_ptr, /* draw moved txt */ draw_string(textlayer, ADD, xctx->text[xctx->texts].txt_ptr, /* draw moved txt */
@ -866,7 +866,7 @@ void copy_objects(int what)
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
if( (textfont && textfont[0]) || xctx->text[xctx->texts].flags) { if( (textfont && textfont[0]) || xctx->text[xctx->texts].flags) {
cairo_restore(cairo_ctx); cairo_restore(cairo_ctx);
cairo_restore(cairo_save_ctx); cairo_restore(xctx->cairo_save_ctx);
} }
#endif #endif
xctx->sel_array[i].n=xctx->texts; xctx->sel_array[i].n=xctx->texts;
@ -1383,9 +1383,9 @@ void move_objects(int what, int merge, double dx, double dy)
if(xctx->text[n].flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC; if(xctx->text[n].flags & TEXT_ITALIC) slant = CAIRO_FONT_SLANT_ITALIC;
if(xctx->text[n].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE; if(xctx->text[n].flags & TEXT_OBLIQUE) slant = CAIRO_FONT_SLANT_OBLIQUE;
cairo_save(cairo_ctx); cairo_save(cairo_ctx);
cairo_save(cairo_save_ctx); cairo_save(xctx->cairo_save_ctx);
cairo_select_font_face (cairo_ctx, textfont, slant, weight); cairo_select_font_face (cairo_ctx, textfont, slant, weight);
cairo_select_font_face (cairo_save_ctx, textfont, slant, weight); cairo_select_font_face (xctx->cairo_save_ctx, textfont, slant, weight);
} }
#endif #endif
draw_string(textlayer, ADD, xctx->text[n].txt_ptr, /* draw moved txt */ draw_string(textlayer, ADD, xctx->text[n].txt_ptr, /* draw moved txt */
@ -1399,7 +1399,7 @@ void move_objects(int what, int merge, double dx, double dy)
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
if( (textfont && textfont[0]) || xctx->text[n].flags) { if( (textfont && textfont[0]) || xctx->text[n].flags) {
cairo_restore(cairo_ctx); cairo_restore(cairo_ctx);
cairo_restore(cairo_save_ctx); cairo_restore(xctx->cairo_save_ctx);
} }
#endif #endif
break; break;

View File

@ -1043,7 +1043,6 @@ int sym_vs_sch_pins()
char *pin_dir=NULL; char *pin_dir=NULL;
double tmpd; double tmpd;
FILE *fd; FILE *fd;
int version_found;
int tmpi; int tmpi;
int endfile; int endfile;
char tag[1]; char tag[1];
@ -1061,7 +1060,6 @@ int sym_vs_sch_pins()
fd = fopen(filename, "r"); fd = fopen(filename, "r");
pin_cnt = 0; pin_cnt = 0;
endfile = 0; endfile = 0;
version_found=0;
xctx->file_version[0] = '\0'; xctx->file_version[0] = '\0';
while(!endfile) { while(!endfile) {
if(fscanf(fd," %c",tag)==EOF) break; if(fscanf(fd," %c",tag)==EOF) break;
@ -1070,7 +1068,6 @@ int sym_vs_sch_pins()
load_ascii_string(&xctx->version_string, fd); load_ascii_string(&xctx->version_string, fd);
my_snprintf(xctx->file_version, S(xctx->file_version), "%s", my_snprintf(xctx->file_version, S(xctx->file_version), "%s",
get_tok_value(xctx->version_string, "file_version", 0)); get_tok_value(xctx->version_string, "file_version", 0));
version_found = 1;
break; break;
case 'E': case 'E':
@ -1206,7 +1203,6 @@ int sym_vs_sch_pins()
break; break;
} }
read_line(fd, 0); /* discard any remaining characters till (but not including) newline */ read_line(fd, 0); /* discard any remaining characters till (but not including) newline */
if(check_version && !version_found) break;
if(!xctx->file_version[0]) { if(!xctx->file_version[0]) {
my_snprintf(xctx->file_version, S(xctx->file_version), "1.0"); my_snprintf(xctx->file_version, S(xctx->file_version), "1.0");
dbg(1, "sym_vs_sch_pins(): no file_version, assuming file_version=%s\n", xctx->file_version); dbg(1, "sym_vs_sch_pins(): no file_version, assuming file_version=%s\n", xctx->file_version);

View File

@ -738,7 +738,6 @@ void read_xschem_file(FILE *fd)
char name_embedded[PATH_MAX]; char name_embedded[PATH_MAX];
char tag[1]; char tag[1];
int inst_cnt; int inst_cnt;
int version_found = 0;
int ty=0; int ty=0;
dbg(2, "read_xschem_file(): start\n"); dbg(2, "read_xschem_file(): start\n");
@ -754,7 +753,6 @@ void read_xschem_file(FILE *fd)
if(xctx->version_string) { if(xctx->version_string) {
my_snprintf(xctx->file_version, S(xctx->file_version), "%s", my_snprintf(xctx->file_version, S(xctx->file_version), "%s",
get_tok_value(xctx->version_string, "file_version", 0)); get_tok_value(xctx->version_string, "file_version", 0));
version_found = 1;
} }
dbg(1, "read_xschem_file(): file_version=%s\n", xctx->file_version); dbg(1, "read_xschem_file(): file_version=%s\n", xctx->file_version);
break; break;
@ -846,7 +844,6 @@ void read_xschem_file(FILE *fd)
xctx->schvhdlprop = str; xctx->schvhdlprop = str;
} }
} }
if(check_version && !version_found) return;
if(!xctx->file_version[0]) { if(!xctx->file_version[0]) {
my_snprintf(xctx->file_version, S(xctx->file_version), "1.0"); my_snprintf(xctx->file_version, S(xctx->file_version), "1.0");
dbg(1, "read_xschem_file(): no file_version, assuming file_version=%s\n", xctx->file_version); dbg(1, "read_xschem_file(): no file_version, assuming file_version=%s\n", xctx->file_version);

View File

@ -2096,7 +2096,7 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
if( strlen(argv[3]) < sizeof(cairo_font_name) ) { if( strlen(argv[3]) < sizeof(cairo_font_name) ) {
my_strncpy(cairo_font_name, argv[3], S(cairo_font_name)); my_strncpy(cairo_font_name, argv[3], S(cairo_font_name));
cairo_select_font_face(cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_select_font_face(cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_select_font_face(cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_select_font_face(xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
} }
} else } else
#endif #endif

View File

@ -452,7 +452,7 @@ void bbox(int what,double x1,double y1, double x2, double y2)
} }
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
cairo_reset_clip(cairo_ctx); cairo_reset_clip(cairo_ctx);
cairo_reset_clip(cairo_save_ctx); cairo_reset_clip(xctx->cairo_save_ctx);
#endif #endif
sem=0; sem=0;
break; break;
@ -482,8 +482,8 @@ void bbox(int what,double x1,double y1, double x2, double y2)
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
cairo_rectangle(cairo_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height); cairo_rectangle(cairo_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height);
cairo_clip(cairo_ctx); cairo_clip(cairo_ctx);
cairo_rectangle(cairo_save_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height); cairo_rectangle(xctx->cairo_save_ctx, xctx->xrect[0].x, xctx->xrect[0].y, xctx->xrect[0].width, xctx->xrect[0].height);
cairo_clip(cairo_save_ctx); cairo_clip(xctx->cairo_save_ctx);
#endif #endif
break; break;
default: default:

View File

@ -562,10 +562,6 @@ void alloc_xschem_data()
if(xctx->sel_array==NULL){ if(xctx->sel_array==NULL){
fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit"); fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit");
} }
pixmap=my_calloc(636, cadlayers, sizeof(Pixmap));
if(pixmap==NULL){
fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit");
}
} }
@ -619,6 +615,10 @@ void alloc_data()
} }
} }
enable_layer=my_calloc(87, cadlayers, sizeof(int)); enable_layer=my_calloc(87, cadlayers, sizeof(int));
pixmap=my_calloc(636, cadlayers, sizeof(Pixmap));
if(pixmap==NULL){
fprintf(errfp, "Tcl_AppInit(): calloc error\n");tcleval( "exit");
}
} }
void xwin_exit(void) void xwin_exit(void)
@ -636,9 +636,9 @@ void xwin_exit(void)
if(has_x) { if(has_x) {
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
cairo_destroy(cairo_ctx); cairo_destroy(cairo_ctx);
cairo_destroy(cairo_save_ctx); cairo_destroy(xctx->cairo_save_ctx);
cairo_surface_destroy(sfc); cairo_surface_destroy(sfc);
cairo_surface_destroy(save_sfc); cairo_surface_destroy(xctx->save_sfc);
#endif #endif
dbg(1, "xwin_exit(): Releasing pixmaps\n"); dbg(1, "xwin_exit(): Releasing pixmaps\n");
for(i=0;i<cadlayers;i++) for(i=0;i<cadlayers;i++)
@ -833,53 +833,67 @@ int source_tcl_file(char *s)
return TCL_OK; return TCL_OK;
} }
void preview_clear(void)
{
dbg(1, "preview_clear()\n");
unselect_all();
remove_symbols();
clear_drawing();
resetwin(0, 1, 1); /* delete preview pixmap */
free_xschem_data();
}
void preview_window(const char *what, const char *tk_win_path, const char *filename) void preview_window(const char *what, const char *tk_win_path, const char *filename)
{ {
static char *current_file = NULL;
static Xschem_ctx *save_xctx = NULL; /* save pointer to current schematic context structure */
static Xschem_ctx *preview_xctx = NULL; /* save pointer to current schematic context structure */
dbg(1, "------\n");
if(!strcmp(what, "create")) { if(!strcmp(what, "create")) {
dbg(1, "preview_window() create, save ctx\n");
tkpre_window = Tk_NameToWindow(interp, tk_win_path, mainwindow); tkpre_window = Tk_NameToWindow(interp, tk_win_path, mainwindow);
Tk_MakeWindowExist(tkpre_window); Tk_MakeWindowExist(tkpre_window);
pre_window = Tk_WindowId(tkpre_window); pre_window = Tk_WindowId(tkpre_window);
save_xctx = xctx; /* save current schematic */
} }
else if(!strcmp(what, "draw")) { else if(!strcmp(what, "draw")) {
Xschem_ctx *save_xctx = NULL; /* save pointer to current schematic context structure */ dbg(1, "preview_window() draw\n");
int save_show_pin; xctx = preview_xctx;
if(!current_file || strcmp(filename, current_file) ) {
save_xctx = xctx; /* save current schematic */ if(current_file) {
xctx = NULL; /* reset for preview */ preview_clear();
alloc_xschem_data(); /* alloc data into xctx */ }
my_strdup(117, &current_file, filename);
/* save some relevant global context */ xctx = NULL; /* reset for preview */
save_show_pin = show_pin_net_names; alloc_xschem_data(); /* alloc data into xctx */
show_pin_net_names = 0; preview_xctx = xctx;
/* save some relevant global context */
/* preview */ /* preview */
check_version = 0; /* if set refuse to load and preview anything if not a rel 1.1+ xschem file */ dbg(1, "preview_window() draw, load schematic\n");
/* if not set heuristics is done in xschem.tcl to ensure it is an xschem file */ load_schematic(1,filename, 0);
load_schematic(1,filename, 0); preview_xctx->window = pre_window;
xctx->window = pre_window; resetwin(1, 0, 1); /* create preview pixmap. resetwin(create_pixmap, clear_pixmap, force) */
resetwin(1, 0, 1); /* create preview pixmap resetwin(create_pixmap, clear_pixmap, preview_window) */ }
resetwin(1, 1, 0); /* handle resize. resetwin(create_pixmap, clear_pixmap, force) */
XSetTile(display,gctiled, xctx->save_pixmap);
zoom_full(1, 0); /* draw */ zoom_full(1, 0); /* draw */
check_version = 0; xctx = save_xctx;
XSetTile(display,gctiled, xctx->save_pixmap);
/* restore context */
unselect_all();
remove_symbols();
clear_drawing();
show_pin_net_names = save_show_pin;
resetwin(0, 1, 1); /* delete preview pixmap */
free_xschem_data();
xctx = save_xctx; /* restore schematic */
resetwin(0, 0, 0); /* set window size info back to original value */
set_modify(xctx->modified);
change_linewidth(-1.);
/* not needed: event loop takes care of this and don't need to regenerate xctx->save_pixmap. */
/* draw(); */
} }
else if(!strcmp(what, "destroy")) { else if(!strcmp(what, "destroy")) {
dbg(1, "preview_window() destroy\n");
xctx = preview_xctx;
if(current_file) {
preview_clear();
preview_xctx = NULL;
}
Tk_DestroyWindow(tkpre_window); Tk_DestroyWindow(tkpre_window);
my_free(1144, &current_file);
xctx = save_xctx; /* restore schematic */
save_xctx = NULL;
XSetTile(display,gctiled, xctx->save_pixmap);
set_modify(xctx->modified);
} }
} }
@ -896,7 +910,6 @@ void change_to_unix_fn(char* fn)
if (fn[i]!='\\') fn[ii++] = fn[i]; if (fn[i]!='\\') fn[ii++] = fn[i];
else { fn[ii++] = '/'; if (fn[i + 1] == '\\') ++i; } else { fn[ii++] = '/'; if (fn[i + 1] == '\\') ++i; }
} }
} }
#endif #endif
@ -1362,29 +1375,29 @@ int Tcl_AppInit(Tcl_Interp *inter)
#if HAS_XCB==1 #if HAS_XCB==1
sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn,
screen_xcb, xctx->window, &format_rgb, 1 , 1); screen_xcb, xctx->window, &format_rgb, 1 , 1);
save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn, xctx->save_sfc = cairo_xcb_surface_create_with_xrender_format(xcbconn,
screen_xcb, xctx->save_pixmap, &format_rgb, 1 , 1); screen_xcb, xctx->save_pixmap, &format_rgb, 1 , 1);
#else #else
format = XRenderFindStandardFormat(display, PictStandardRGB24); format = XRenderFindStandardFormat(display, PictStandardRGB24);
sfc = cairo_xlib_surface_create_with_xrender_format (display, sfc = cairo_xlib_surface_create_with_xrender_format (display,
xctx->window, DefaultScreenOfDisplay(display), format, 1, 1); xctx->window, DefaultScreenOfDisplay(display), format, 1, 1);
save_sfc = cairo_xlib_surface_create_with_xrender_format( xctx->save_sfc = cairo_xlib_surface_create_with_xrender_format(
display, xctx->save_pixmap, DefaultScreenOfDisplay(display), format, 1, 1); display, xctx->save_pixmap, DefaultScreenOfDisplay(display), format, 1, 1);
#endif #endif
#else #else
sfc = cairo_xlib_surface_create(display, xctx->window, visual, wattr.width, wattr.height); sfc = cairo_xlib_surface_create(display, xctx->window, visual, wattr.width, wattr.height);
save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, wattr.width, wattr.height); xctx->save_sfc = cairo_xlib_surface_create(display, xctx->save_pixmap, visual, wattr.width, wattr.height);
#endif #endif
if(cairo_surface_status(sfc)!=CAIRO_STATUS_SUCCESS) { if(cairo_surface_status(sfc)!=CAIRO_STATUS_SUCCESS) {
fprintf(errfp, "ERROR: invalid cairo surface\n"); fprintf(errfp, "ERROR: invalid cairo surface\n");
return 1; return 1;
} }
if(cairo_surface_status(save_sfc)!=CAIRO_STATUS_SUCCESS) { if(cairo_surface_status(xctx->save_sfc)!=CAIRO_STATUS_SUCCESS) {
fprintf(errfp, "ERROR: invalid cairo surface\n"); fprintf(errfp, "ERROR: invalid cairo surface\n");
return 1; return 1;
} }
cairo_ctx = cairo_create(sfc); cairo_ctx = cairo_create(sfc);
cairo_save_ctx = cairo_create(save_sfc); xctx->cairo_save_ctx = cairo_create(xctx->save_sfc);
#if 0 #if 0
{ {
@ -1392,7 +1405,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
cfo = cairo_font_options_create (); cfo = cairo_font_options_create ();
cairo_font_options_set_antialias(cfo, CAIRO_ANTIALIAS_DEFAULT); /* CAIRO_ANTIALIAS_NONE */ cairo_font_options_set_antialias(cfo, CAIRO_ANTIALIAS_DEFAULT); /* CAIRO_ANTIALIAS_NONE */
cairo_set_font_options (cairo_ctx, cfo); cairo_set_font_options (cairo_ctx, cfo);
cairo_set_font_options (cairo_save_ctx, cfo); cairo_set_font_options (xctx->cairo_save_ctx, cfo);
} }
#endif #endif
@ -1402,14 +1415,14 @@ int Tcl_AppInit(Tcl_Interp *inter)
tclsetvar("has_cairo","1"); tclsetvar("has_cairo","1");
cairo_select_font_face(cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_select_font_face(cairo_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size(cairo_ctx, 20); cairo_set_font_size(cairo_ctx, 20);
cairo_select_font_face(cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL); cairo_select_font_face(xctx->cairo_save_ctx, cairo_font_name, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
cairo_set_font_size(cairo_save_ctx, 20); cairo_set_font_size(xctx->cairo_save_ctx, 20);
cairo_set_line_width(cairo_ctx, 1); cairo_set_line_width(cairo_ctx, 1);
cairo_set_line_width(cairo_save_ctx, 1); cairo_set_line_width(xctx->cairo_save_ctx, 1);
cairo_set_line_join(cairo_ctx, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join(cairo_ctx, CAIRO_LINE_JOIN_ROUND);
cairo_set_line_cap(cairo_ctx, CAIRO_LINE_CAP_ROUND); cairo_set_line_cap(cairo_ctx, CAIRO_LINE_CAP_ROUND);
cairo_set_line_join(cairo_save_ctx, CAIRO_LINE_JOIN_ROUND); cairo_set_line_join(xctx->cairo_save_ctx, CAIRO_LINE_JOIN_ROUND);
cairo_set_line_cap(cairo_save_ctx, CAIRO_LINE_CAP_ROUND); cairo_set_line_cap(xctx->cairo_save_ctx, CAIRO_LINE_CAP_ROUND);
} }
#endif /* HAS_CAIRO */ #endif /* HAS_CAIRO */

View File

@ -533,6 +533,10 @@ typedef struct {
Window window; Window window;
Pixmap save_pixmap; Pixmap save_pixmap;
XRectangle xrect[1]; XRectangle xrect[1];
#ifdef HAS_CAIRO
cairo_surface_t *save_sfc;
cairo_t *cairo_save_ctx;
#endif
} Xschem_ctx; } Xschem_ctx;
struct Lcc { /* used for symbols containing schematics as instances (LCC, Local Custom Cell) */ struct Lcc { /* used for symbols containing schematics as instances (LCC, Local Custom Cell) */
@ -669,7 +673,6 @@ extern int head_undo_ptr;
extern int max_undo; extern int max_undo;
extern int draw_dots; extern int draw_dots;
extern int draw_single_layer; extern int draw_single_layer;
extern int check_version;
extern int yyparse_error; extern int yyparse_error;
extern char *xschem_executable; extern char *xschem_executable;
extern int depth; extern int depth;
@ -733,9 +736,10 @@ extern Pixmap cad_icon_pixmap, cad_icon_mask, *pixmap;
extern XColor xcolor_array[]; extern XColor xcolor_array[];
extern Visual *visual; extern Visual *visual;
#ifdef HAS_CAIRO #ifdef HAS_CAIRO
extern cairo_surface_t *sfc, *save_sfc;
extern cairo_t *cairo_ctx, *cairo_save_ctx;
extern XRenderPictFormat *format; extern XRenderPictFormat *format;
extern cairo_surface_t *sfc;
extern cairo_t *cairo_ctx;
#if HAS_XCB==1 #if HAS_XCB==1
extern xcb_connection_t *xcbconn; extern xcb_connection_t *xcbconn;
extern xcb_screen_t *screen_xcb; extern xcb_screen_t *screen_xcb;
@ -820,7 +824,7 @@ extern int Tcl_AppInit(Tcl_Interp *interp);
extern int source_tcl_file(char *s); extern int source_tcl_file(char *s);
extern int callback(int event, int mx, int my, KeySym key, extern int callback(int event, int mx, int my, KeySym key,
int button, int aux, int state); int button, int aux, int state);
extern void resetwin(int create_pixmap, int clear_pixmap, int preview_window); extern void resetwin(int create_pixmap, int clear_pixmap, int force);
extern void find_closest_net(double mx,double my); extern void find_closest_net(double mx,double my);
extern void find_closest_box(double mx,double my); extern void find_closest_box(double mx,double my);
extern void find_closest_arc(double mx,double my); extern void find_closest_arc(double mx,double my);

View File

@ -1352,7 +1352,9 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} {init
if { [winfo exists .dialog] } { if { [winfo exists .dialog] } {
.dialog.l.paneright.pre configure -background {} .dialog.l.paneright.pre configure -background {}
xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2" xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2"
bind .dialog.l.paneright.pre <Expose> {xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2"} bind .dialog.l.paneright.pre <Expose> {
xschem preview_window draw .dialog.l.paneright.pre "$myload_dir1/$myload_dir2"
}
} }
} else { } else {
bind .dialog.l.paneright.pre <Expose> {} bind .dialog.l.paneright.pre <Expose> {}
@ -1389,8 +1391,9 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} {init
} }
set t [is_xschem_file "$myload_dir1/$myload_retval"] set t [is_xschem_file "$myload_dir1/$myload_retval"]
if { $t eq {0} } { if { $t eq {0} } {
set answer [tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be an xschem file...\nContinue?" \ set answer [
-icon warning -parent . -type yesno] tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be an xschem file...\nContinue?" \
-icon warning -parent . -type yesno]
if { $answer eq "no"} { if { $answer eq "no"} {
set myload_retval {} set myload_retval {}
return {} return {}
@ -1398,7 +1401,8 @@ proc load_file_dialog {{msg {}} {ext {}} {global_initdir {INITIALINSTDIR}} {init
return "$myload_dir1/$myload_retval" return "$myload_dir1/$myload_retval"
} }
} elseif { $t ne {SYMBOL} && ($ext eq {.sym}) } { } elseif { $t ne {SYMBOL} && ($ext eq {.sym}) } {
set answer [tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be a SYMBOL file...\nContinue?" \ set answer [
tk_messageBox -message "$myload_dir1/$myload_retval does not seem to be a SYMBOL file...\nContinue?" \
-icon warning -parent . -type yesno] -icon warning -parent . -type yesno]
if { $answer eq "no"} { if { $answer eq "no"} {
set myload_retval {} set myload_retval {}
@ -3136,6 +3140,65 @@ proc toolbar_hide {} {
set $toolbar_visible 0 set $toolbar_visible 0
} }
proc set_bindings {window_path} {
global env no_x
###
### Tk event handling
###
# bind . <Enter> {
# if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
# raise .dialog $window_path
# }
# }
bind . <Expose> {
if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
raise .dialog $window_path
}
}
bind . <Visibility> {
if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
raise .dialog $window_path
}
}
bind . <FocusIn> {
if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
raise .dialog $window_path
}
}
bind $window_path <Double-Button-1> {xschem callback -3 %x %y 0 %b 0 %s}
bind $window_path <Double-Button-2> {xschem callback -3 %x %y 0 %b 0 %s}
bind $window_path <Double-Button-3> {xschem callback -3 %x %y 0 %b 0 %s}
bind $window_path <Expose> {xschem callback %T %x %y 0 %w %h %s}
bind $window_path <Configure> {xschem windowid; xschem callback %T %x %y 0 %w %h 0}
bind $window_path <ButtonPress> {xschem callback %T %x %y 0 %b 0 %s}
if {$::OS == "Windows"} {
bind $window_path <MouseWheel> {
if {%D<0} {
xschem callback 4 %x %y 0 5 0 %s
} else {
xschem callback 4 %x %y 0 4 0 %s
}
}
}
bind $window_path <ButtonRelease> {xschem callback %T %x %y 0 %b 0 %s}
# on Windows Alt key mask is reported as 131072 (1<<17) so build masks manually with values passed from C code
if {$::OS == "Windows" } {
bind $window_path <Alt-KeyPress> {xschem callback %T %x %y %N 0 0 [expr {$Mod1Mask}]}
bind $window_path <Control-Alt-KeyPress> {xschem callback %T %x %y %N 0 0 [expr {$ControlMask + $Mod1Mask}]}
bind $window_path <Shift-Alt-KeyPress> {xschem callback %T %x %y %N 0 0 [expr {$ShiftMask + $Mod1Mask}]}
}
bind $window_path <KeyPress> {xschem callback %T %x %y %N 0 0 %s}
bind $window_path <KeyRelease> {xschem callback %T %x %y %N 0 0 %s} ;# 20161118
bind $window_path <Motion> {xschem callback %T %x %y 0 0 0 %s}
bind $window_path <Enter> {xschem callback %T %x %y 0 0 0 0 }
bind $window_path <Leave> {}
bind $window_path <Unmap> {
wm withdraw .infotext
set show_infowindow 0
}
bind $window_path "?" { textwindow "${XSCHEM_SHAREDIR}/xschem.help" }
}
## this function sets up all tk windows and binds X events. It is executed by xinit.c after completing ## this function sets up all tk windows and binds X events. It is executed by xinit.c after completing
## all X initialization. This avoids race conditions. ## all X initialization. This avoids race conditions.
@ -3143,9 +3206,8 @@ proc toolbar_hide {} {
## this could lead to crashes on some (may be slow) systems due to Configure/Expose events being delivered ## this could lead to crashes on some (may be slow) systems due to Configure/Expose events being delivered
## before xschem being ready to handle them. ## before xschem being ready to handle them.
proc build_windows {} { proc build_windows {} {
global env global env no_x
if { ( $::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ] > 0 ) if {($::OS== "Windows" || [string length [lindex [array get env DISPLAY] 1] ] > 0 ) && ![info exists no_x]} {
&& ![info exists no_x]} {
pack .statusbar.2 -side left pack .statusbar.2 -side left
pack .statusbar.3 -side left pack .statusbar.3 -side left
pack .statusbar.4 -side left pack .statusbar.4 -side left
@ -3160,67 +3222,7 @@ proc build_windows {} {
pack .statusbar -after .drw -anchor sw -fill x pack .statusbar -after .drw -anchor sw -fill x
bind .statusbar.5 <Leave> { xschem set cadgrid $grid; focus .drw} bind .statusbar.5 <Leave> { xschem set cadgrid $grid; focus .drw}
bind .statusbar.3 <Leave> { xschem set cadsnap $snap; focus .drw} bind .statusbar.3 <Leave> { xschem set cadsnap $snap; focus .drw}
### set_bindings {.drw}
### Tk event handling
###
# bind . <Enter> {
# if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
# raise .dialog .drw
# }
# }
bind . <Expose> {
if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
raise .dialog .drw
}
}
bind . <Visibility> {
if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
raise .dialog .drw
}
}
bind . <FocusIn> {
if { [winfo exists .dialog] && [winfo ismapped .dialog] && [winfo ismapped .] && [wm stackorder .dialog isbelow . ]} {
raise .dialog .drw
}
}
bind .drw <Double-Button-1> {xschem callback -3 %x %y 0 %b 0 %s}
bind .drw <Double-Button-2> {xschem callback -3 %x %y 0 %b 0 %s}
bind .drw <Double-Button-3> {xschem callback -3 %x %y 0 %b 0 %s}
bind .drw <Expose> {xschem callback %T %x %y 0 %w %h %s}
bind .drw <Configure> {xschem windowid; xschem callback %T %x %y 0 %w %h 0}
bind .drw <ButtonPress> {xschem callback %T %x %y 0 %b 0 %s}
if {$::OS == "Windows"} {
bind .drw <MouseWheel> {
if {%D<0} {
xschem callback 4 %x %y 0 5 0 %s
} else {
xschem callback 4 %x %y 0 4 0 %s
}
}
}
bind .drw <ButtonRelease> {xschem callback %T %x %y 0 %b 0 %s}
# on Windows Alt key mask is reported as 131072 (1<<17) so build masks manually with values passed from C code
if {$::OS == "Windows" } {
bind .drw <Alt-KeyPress> {xschem callback %T %x %y %N 0 0 [expr {$Mod1Mask}]}
bind .drw <Control-Alt-KeyPress> {xschem callback %T %x %y %N 0 0 [expr {$ControlMask + $Mod1Mask}]}
bind .drw <Shift-Alt-KeyPress> {xschem callback %T %x %y %N 0 0 [expr {$ShiftMask + $Mod1Mask}]}
}
bind .drw <KeyPress> {xschem callback %T %x %y %N 0 0 %s}
bind .drw <KeyRelease> {xschem callback %T %x %y %N 0 0 %s} ;# 20161118
bind .drw <Motion> {xschem callback %T %x %y 0 0 0 %s}
bind .drw <Enter> {xschem callback %T %x %y 0 0 0 0 }
bind .drw <Leave> {}
bind .drw <Unmap> {
wm withdraw .infotext
set show_infowindow 0
}
bind .drw "?" { textwindow "${XSCHEM_SHAREDIR}/xschem.help" }
} }
} }

View File

@ -299,7 +299,7 @@ C {ngspice_get_expr.sym} 800 -970 0 1 {name=r1
node="[ngspice::get_current \{q4[ib]\}]" node="[ngspice::get_current \{q4[ib]\}]"
descr = Ib descr = Ib
} }
C {ngspice_get_expr.sym} 570 -460 0 0 {name=r11 C {ngspice_get_expr.sym} 580 -460 0 0 {name=r11
node="[format %.4g [expr ([ngspice::get_voltage e8] - [ngspice::get_voltage c8]) * [ngspice::get_current \{q8[ic]\}]]] W" node="[format %.4g [expr ([ngspice::get_voltage e8] - [ngspice::get_voltage c8]) * [ngspice::get_current \{q8[ic]\}]]] W"
descr = power descr = power
} }