From 2c0a236e9aaac46bf9bf2d5f64bb1e94d3403e39 Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 25 Nov 2005 21:59:09 +0000
Subject: [PATCH] Make WIN_SAV|WIN_ACT work the way it looks like it's supposed
 to. Remove useless api->savdepth.

---
 src/uifc/uifc32.c | 37 +++++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/src/uifc/uifc32.c b/src/uifc/uifc32.c
index 39d1ba982d..4783cb6761 100644
--- a/src/uifc/uifc32.c
+++ b/src/uifc/uifc32.c
@@ -290,6 +290,9 @@ int uifcini32(uifcapi_t* uifcapi)
 
 	api->initialized=TRUE;
 
+	for(i=0; i<MAX_BUFS; i++)
+		sav[i].buf=NULL;
+
     return(0);
 }
 
@@ -621,8 +624,8 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 	if(mode&WIN_DYN && mode&WIN_NODRAW)
 		is_redraw=0;
 
-	if(!is_redraw) {
-		if(mode&WIN_SAV && api->savdepth==api->savnum) {
+	if(mode&WIN_SAV) {
+		if(sav[api->savnum].buf==NULL) {
 			if((sav[api->savnum].buf=(char *)malloc((width+3)*(height+2)*2))==NULL) {
 				cprintf("UIFC line %d: error allocating %u bytes."
 					,__LINE__,(width+3)*(height+2)*2);
@@ -636,16 +639,15 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 			sav[api->savnum].top=s_top+top;
 			sav[api->savnum].right=s_left+left+width+1;
 			sav[api->savnum].bot=s_top+top+height;
-			api->savdepth++;
 		}
-		else if(mode&WIN_SAV
+		else if(sav[api->savnum].buf != NULL
 			&& (sav[api->savnum].left!=s_left+left
 			|| sav[api->savnum].top!=s_top+top
 			|| sav[api->savnum].right!=s_left+left+width+1
 			|| sav[api->savnum].bot!=s_top+top+height)) { /* dimensions have changed */
 			puttext(sav[api->savnum].left,sav[api->savnum].top,sav[api->savnum].right,sav[api->savnum].bot
 				,sav[api->savnum].buf);	/* put original window back */
-			free(sav[api->savnum].buf);
+			FREE_AND_NULL(sav[api->savnum].buf);
 			if((sav[api->savnum].buf=(char *)malloc((width+3)*(height+2)*2))==NULL) {
 				cprintf("UIFC line %d: error allocating %u bytes."
 					,__LINE__,(width+3)*(height+2)*2);
@@ -923,7 +925,7 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 	#if 0					/* debug */
 		gotoxy(30,1);
 		cprintf("y=%2d h=%2d c=%2d b=%2d s=%2d o=%2d"
-			,y,height,*cur,bar ? *bar :0xff,api->savdepth,opts);
+			,y,height,*cur,bar ? *bar :0xff,api->savnum,opts);
 	#endif
 		if(api->timedisplay != NULL)
 			api->timedisplay(/* force? */FALSE);
@@ -947,6 +949,8 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 						if(!opts)
 							continue;
 
+						if(mode&WIN_SAV)
+							api->savnum++;
 						if(mode&WIN_ACT) {
 							uifc_mouse_disable();
 							if((win=(char *)malloc((width+3)*(height+2)*2))==NULL) {
@@ -968,13 +972,15 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 							uifc_mouse_enable();
 						}
 						else if(mode&WIN_SAV) {
+							api->savnum--;
 							uifc_mouse_disable();
 							puttext(sav[api->savnum].left,sav[api->savnum].top
 								,sav[api->savnum].right,sav[api->savnum].bot
 								,sav[api->savnum].buf);
 							uifc_mouse_enable();
-							free(sav[api->savnum].buf);
-							api->savdepth--;
+							FREE_AND_NULL(sav[api->savnum].buf);
+							if(api->savnum)
+								api->savnum--;
 						}
 						if(mode&WIN_XTR && (*cur)==opts-1)
 							return(MSK_INS|*cur);
@@ -1496,6 +1502,8 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 						case CR:
 							if(!opts)
 								break;
+							if(mode&WIN_SAV)
+								api->savnum++;
 							if(mode&WIN_ACT) {
 								gettext(s_left+left,s_top+top,s_left
 									+left+width-1,s_top+top+height-1,tmp_buffer);
@@ -1509,11 +1517,13 @@ int ulist(int 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--;
 								puttext(sav[api->savnum].left,sav[api->savnum].top
 									,sav[api->savnum].right,sav[api->savnum].bot
 									,sav[api->savnum].buf);
-								free(sav[api->savnum].buf);
-								api->savdepth--; 
+								FREE_AND_NULL(sav[api->savnum].buf);
+								if(api->savnum)
+									api->savnum--;
 							}
 							if(mode&WIN_XTR && (*cur)==opts-1)
 								return(MSK_INS|*cur);
@@ -1533,8 +1543,9 @@ int ulist(int mode, int left, int top, int width, int *cur, int *bar
 								puttext(sav[api->savnum].left,sav[api->savnum].top
 									,sav[api->savnum].right,sav[api->savnum].bot
 									,sav[api->savnum].buf);
-								free(sav[api->savnum].buf);
-								api->savdepth--; 
+								FREE_AND_NULL(sav[api->savnum].buf);
+								if(api->savnum)
+									api->savnum--;
 							}
 							return(-1);
 						default:
@@ -1746,9 +1757,7 @@ void umsg(char *str)
 	if(api->mode&UIFC_INMSG)	/* non-cursive */
 		return;
 	api->mode|=UIFC_INMSG;
-	if(api->savdepth) api->savnum++;
 	ulist(WIN_SAV|WIN_MID,0,0,0,&i,0,str,ok);
-	if(api->savdepth) api->savnum--;
 	api->mode&=~UIFC_INMSG;
 }
 
-- 
GitLab