`xschem go_back 0` allows to go up in hierarchy *NOT* saving a modified schematic

This commit is contained in:
stefan schippers 2025-01-17 18:11:35 +01:00
parent 151241afc7
commit 025823f14c
5 changed files with 29 additions and 14 deletions

View File

@ -876,9 +876,11 @@ C {verilog_timescale.sym} 1050 -100 0 0 {name=s1 timestep="1ns" precision="1ns"
if returned value is 0 it means that last searched attribute did not exist </pre> if returned value is 0 it means that last searched attribute did not exist </pre>
<li><kbd> globals</kbd></li><pre> <li><kbd> globals</kbd></li><pre>
Return various global variables used in the program </pre> Return various global variables used in the program </pre>
<li><kbd> go_back [notitle]</kbd></li><pre> <li><kbd> go_back [what]</kbd></li><pre>
Go up one level (pop) in hierarchy Go up one level (pop) in hierarchy
if integer 'notitle' given pass it to the go_back() function (1=do not update window title) </pre> if integer 'what' given pass it to the go_back() function
what = 1: ask confirm save if current schematic modified.
what = 2: do not reset window title </pre>
<li><kbd> grabscreen</kbd></li><pre> <li><kbd> grabscreen</kbd></li><pre>
grab root window </pre> grab root window </pre>
<li><kbd> hash_file file [skip_path_lines]</kbd></li><pre> <li><kbd> hash_file file [skip_path_lines]</kbd></li><pre>

View File

@ -2409,13 +2409,20 @@ int descend_schematic(int instnumber, int fallback, int alert, int set_title)
return 1; return 1;
} }
void go_back(int confirm, int set_title) /* 20171006 add confirm */ /*
* what:
* 1: ask gui user confirm if schematic modified
* 2: do *NOT* reset window title
*/
void go_back(int what)
{ {
int save_ok; int save_ok;
int from_embedded_sym; int from_embedded_sym;
int save_modified; int save_modified;
char filename[PATH_MAX]; char filename[PATH_MAX];
int prev_sch_type; int prev_sch_type;
int confirm = what & 1;
int set_title = !(confirm & 2);
save_ok=1; save_ok=1;
dbg(1,"go_back(): sch[xctx->currsch]=%s\n", xctx->sch[xctx->currsch]); dbg(1,"go_back(): sch[xctx->currsch]=%s\n", xctx->sch[xctx->currsch]);
@ -2429,9 +2436,13 @@ void go_back(int confirm, int set_title) /* 20171006 add confirm */
tcleval("ask_save_optional"); tcleval("ask_save_optional");
if(!strcmp(tclresult(), "yes") ) save_ok = save_schematic(xctx->sch[xctx->currsch], 0); if(!strcmp(tclresult(), "yes") ) save_ok = save_schematic(xctx->sch[xctx->currsch], 0);
else if(!strcmp(tclresult(), "") ) return; else if(!strcmp(tclresult(), "") ) return;
} else {
save_ok = save_schematic(xctx->sch[xctx->currsch], 0);
} }
/* do not automatically save if confirm==0. Script developers should take care of this */
/*
* else {
* save_ok = save_schematic(xctx->sch[xctx->currsch], 0);
* }
*/
} }
if(save_ok==0) { if(save_ok==0) {
fprintf(errfp, "go_back(): file opening for write failed! %s \n", xctx->current_name); fprintf(errfp, "go_back(): file opening for write failed! %s \n", xctx->current_name);
@ -2458,7 +2469,7 @@ void go_back(int confirm, int set_title) /* 20171006 add confirm */
/* by default) to parent schematic if going back from embedded symbol */ /* by default) to parent schematic if going back from embedded symbol */
my_strncpy(filename, xctx->sch[xctx->currsch], S(filename)); my_strncpy(filename, xctx->sch[xctx->currsch], S(filename));
load_schematic(1, filename, (set_title & 1), 1); load_schematic(1, filename, set_title, 1);
/* if we are returning from a symbol created from a generator don't set modified flag on parent /* if we are returning from a symbol created from a generator don't set modified flag on parent
* as these symbols can not be edited / saved as embedded * as these symbols can not be edited / saved as embedded
* xctx->sch_inst_number[xctx->currsch + 1] == -1 --> we came from an inst with no embed flag set */ * xctx->sch_inst_number[xctx->currsch + 1] == -1 --> we came from an inst with no embed flag set */

View File

@ -1887,7 +1887,7 @@ static void context_menu_action(double mx, double my)
descend_symbol(); descend_symbol();
break; break;
case 14: case 14:
go_back(1, 1); go_back(1);
break; break;
case 15: /* copy selection into clipboard */ case 15: /* copy selection into clipboard */
rebuild_selected_array(); rebuild_selected_array();
@ -3043,7 +3043,7 @@ int rstate; /* (reduced state, without ShiftMask) */
if( (key=='e' && rstate == ControlMask) || (key==XK_BackSpace)) /* back */ if( (key=='e' && rstate == ControlMask) || (key==XK_BackSpace)) /* back */
{ {
if(xctx->semaphore >= 2) break; if(xctx->semaphore >= 2) break;
go_back(1, 1);break; go_back(1);break;
} }
if(key=='a' && rstate == 0) /* make symbol */ if(key=='a' && rstate == 0) /* make symbol */

View File

@ -2099,17 +2099,19 @@ int xschem(ClientData clientdata, Tcl_Interp *interp, int argc, const char * arg
#endif #endif
} }
/* go_back [notitle] /* go_back [what]
* Go up one level (pop) in hierarchy * Go up one level (pop) in hierarchy
* if integer 'notitle' given pass it to the go_back() function (1=do not update window title) */ * if integer 'what' given pass it to the go_back() function
* what = 1: ask confirm save if current schematic modified.
* what = 2: do not reset window title */
else if(!strcmp(argv[1], "go_back")) else if(!strcmp(argv[1], "go_back"))
{ {
int set_title = 1; int what = 1;
if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;} if(!xctx) {Tcl_SetResult(interp, not_avail, TCL_STATIC); return TCL_ERROR;}
if(argc > 2 ) { if(argc > 2 ) {
set_title = atoi(argv[2]); what = atoi(argv[2]);
} }
if((xctx->semaphore == 0)) go_back(0, set_title); if((xctx->semaphore == 0)) go_back(what);
Tcl_ResetResult(interp); Tcl_ResetResult(interp);
} }

View File

@ -1528,7 +1528,7 @@ extern void toggle_ignore(void);
extern void get_additional_symbols(int what); extern void get_additional_symbols(int what);
extern int change_sch_path(int instnumber, int dr); extern int change_sch_path(int instnumber, int dr);
extern int descend_schematic(int instnumber, int fallback, int alert, int set_title); extern int descend_schematic(int instnumber, int fallback, int alert, int set_title);
extern void go_back(int confirm, int set_title); extern void go_back(int what); /* what == 1: confirm save; what == 2: do not reset window title */
extern void clear_schematic(int cancel, int symbol); extern void clear_schematic(int cancel, int symbol);
extern void view_unzoom(double z); extern void view_unzoom(double z);
extern void view_zoom(double z); extern void view_zoom(double z);