diff --git a/doc/xschem_man/developer_info.html b/doc/xschem_man/developer_info.html
index 02e7669d..ad305a3f 100644
--- a/doc/xschem_man/developer_info.html
+++ b/doc/xschem_man/developer_info.html
@@ -511,6 +511,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
+
abort_operation
@@ -668,6 +669,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
currsch hierarchy level of current schematic (start at 0)
debug_var debug level (0 = no debug, 1, 2, 3,...)
draw_window direct draw into window
+ fix_broken_tiled_fill get drawing method setting (for broken GPUs)
format alternate format attribute to use in netlist (or NULL)
graph_lastsel number of last graph that was clicked
gridlayer layer number for grid
@@ -1060,6 +1062,8 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
afterward
reset_flags
Reset cached instance and symbol cached flags (inst->flags, sym->flags)
+ resetwin create_pixmap clear_pixmap force w h
+ internal command: calls resetwin()
resolved_net [net]
if 'net' is given return its topmost full hierarchy name
else returns the topmost full hierarchy name of selected net/pin/label.
@@ -1141,6 +1145,7 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
color_ps set color psoscript (1 or 0)
constrained_move set constrained move (1=horiz, 2=vert, 0=none)
draw_window set drawing to window (1 or 0)
+ fix_broken_tiled_fill alternate drawing method for broken GPUs
format set name of custom format attribute used for netlisting
header_text set header metadata (used for license info)
hide_symbols set to 0,1,2 for various hiding level of symbols
@@ -1328,7 +1333,6 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
-
diff --git a/src/actions.c b/src/actions.c
index 486f66a2..8f2a489c 100644
--- a/src/actions.c
+++ b/src/actions.c
@@ -3452,17 +3452,17 @@ void select_rect(int what, int select)
{
RECTORDER(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2);
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- /*
- * MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
- * xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
- */
+ if(fix_broken_tiled_fill || !_unix) {
+ /*
+ * MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
+ * xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ */
- MyXCopyAreaDouble(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
- xctx->nl_xr, xctx->nl_yr, xctx->nl_xr2, xctx->nl_yr2, xctx->nl_xr, xctx->nl_yr, xctx->lw);
- #else
- drawtemprect(xctx->gctiled, NOW, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2);
- #endif
+ MyXCopyAreaDouble(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
+ xctx->nl_xr, xctx->nl_yr, xctx->nl_xr2, xctx->nl_yr2, xctx->nl_xr, xctx->nl_yr, xctx->lw);
+ } else {
+ drawtemprect(xctx->gctiled, NOW, xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2);
+ }
/* draw_selection(xctx->gc[SELLAYER], 0); */
select_inside(xctx->nl_xr,xctx->nl_yr,xctx->nl_xr2,xctx->nl_yr2, xctx->nl_sel);
diff --git a/src/callback.c b/src/callback.c
index 6438e928..7cddd285 100644
--- a/src/callback.c
+++ b/src/callback.c
@@ -992,17 +992,17 @@ void draw_crosshair(int del)
xctx->draw_pixmap = 0;
xctx->draw_window = 1;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
- 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw),
- xctx->xrect[0].width, 4 * INT_WIDTH(xctx->lw),
- 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw));
+ if(fix_broken_tiled_fill || !_unix) {
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
+ 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw),
+ xctx->xrect[0].width, 4 * INT_WIDTH(xctx->lw),
+ 0, (int)Y_TO_SCREEN(xctx->prev_crossy) - 2 * INT_WIDTH(xctx->lw));
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
- (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0,
- 4 * INT_WIDTH(xctx->lw), xctx->xrect[0].height,
- (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0);
- #endif
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0],
+ (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0,
+ 4 * INT_WIDTH(xctx->lw), xctx->xrect[0].height,
+ (int)X_TO_SCREEN(xctx->prev_crossx) - 2 * INT_WIDTH(xctx->lw), 0);
+ }
draw_selection(xctx->gc[SELLAYER], 0);
drawtempline(xctx->gctiled, NOW, X_TO_XSCHEM(xctx->areax1),
xctx->prev_crossy, X_TO_XSCHEM(xctx->areax2), xctx->prev_crossy);
@@ -1184,16 +1184,16 @@ int draw_xhair = tclgetboolvar("draw_crosshair");
break;
}
if(xctx->ui_state & STARTPAN) pan(RUBBER, mx, my);
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if ((xctx->ui_state & STARTWIRE) || (xctx->ui_state & STARTARC) ||
- (xctx->ui_state & STARTLINE) || (xctx->ui_state & STARTMOVE) ||
- (xctx->ui_state & STARTCOPY) || (xctx->ui_state & STARTRECT) ||
- (xctx->ui_state & STARTPOLYGON) || /* (xctx->ui_state & STARTPAN) || */
- (xctx->ui_state & STARTSELECT)) {
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
- xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ if(fix_broken_tiled_fill || !_unix) {
+ if ((xctx->ui_state & STARTWIRE) || (xctx->ui_state & STARTARC) ||
+ (xctx->ui_state & STARTLINE) || (xctx->ui_state & STARTMOVE) ||
+ (xctx->ui_state & STARTCOPY) || (xctx->ui_state & STARTRECT) ||
+ (xctx->ui_state & STARTPOLYGON) || /* (xctx->ui_state & STARTPAN) || */
+ (xctx->ui_state & STARTSELECT)) {
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
+ xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ }
}
- #endif
if(draw_xhair) {
draw_crosshair(0);
}
diff --git a/src/draw.c b/src/draw.c
index c2092727..807351df 100644
--- a/src/draw.c
+++ b/src/draw.c
@@ -406,9 +406,9 @@ void draw_temp_string(GC gctext, int what, const char *str, short rot, short fli
int tmp;
double dtmp;
if(!has_x) return;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(gctext == xctx->gctiled) return;
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ if(gctext == xctx->gctiled) return;
+ }
dbg(2, "draw_string(): string=%s\n",str);
if(!text_bbox(str, xscale, yscale, rot, flip, hcenter, vcenter, x1,y1,
@@ -728,9 +728,9 @@ void draw_temp_symbol(int what, GC gc, int n,int layer,short tmp_flip, short rot
if(xctx->inst[n].ptr == -1) return;
if(!has_x) return;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(gc == xctx->gctiled) return;
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ if(gc == xctx->gctiled) return;
+ }
if( (xctx->inst[n].flags & HIDE_INST) ||
(xctx->hide_symbols==1 && (xctx->inst[n].ptr+ xctx->sym)->prop_ptr &&
@@ -1161,9 +1161,9 @@ void drawtempline(GC gc, int what, double linex1,double liney1,double linex2,dou
double x1,y1,x2,y2;
if(!has_x) return;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(gc == xctx->gctiled) return;
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ if(gc == xctx->gctiled) return;
+ }
if(what & ADD)
{
@@ -1238,9 +1238,9 @@ void drawtemparc(GC gc, int what, double x, double y, double r, double a, double
double xx1, yy1, xx2, yy2; /* complete circle bbox in screen coords */
if(!has_x) return;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(gc == xctx->gctiled) return;
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ if(gc == xctx->gctiled) return;
+ }
if(what & ADD)
{
@@ -1673,9 +1673,9 @@ void drawtemppolygon(GC g, int what, double *x, double *y, int points)
int i;
short sx, sy;
if(!has_x) return;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(g == xctx->gctiled) return;
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ if(g == xctx->gctiled) return;
+ }
polygon_bbox(x, y, points, &x1,&y1,&x2,&y2);
x1=X_TO_SCREEN(x1);
@@ -1767,9 +1767,9 @@ void drawtemprect(GC gc, int what, double rectx1,double recty1,double rectx2,dou
double x1,y1,x2,y2;
if(!has_x) return;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(gc == xctx->gctiled) return;
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ if(gc == xctx->gctiled) return;
+ }
if(what & NOW)
{
diff --git a/src/globals.c b/src/globals.c
index 6c1f24a8..4bf9a2c0 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -131,6 +131,17 @@ Pixmap cad_icon_pixmap=0, cad_icon_mask=0;
/* char *cad_icon[] */
Pixmap *pixmap = NULL;
Visual *visual;
+#ifdef __unix__
+int _unix = 1;
+#else
+int _unix = 0;
+#endif
+
+#ifdef FIX_BROKEN_TILED_FILL
+int fix_broken_tiled_fill = 1;
+#else
+int fix_broken_tiled_fill = 0;
+#endif
/* ---------------------------------------------- */
/* These variables are mirrored in tcl code */
diff --git a/src/move.c b/src/move.c
index f77e8f34..abe9c41c 100644
--- a/src/move.c
+++ b/src/move.c
@@ -195,13 +195,13 @@ void draw_selection(GC g, int interruptable)
dbg(1,"draw_selection\n");
if(g != xctx->gctiled) xctx->movelastsel = xctx->lastsel;
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- else {
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
- xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
- if(tclgetboolvar("draw_crosshair")) draw_crosshair(0);
+ if(fix_broken_tiled_fill || !_unix) {
+ if(g == xctx->gctiled) {
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
+ xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ if(tclgetboolvar("draw_crosshair")) draw_crosshair(0);
+ }
}
- #endif
for(i=0;imovelastsel; ++i)
{
c = xctx->sel_array[i].col;n = xctx->sel_array[i].n;
@@ -678,10 +678,10 @@ void copy_objects(int what)
if(tclgetintvar("connect_by_kissing") == 2) tclsetintvar("connect_by_kissing", 0);
}
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
- xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
+ xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ }
xctx->move_rot = xctx->move_flip = 0;
xctx->deltax = xctx->deltay = 0.;
@@ -1124,11 +1124,11 @@ void move_objects(int what, int merge, double dx, double dy)
pop_undo(0, 0);
if(tclgetintvar("connect_by_kissing") == 2) tclsetintvar("connect_by_kissing", 0);
}
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
+ if(fix_broken_tiled_fill || !_unix) {
if(xctx->save_pixmap && xctx->window)
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
- xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
- #endif
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
+ xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ }
xctx->move_rot=xctx->move_flip=0;
xctx->deltax=xctx->deltay=0.;
diff --git a/src/scheduler.c b/src/scheduler.c
index 52e8703b..6a449e62 100644
--- a/src/scheduler.c
+++ b/src/scheduler.c
@@ -1010,6 +1010,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
}
break;
case 'f':
+ if(!strcmp(argv[2], "fix_broken_tiled_fill")) { /* get drawing method setting (for broken GPUs) */
+ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
+ Tcl_SetResult(interp, my_itoa(fix_broken_tiled_fill),TCL_VOLATILE);
+ }
if(!strcmp(argv[2], "format")) { /* alternate format attribute to use in netlist (or NULL) */
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(!xctx->format ) Tcl_SetResult(interp, "",TCL_STATIC);
@@ -3317,6 +3321,17 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
Tcl_ResetResult(interp);
}
+ /* resetwin create_pixmap clear_pixmap force w h
+ * internal command: calls resetwin() */
+ else if(!strcmp(argv[1], "resetwin"))
+ {
+ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
+ if(argc > 6) {
+ resetwin(atoi(argv[2]), atoi(argv[3]), atoi(argv[4]), atoi(argv[5]), atoi(argv[6]));
+ }
+ Tcl_ResetResult(interp);
+ }
+
/* resolved_net [net]
* if 'net' is given return its topmost full hierarchy name
* else returns the topmost full hierarchy name of selected net/pin/label.
@@ -3748,6 +3763,10 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
xctx->draw_window=atoi(argv[3]);
}
+ else if(!strcmp(argv[2], "fix_broken_tiled_fill")) { /* alternate drawing method for broken GPUs */
+ if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
+ fix_broken_tiled_fill = atoi(argv[3]);
+ }
else if(!strcmp(argv[2], "format")) { /* set name of custom format attribute used for netlisting */
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
my_strdup(_ALLOC_ID_, &xctx->format, argv[3]);
diff --git a/src/select.c b/src/select.c
index bd2672fe..712b496b 100644
--- a/src/select.c
+++ b/src/select.c
@@ -924,13 +924,13 @@ void unselect_all(int dr)
xctx->ui_state &= ~SELECTION;
my_snprintf(str, S(str), "%s/%s", user_conf_dir, ".selection.sch"); /* 20161115 PWD->HOME */
xunlink(str);
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- if(xctx->save_pixmap && xctx->window) {
- MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
- xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
- if(tclgetboolvar("draw_crosshair")) draw_crosshair(0);
+ if(fix_broken_tiled_fill || !_unix) {
+ if(xctx->save_pixmap && xctx->window) {
+ MyXCopyArea(display, xctx->save_pixmap, xctx->window, xctx->gc[0], xctx->xrect[0].x, xctx->xrect[0].y,
+ xctx->xrect[0].width, xctx->xrect[0].height, xctx->xrect[0].x, xctx->xrect[0].y);
+ if(tclgetboolvar("draw_crosshair")) draw_crosshair(0);
+ }
}
- #endif
dbg(2, "unselect_all(1): done\n");
}
diff --git a/src/xinit.c b/src/xinit.c
index bc3e82dc..a4b8851d 100644
--- a/src/xinit.c
+++ b/src/xinit.c
@@ -2096,10 +2096,8 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h)
XFreeGC(display,xctx->gctiled);
}
if(create_pixmap) {
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
XGCValues gcv;
unsigned long gcvm;
- #endif
#ifdef __unix__
xctx->save_pixmap = XCreatePixmap(display, xctx->window,
@@ -2109,16 +2107,16 @@ void resetwin(int create_pixmap, int clear_pixmap, int force, int w, int h)
xctx->xrect[0].width, xctx->xrect[0].height, screendepth);
#endif
- #if defined(FIX_BROKEN_TILED_FILL) || !defined(__unix__)
- gcv.function = GXnoop; /* disable all graphic operations with gctiled */
- gcvm = GCFunction;
- xctx->gctiled = XCreateGC(display,xctx->window, gcvm, &gcv); /* noop for gctiled */
- XSetFillStyle(display,xctx->gctiled,FillSolid);
- #else
- xctx->gctiled = XCreateGC(display,xctx->window,0L, NULL);
- XSetTile(display,xctx->gctiled, xctx->save_pixmap);
- XSetFillStyle(display,xctx->gctiled,FillTiled);
- #endif
+ if(fix_broken_tiled_fill || !_unix) {
+ gcv.function = GXnoop; /* disable all graphic operations with gctiled */
+ gcvm = GCFunction;
+ xctx->gctiled = XCreateGC(display,xctx->window, gcvm, &gcv); /* noop for gctiled */
+ XSetFillStyle(display,xctx->gctiled,FillSolid);
+ } else {
+ xctx->gctiled = XCreateGC(display,xctx->window,0L, NULL);
+ XSetTile(display,xctx->gctiled, xctx->save_pixmap);
+ XSetFillStyle(display,xctx->gctiled,FillTiled);
+ }
/* whenever a pixmap is recreated all GC attributes must be reissued */
resetcairo(1, 0, 1); /* create, clear, force */
@@ -2490,6 +2488,7 @@ int Tcl_AppInit(Tcl_Interp *inter)
l_width=atoi(tclgetvar("line_width"));
if(tclgetboolvar("change_lw")) l_width = 0.0;
cadlayers=atoi(tclgetvar("cadlayers"));
+ fix_broken_tiled_fill = tclgetboolvar("fix_broken_tiled_fill");
if(debug_var==-10) debug_var=0;
my_snprintf(tmp, S(tmp), "%.16g",CADGRID);
tclvareval("set_ne cadgrid ", tmp, NULL);
diff --git a/src/xschem.h b/src/xschem.h
index 31839a91..af44fe2a 100644
--- a/src/xschem.h
+++ b/src/xschem.h
@@ -1079,11 +1079,13 @@ typedef struct {
/* GLOBAL VARIABLES */
-/*********** X11 specific globals ***********/
+/*********** X11/system specific globals ***********/
extern Colormap colormap;
extern unsigned char **pixdata;
extern unsigned char pixdata_init[22][32];
extern Display *display;
+extern int _unix; /* set to 1 on unix systems */
+extern int fix_broken_tiled_fill; /* if set to 1 work around some GPUs with rotten tiled fill operations */
#ifdef HAS_XCB
extern xcb_connection_t *xcb_conn;
diff --git a/src/xschem.tcl b/src/xschem.tcl
index 4d41acf1..ab9498ad 100644
--- a/src/xschem.tcl
+++ b/src/xschem.tcl
@@ -5593,8 +5593,8 @@ set tctx::global_list {
delay_flag dim_bg dim_value
disable_unique_names do_all_inst draw_crosshair draw_grid draw_window edit_prop_pos edit_prop_size
edit_symbol_prop_new_sel editprop_sympath en_hilight_conn_inst enable_dim_bg enable_stretch
- filetmp flat_netlist fullscreen gaw_fd gaw_tcp_address graph_bus graph_change_done graph_digital
- graph_linewidth_mult graph_logx
+ filetmp fix_broken_tiled_fill flat_netlist fullscreen gaw_fd gaw_tcp_address graph_bus
+ graph_change_done graph_digital graph_linewidth_mult graph_logx
graph_logy graph_rainbow graph_raw_level graph_schname graph_sel_color graph_sel_wave
graph_selected graph_sort graph_unlocked hide_empty_graphs hide_symbols hsize
incr_hilight infowindow_text input_line_cmd input_line_data launcher_default_program
@@ -6116,9 +6116,6 @@ proc build_widgets { {topwin {} } } {
-command {
input_line "Enter grid spacing (float):" "xschem set cadgrid" $cadgrid
}
- $topwin.menubar.view.menu add checkbutton -label "View only Probes" -variable only_probes \
- -accelerator {5} \
- -command { xschem only_probes }
$topwin.menubar.view.menu add command -label "Toggle colorscheme" -accelerator {Shift+O} -command {
xschem toggle_colorscheme
xschem build_colors
@@ -6150,6 +6147,19 @@ proc build_widgets { {topwin {} } } {
-command {
if { $draw_window == 1} { xschem set draw_window 1} else { xschem set draw_window 0}
}
+
+ $topwin.menubar.view.menu add checkbutton -label "Fix for GPUs with broken tiled fill" \
+ -variable fix_broken_tiled_fill \
+ -command {
+ if { $fix_broken_tiled_fill == 1} {
+ xschem set fix_broken_tiled_fill 1
+ } else {
+ xschem set fix_broken_tiled_fill 0
+ }
+ xschem resetwin 1 1 0 0 0
+ xschem redraw
+ }
+
$topwin.menubar.view.menu add checkbutton -label "Symbol text" -variable sym_txt \
-accelerator {Ctrl+B} -command { xschem set sym_txt $sym_txt; xschem redraw }
$topwin.menubar.view.menu add checkbutton -label "Toggle variable line width" -variable change_lw \
@@ -6278,6 +6288,9 @@ proc build_widgets { {topwin {} } } {
xschem redraw } \
-variable compare_sch \
-accelerator {Alt-X}
+ $topwin.menubar.hilight.menu add checkbutton -label "View only Probes" -variable only_probes \
+ -accelerator {5} \
+ -command { xschem only_probes }
$topwin.menubar.hilight.menu add command \
-label {Highlight net-pin mismatches on sel. instances} \
-command "xschem net_pin_mismatch" \
@@ -6845,6 +6858,7 @@ set_ne dark_colorscheme 1
set_ne enable_dim_bg 0
set_ne dim_bg 0.0
set_ne dim_value 0.0
+set_ne fix_broken_tiled_fill 0 ;# set to 1 on some broken X11 drivers / GPUs that show garbage on screen */
##### set colors
if {!$rainbow_colors} {
set_ne cadlayers 22
diff --git a/src/xschemrc b/src/xschemrc
index e07ac463..b092b74a 100644
--- a/src/xschemrc
+++ b/src/xschemrc
@@ -469,3 +469,10 @@
#### Instead, additional drives can be added using XSCHEM_LIBRARY_PATH
#### default: 1
# set add_all_windows_drives 0
+
+###########################################################################
+#### FIX GRAPHIC PROBLEMS ON SOME DRIVERS/GPU CONFIGURATIONS
+###########################################################################
+#### if you see garbage on screen / graphic artifacts while editing with
+#### xschem try to set this to 1. Default: not enabled (0)
+# set fix_broken_tiled_fill 0