undo data structures into xctx context

This commit is contained in:
Stefan Frederik 2020-12-04 00:30:13 +01:00
parent 2b7e31e0d6
commit 76ef664757
7 changed files with 81 additions and 69 deletions

View File

@ -123,7 +123,7 @@ char *netlist_dir=NULL; /* user set netlist directory via cmd-option or menu or
int top_subckt = 0;
int spiceprefix = 1;
int unzoom_nodrift=1;
int change_lw=0; /* allow change xctx->lw */
int change_lw=0; /* allow change lw */
int incr_hilight=1;
unsigned short enable_stretch=0;
int auto_hilight=0;
@ -193,10 +193,6 @@ int text_svg=1; /* use <text> svg element for text instead of xschem's internal
double cadhalfdotsize = CADHALFDOTSIZE;
unsigned int color_index[256]; /* layer color lookup table */
unsigned int rectcolor ; /* this is the currently used layer */
char *undo_dirname = NULL;
int cur_undo_ptr=0;
int tail_undo_ptr=0;
int head_undo_ptr=0;
int max_undo=MAX_UNDO;
int draw_dots=1;
int draw_single_layer=-1;

View File

@ -160,9 +160,9 @@ void free_instances(int slot)
void clear_undo(void)
{
int slot;
cur_undo_ptr = 0;
tail_undo_ptr = 0;
head_undo_ptr = 0;
xctx->cur_undo_ptr = 0;
xctx->tail_undo_ptr = 0;
xctx->head_undo_ptr = 0;
if(!initialized) return;
for(slot=0; slot<MAX_UNDO; slot++) {
free_lines(slot);
@ -202,7 +202,7 @@ void push_undo(void)
initialized=1;
init_undo();
}
slot = cur_undo_ptr%max_undo;
slot = xctx->cur_undo_ptr%max_undo;
my_strdup(173, &uslot[slot].gptr, xctx->schvhdlprop);
my_strdup(174, &uslot[slot].vptr, xctx->schverilogprop);
@ -303,9 +303,9 @@ void push_undo(void)
}
cur_undo_ptr++;
head_undo_ptr = cur_undo_ptr;
tail_undo_ptr = head_undo_ptr <= max_undo? 0: head_undo_ptr-max_undo;
xctx->cur_undo_ptr++;
xctx->head_undo_ptr = xctx->cur_undo_ptr;
xctx->tail_undo_ptr = xctx->head_undo_ptr <= max_undo? 0: xctx->head_undo_ptr-max_undo;
}
@ -315,22 +315,22 @@ void pop_undo(int redo)
if(no_undo)return;
if(redo) {
if(cur_undo_ptr < head_undo_ptr) {
cur_undo_ptr++;
if(xctx->cur_undo_ptr < xctx->head_undo_ptr) {
xctx->cur_undo_ptr++;
} else {
return;
}
} else { /*redo=0 (undo) */
if(cur_undo_ptr == tail_undo_ptr) return;
if(head_undo_ptr == cur_undo_ptr) {
if(xctx->cur_undo_ptr == xctx->tail_undo_ptr) return;
if(xctx->head_undo_ptr == xctx->cur_undo_ptr) {
push_undo();
head_undo_ptr--;
cur_undo_ptr--;
xctx->head_undo_ptr--;
xctx->cur_undo_ptr--;
}
if(cur_undo_ptr<=0) return; /* check undo tail */
cur_undo_ptr--;
if(xctx->cur_undo_ptr<=0) return; /* check undo tail */
xctx->cur_undo_ptr--;
}
slot = cur_undo_ptr%max_undo;
slot = xctx->cur_undo_ptr%max_undo;
clear_drawing();
unselect_all();
my_strdup(198, &xctx->schvhdlprop, uslot[slot].gptr);

View File

@ -48,8 +48,8 @@ void sig_handler(int s){
tcleval("exit");
}
if(rename(undo_dirname, emergency_dir)) {
fprintf(errfp, "rename dir %s to %s failed\n", undo_dirname, emergency_dir);
if(rename(xctx->undo_dirname, emergency_dir)) {
fprintf(errfp, "rename dir %s to %s failed\n", xctx->undo_dirname, emergency_dir);
}
fprintf(errfp, "EMERGENCY SAVE DIR: %s\n", emergency_dir);
#endif

View File

@ -1053,18 +1053,18 @@ void delete_undo(void)
char diff_name[PATH_MAX]; /* overflow safe 20161122 */
for(i=0; i<max_undo; i++) {
my_snprintf(diff_name, S(diff_name), "%s/undo%d",undo_dirname, i);
my_snprintf(diff_name, S(diff_name), "%s/undo%d",xctx->undo_dirname, i);
xunlink(diff_name);
}
rmdir(undo_dirname);
my_free(895, &undo_dirname);
rmdir(xctx->undo_dirname);
my_free(895, &xctx->undo_dirname);
}
void clear_undo(void)
{
cur_undo_ptr = 0;
tail_undo_ptr = 0;
head_undo_ptr = 0;
xctx->cur_undo_ptr = 0;
xctx->tail_undo_ptr = 0;
xctx->head_undo_ptr = 0;
}
void push_undo(void)
@ -1078,12 +1078,12 @@ void push_undo(void)
char diff_name[PATH_MAX+100]; /* overflow safe 20161122 */
if(no_undo)return;
dbg(1, "push_undo(): cur_undo_ptr=%d tail_undo_ptr=%d head_undo_ptr=%d\n",
cur_undo_ptr, tail_undo_ptr, head_undo_ptr);
dbg(1, "push_undo(): xctx->cur_undo_ptr=%d xctx->tail_undo_ptr=%d xctx->head_undo_ptr=%d\n",
xctx->cur_undo_ptr, xctx->tail_undo_ptr, xctx->head_undo_ptr);
#if HAS_POPEN==1
my_snprintf(diff_name, S(diff_name), "gzip --fast -c > %s/undo%d", undo_dirname, cur_undo_ptr%max_undo);
my_snprintf(diff_name, S(diff_name), "gzip --fast -c > %s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%max_undo);
fd = popen(diff_name,"w");
if(!fd) {
fprintf(errfp, "push_undo(): failed to open write pipe %s\n", diff_name);
@ -1091,7 +1091,7 @@ void push_undo(void)
return;
}
#elif HAS_PIPE==1
my_snprintf(diff_name, S(diff_name), "%s/undo%d", undo_dirname, cur_undo_ptr%max_undo);
my_snprintf(diff_name, S(diff_name), "%s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%max_undo);
pipe(pd);
if((pid = fork()) ==0) { /* child process */
static char f[PATH_MAX] = "";
@ -1116,7 +1116,7 @@ void push_undo(void)
close(pd[0]); /* close read side of pipe */
fd=fdopen(pd[1],"w");
#else /* uncompressed undo */
my_snprintf(diff_name, S(diff_name), "%s/undo%d", undo_dirname, cur_undo_ptr%max_undo);
my_snprintf(diff_name, S(diff_name), "%s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%max_undo);
fd = fopen(diff_name,"w");
if(!fd) {
fprintf(errfp, "push_undo(): failed to open undo file %s\n", diff_name);
@ -1125,9 +1125,9 @@ void push_undo(void)
}
#endif
write_xschem_file(fd);
cur_undo_ptr++;
head_undo_ptr = cur_undo_ptr;
tail_undo_ptr = head_undo_ptr <= max_undo? 0: head_undo_ptr-max_undo;
xctx->cur_undo_ptr++;
xctx->head_undo_ptr = xctx->cur_undo_ptr;
xctx->tail_undo_ptr = xctx->head_undo_ptr <= max_undo? 0: xctx->head_undo_ptr-max_undo;
#if HAS_POPEN==1
pclose(fd);
#elif HAS_PIPE==1
@ -1150,30 +1150,30 @@ void pop_undo(int redo)
if(no_undo)return;
if(redo) {
if(cur_undo_ptr < head_undo_ptr) {
dbg(1, "pop_undo(): redo; cur_undo_ptr=%d tail_undo_ptr=%d head_undo_ptr=%d\n",
cur_undo_ptr, tail_undo_ptr, head_undo_ptr);
cur_undo_ptr++;
if(xctx->cur_undo_ptr < xctx->head_undo_ptr) {
dbg(1, "pop_undo(): redo; xctx->cur_undo_ptr=%d xctx->tail_undo_ptr=%d xctx->head_undo_ptr=%d\n",
xctx->cur_undo_ptr, xctx->tail_undo_ptr, xctx->head_undo_ptr);
xctx->cur_undo_ptr++;
} else {
return;
}
} else { /*redo=0 (undo) */
if(cur_undo_ptr == tail_undo_ptr) return;
dbg(1, "pop_undo(): undo; cur_undo_ptr=%d tail_undo_ptr=%d head_undo_ptr=%d\n",
cur_undo_ptr, tail_undo_ptr, head_undo_ptr);
if(head_undo_ptr == cur_undo_ptr) {
if(xctx->cur_undo_ptr == xctx->tail_undo_ptr) return;
dbg(1, "pop_undo(): undo; xctx->cur_undo_ptr=%d xctx->tail_undo_ptr=%d xctx->head_undo_ptr=%d\n",
xctx->cur_undo_ptr, xctx->tail_undo_ptr, xctx->head_undo_ptr);
if(xctx->head_undo_ptr == xctx->cur_undo_ptr) {
push_undo();
head_undo_ptr--;
cur_undo_ptr--;
xctx->head_undo_ptr--;
xctx->cur_undo_ptr--;
}
if(cur_undo_ptr<=0) return; /* check undo tail */
cur_undo_ptr--;
if(xctx->cur_undo_ptr<=0) return; /* check undo tail */
xctx->cur_undo_ptr--;
}
clear_drawing();
unselect_all();
#if HAS_POPEN==1
my_snprintf(diff_name, S(diff_name), "gunzip -c %s/undo%d", undo_dirname, cur_undo_ptr%max_undo);
my_snprintf(diff_name, S(diff_name), "gunzip -c %s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%max_undo);
fd=popen(diff_name, "r");
if(!fd) {
fprintf(errfp, "pop_undo(): failed to open read pipe %s\n", diff_name);
@ -1181,7 +1181,7 @@ void pop_undo(int redo)
return;
}
#elif HAS_PIPE==1
my_snprintf(diff_name, S(diff_name), "%s/undo%d", undo_dirname, cur_undo_ptr%max_undo);
my_snprintf(diff_name, S(diff_name), "%s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%max_undo);
pipe(pd);
if((pid = fork())==0) { /* child process */
static char f[PATH_MAX] = "";
@ -1203,7 +1203,7 @@ void pop_undo(int redo)
close(pd[1]); /* close write side of pipe */
fd=fdopen(pd[0],"r");
#else /* uncompressed undo */
my_snprintf(diff_name, S(diff_name), "%s/undo%d", undo_dirname, cur_undo_ptr%max_undo);
my_snprintf(diff_name, S(diff_name), "%s/undo%d", xctx->undo_dirname, xctx->cur_undo_ptr%max_undo);
fd=fopen(diff_name, "r");
if(!fd) {
fprintf(errfp, "pop_undo(): failed to open read pipe %s\n", diff_name);

View File

@ -330,6 +330,7 @@ void init_pixdata()
void free_xschem_data()
{
int i;
delete_undo();
my_free(1098, &xctx->wire);
my_free(1100, &xctx->text);
my_free(1107, &xctx->inst);
@ -371,7 +372,21 @@ void free_xschem_data()
void alloc_xschem_data()
{
int i;
xctx = my_calloc(153, 1, sizeof(Xschem_ctx));
xctx->cur_undo_ptr = 0;
xctx->head_undo_ptr = 0;
xctx->tail_undo_ptr = 0;
xctx->undo_dirname = NULL;
#ifndef IN_MEMORY_UNDO
/* 20150327 create undo directory */
/* 20180923 no more mkdtemp (portability issues) */
if( !my_strdup(644, &xctx->undo_dirname, create_tmpdir("xschem_undo_") )) {
fprintf(errfp, "xinit(): problems creating tmp undo dir\n");
tcleval( "exit");
}
dbg(1, "xctx->undo_dirname=%s\n", xctx->undo_dirname);
#endif
xctx->zoom=CADINITIALZOOM;
xctx->mooz=1/CADINITIALZOOM;
xctx->xorigin=CADINITIALX;
@ -699,7 +714,6 @@ void xwin_exit(void)
dbg(1, "xwin_exit(): closed display\n");
my_free(1141, &filename);
delete_undo();
my_free(1142, &netlist_dir);
my_free(1143, &xschem_executable);
record_global_node(2, NULL, NULL); /* delete global node array */
@ -930,7 +944,7 @@ void new_schematic(const char *what, const char *tk_win_path, const char *filena
if(n <0) n = 0;
if(n > cnt) n = cnt;
xctx = save_xctx[n];
resetwin(1, 1, 0); /* create preview pixmap. resetwin(create_pixmap, clear_pixmap, force) */
resetwin(1, 1, 1); /* create preview pixmap. resetwin(create_pixmap, clear_pixmap, force) */
draw();
xctx = save;
set_modify(xctx->modified);
@ -952,7 +966,8 @@ void new_schematic(const char *what, const char *tk_win_path, const char *filena
if(n <0) n = 0;
if(n > cnt) n = cnt;
xctx = save_xctx[n];
resetwin(1, 1, 0); /* create preview pixmap. resetwin(create_pixmap, clear_pixmap, force) */
resetwin(1, 1, 1); /* create preview pixmap. resetwin(create_pixmap, clear_pixmap, force) */
draw();
set_modify(xctx->modified);
}
}
@ -1290,16 +1305,6 @@ int Tcl_AppInit(Tcl_Interp *inter)
/* */
alloc_data();
#ifndef IN_MEMORY_UNDO
/* 20150327 create undo directory */
/* 20180923 no more mkdtemp (portability issues) */
if( !my_strdup(644, &undo_dirname, create_tmpdir("xschem_undo_") )) {
fprintf(errfp, "xinit(): problems creating tmp undo dir\n");
tcleval( "exit");
}
dbg(1, "undo_dirname=%s\n", undo_dirname);
#endif
init_pixdata();
init_color_array(0.0);
my_snprintf(tmp, S(tmp), "%d",debug_var);

View File

@ -537,6 +537,10 @@ typedef struct {
cairo_surface_t *save_sfc;
cairo_t *cairo_save_ctx;
#endif
char *undo_dirname;
int cur_undo_ptr;
int tail_undo_ptr;
int head_undo_ptr;
} Xschem_ctx;
struct Lcc { /* used for symbols containing schematics as instances (LCC, Local Custom Cell) */
@ -666,10 +670,6 @@ extern char *xschem_version_string;
extern int split_files;
extern char *netlist_dir;
extern char bus_char[];
extern char *undo_dirname;
extern int cur_undo_ptr;
extern int tail_undo_ptr;
extern int head_undo_ptr;
extern int max_undo;
extern int draw_dots;
extern int draw_single_layer;
@ -1071,6 +1071,7 @@ extern void change_layer();
extern void launcher();
extern void windowid();
extern void preview_window(const char *what, const char *tk_win_path, const char *filename);
extern void new_schematic(const char *what, const char *tk_win_path, const char *filename);
extern int window_state (Display *disp, Window win, char *arg);
extern void toggle_fullscreen();
extern void toggle_only_probes();

View File

@ -3162,6 +3162,16 @@ proc new_window {what {path {}} {filename {}}} {
}
}
proc test1 {} {
xschem load /home/schippes/xschem-repo/trunk/xschem_library/rom8k/rom8k.sch
new_window create .xx /home/schippes/xschem-repo/trunk/xschem_library/examples/mos_power_ampli.sch
new_window create .yy /home/schippes/xschem-repo/trunk/xschem_library/examples/MSA-2643.sch
bind .xx <Expose> { new_window redraw 1 }
bind .yy <Expose> { new_window redraw 2 }
bind .xx <Enter> { new_window switch 1 }
bind .yy <Enter> { new_window switch 2 }
bind .drw <Enter> {+ new_window switch 0}
}