diff --git a/src/uifc/uifc.h b/src/uifc/uifc.h index cba55f346d5dfb218ff9e27e133ec36a656ae373..4e048f1f0e1dd465d7f0f55305bb307b2b04cd40 100644 --- a/src/uifc/uifc.h +++ b/src/uifc/uifc.h @@ -355,10 +355,6 @@ typedef struct { /****************************************************************************/ uint savnum; /****************************************************************************/ -/* The current overlapped-window save buffer depth. */ -/****************************************************************************/ - uint savdepth; -/****************************************************************************/ /* Screen length */ /****************************************************************************/ uint scrn_len; @@ -458,6 +454,12 @@ typedef struct { int (*list) (uifc_winmode_t, int left, int top, int width, int* dflt ,int* bar, const char *title, char** option); /****************************************************************************/ +/* Restore last saved window buffer (using WIN_SAV mode) */ +/* Decrements save_num if non-zero. */ +/* Can be used to return from a nested-list (with WIN_SAV) without ESC key. */ +/****************************************************************************/ + BOOL (*restore)(void); +/****************************************************************************/ /* Windowed string input routine. */ /* mode contains WIN_* flags to control display and functionality. */ /* left and top specify desired screen location. */ diff --git a/src/uifc/uifc32.c b/src/uifc/uifc32.c index 9dedd4a0d7cd3574e9b3d1c3802a4bbb4a3c9c07..459b0d3e689b7ad36278baeb7cfbfa9c62b4941e 100644 --- a/src/uifc/uifc32.c +++ b/src/uifc/uifc32.c @@ -75,6 +75,7 @@ static void upop(const char *str); static void sethelp(int line, char* file); static void showbuf(uifc_winmode_t, int left, int top, int width, int height, const char *title , const char *hbuf, int *curp, int *barp); +static BOOL restore(void); /* Dynamic menu support */ static int *last_menu_cur=NULL; @@ -229,6 +230,7 @@ int uifcini32(uifcapi_t* uifcapi) api->deny=deny; api->pop=upop; api->list=ulist; + api->restore=restore; api->input=uinput; api->sethelp=sethelp; api->showhelp=help; @@ -370,6 +372,20 @@ int uifcini32(uifcapi_t* uifcapi) return(0); } +static BOOL restore(void) +{ + if(api->savnum < 1) + return FALSE; + if(sav[api->savnum - 1].buf == NULL) + return FALSE; + --api->savnum; + vmem_puttext(sav[api->savnum].left,sav[api->savnum].top + ,sav[api->savnum].right,sav[api->savnum].bot + ,sav[api->savnum].buf); + FREE_AND_NULL(sav[api->savnum].buf); + return TRUE; +} + void docopy(void) { int key; @@ -698,8 +714,10 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar opts++; /* Sanity-check the savnum */ - if(mode&WIN_SAV && api->savnum>=MAX_BUFS-1) + if(mode&WIN_SAV && api->savnum>=MAX_BUFS-1) { putch(7); + mode &= ~WIN_SAV; + } api->help_available = (api->helpbuf!=NULL || api->helpixbfile[0]!=0); @@ -1154,16 +1172,11 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar uifc_mouse_enable(); } else if(mode&WIN_SAV) { - api->savnum--; if(!(api->mode&UIFC_NHM)) uifc_mouse_disable(); - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); + restore(); if(!(api->mode&UIFC_NHM)) uifc_mouse_enable(); - FREE_AND_NULL(sav[api->savnum].buf); } if(mode&WIN_XTR && (*cur)==opts-1) return(MSK_INS|*cur); @@ -1578,12 +1591,7 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar if(mode&WIN_ACT) inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); else if(mode&WIN_SAV) { - api->savnum--; - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); + restore(); } return((*cur)|MSK_EDIT); } @@ -1609,12 +1617,7 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar if(mode&WIN_INSACT) inactive_win(tmp_buffer, s_left+left,s_top+top,s_left+left+width-1,s_top+top+height-1,y, hbrdrsize, cclr, lclr, hclr, top); else if(mode&WIN_SAV) { - api->savnum--; - if(sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); + restore(); } if(!opts) { return(MSK_INS); @@ -1631,12 +1634,7 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar if(mode&WIN_DELACT) inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); + restore(); } return((*cur)|MSK_DEL); } @@ -1758,12 +1756,7 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar if(mode&WIN_ACT) inactive_win(tmp_buffer, s_left+left, s_top+top, s_left+left+width-1, s_top+top+height-1, y, hbrdrsize, cclr, lclr, hclr, top); else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); + restore(); } if(mode&WIN_XTR && (*cur)==opts-1) return(MSK_INS|*cur); @@ -1781,12 +1774,7 @@ int ulist(uifc_winmode_t mode, int left, int top, int width, int *cur, int *bar +left+width-1,s_top+top+height-1,tmp_buffer); } else if(mode&WIN_SAV) { - api->savnum--; - if (sav[api->savnum].buf != NULL) - vmem_puttext(sav[api->savnum].left,sav[api->savnum].top - ,sav[api->savnum].right,sav[api->savnum].bot - ,sav[api->savnum].buf); - FREE_AND_NULL(sav[api->savnum].buf); + restore(); } return(-1); case CTRL_F: /* find */