put cairo save surface and context into xctx, faster and smoother preview (avoid unload/load if no filename change)
This commit is contained in:
parent
66a73e4e99
commit
3732bd8d01
|
|
@ -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);
|
||||||
|
|
|
||||||
80
src/draw.c
80
src/draw.c
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
12
src/move.c
12
src/move.c
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
119
src/xinit.c
119
src/xinit.c
|
|
@ -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, ¤t_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, ¤t_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 */
|
||||||
|
|
||||||
|
|
|
||||||
12
src/xschem.h
12
src/xschem.h
|
|
@ -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);
|
||||||
|
|
|
||||||
138
src/xschem.tcl
138
src/xschem.tcl
|
|
@ -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" }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue