changeset 180:4207e64d4689

Fixing leaks on Windows and OS/2.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Mon, 02 Dec 2002 19:30:02 +0000
parents 6803aba19dae
children 978b954eb70e
files os2/dw.c win/dw.c
diffstat 2 files changed, 105 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/os2/dw.c	Sun Dec 01 16:21:21 2002 +0000
+++ b/os2/dw.c	Mon Dec 02 19:30:02 2002 +0000
@@ -235,9 +235,41 @@
 
 	dw_signal_disconnect_by_window(handle);
 
+	if((child = WinWindowFromID(handle, FID_CLIENT)) != NULLHANDLE)
+	{
+		Box *box = (Box *)WinQueryWindowPtr(child, QWP_USER);
+
+		if(box)
+		{
+			if(box->count && box->items)
+				free(box->items);
+
+			WinSetWindowPtr(child, QWP_USER, 0);
+			free(box);
+		}
+	}
+
 	if(ptr)
 	{
 		WindowData *wd = (WindowData *)ptr;
+		char tmpbuf[100];
+
+		WinQueryClassName(handle, 99, tmpbuf);
+
+		if(strncmp(tmpbuf, "#1", 3)==0)
+		{
+			Box *box = (Box *)ptr;
+
+			if(box->count && box->items)
+				free(box->items);
+		}
+		else if(strncmp(tmpbuf, SplitbarClassName, strlen(SplitbarClassName)+1)==0)
+		{
+			void *data = dw_window_get_data(handle, "_dw_percent");
+
+			if(data)
+				free(data);
+		}
 
 		if(wd->oldproc)
 			WinSubclassWindow(handle, wd->oldproc);
@@ -3730,6 +3762,8 @@
 			   MM_INSERTITEM,
 			   MPFROMP(&miSubMenu),
 			   MPFROMP(title));
+	if(submenu)
+		free(submenu);
 	return (HWND)id;
 }
 
@@ -3911,11 +3945,10 @@
 							   id,
 							   NULL,
 							   NULL);
+	blah->oldproc = WinSubclassWindow(tmp, _statusproc);
+	WinSetWindowPtr(tmp, QWP_USER, blah);
 	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_PALEGRAY);
-
-	blah->oldproc = WinSubclassWindow(tmp, _statusproc);
-	WinSetWindowPtr(tmp, QWP_USER, blah);
 	return tmp;
 }
 
@@ -3944,9 +3977,9 @@
 							   id,
 							   NULL,
 							   NULL);
-	dw_window_set_font(tmp, DefaultFont);
 	blah->oldproc = WinSubclassWindow(tmp, _mleproc);
 	WinSetWindowPtr(tmp, QWP_USER, blah);
+	dw_window_set_font(tmp, DefaultFont);
 	return tmp;
 }
 
@@ -3971,9 +4004,9 @@
 							   id,
 							   NULL,
 							   NULL);
-	dw_window_set_font(tmp, DefaultFont);
 	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
 	WinSetWindowPtr(tmp, QWP_USER, blah);
+	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_WHITE);
 	return tmp;
 }
@@ -3998,9 +4031,9 @@
 							   id,
 							   NULL,
 							   NULL);
-	dw_window_set_font(tmp, DefaultFont);
 	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
 	WinSetWindowPtr(tmp, QWP_USER, blah);
+	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_WHITE);
 	return tmp;
 }
@@ -4031,13 +4064,13 @@
 	{
 		WindowData *moreblah = calloc(1, sizeof(WindowData));
 		moreblah->oldproc = WinSubclassWindow(child, _comboentryproc);
+		WinSetWindowPtr(child, QWP_USER, moreblah);
 		dw_window_set_color(child, DW_CLR_BLACK, DW_CLR_WHITE);
-		WinSetWindowPtr(child, QWP_USER, moreblah);
 	}
 	WinEndEnumWindows(henum);
-	dw_window_set_font(tmp, DefaultFont);
 	blah->oldproc = WinSubclassWindow(tmp, _comboproc);
 	WinSetWindowPtr(tmp, QWP_USER, blah);
+	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_WHITE);
 	return tmp;
 }
@@ -4162,12 +4195,12 @@
 							   NULL,
 							   NULL);
 	HWND entry = _find_entryfield(tmp);
-	dw_window_set_font(tmp, DefaultFont);
 	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
 	WinSetWindowPtr(tmp, QWP_USER, blah);
 	blah = calloc(sizeof(WindowData), 1);
 	blah->oldproc = WinSubclassWindow(entry, _spinentryproc);
 	WinSetWindowPtr(entry, QWP_USER, blah);
+	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(entry, DW_CLR_BLACK, DW_CLR_WHITE);
 	return tmp;
 }
@@ -4192,10 +4225,10 @@
 							   id,
 							   NULL,
 							   NULL);
+	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
+	WinSetWindowPtr(tmp, QWP_USER, blah);
 	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_PALEGRAY);
-	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
-	WinSetWindowPtr(tmp, QWP_USER, blah);
 	return tmp;
 }
 
@@ -4252,9 +4285,9 @@
 							   id,
 							   NULL,
 							   NULL);
-	dw_window_disable(tmp);
 	blah->oldproc = WinSubclassWindow(tmp, _percentproc);
 	WinSetWindowPtr(tmp, QWP_USER, blah);
+	dw_window_disable(tmp);
 	return tmp;
 }
 
@@ -4277,12 +4310,12 @@
 							   id,
 							   NULL,
 							   NULL);
-	dw_window_set_font(tmp, DefaultFont);
-	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_PALEGRAY);
 	bubble->id = id;
 	bubble->bubbletext[0] = '\0';
 	bubble->pOldProc = WinSubclassWindow(tmp, _BtProc);
 	WinSetWindowPtr(tmp, QWP_USER, bubble);
+	dw_window_set_font(tmp, DefaultFont);
+	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_PALEGRAY);
 	return tmp;
 }
 
@@ -4306,10 +4339,10 @@
 							   id,
 							   NULL,
 							   NULL);
+	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
+	WinSetWindowPtr(tmp, QWP_USER, blah);
 	dw_window_set_font(tmp, DefaultFont);
 	dw_window_set_color(tmp, DW_CLR_BLACK, DW_CLR_WHITE);
-	blah->oldproc = WinSubclassWindow(tmp, _entryproc);
-	WinSetWindowPtr(tmp, QWP_USER, blah);
 	return tmp;
 }
 
@@ -7453,18 +7486,26 @@
 				*root = tmp->next;
 				free(tmp->varname);
 				free(tmp);
-				return 0;
+				if(!all)
+					return 0;
+				tmp = *root;
 			}
 			else
 			{
+				/* If all is true we should
+				 * never get here.
+				 */
 				prev->next = tmp->next;
 				free(tmp->varname);
 				free(tmp);
 				return 0;
 			}
 		}
-		prev = tmp;
-		tmp = tmp->next;
+		else
+		{
+			prev = tmp;
+			tmp = tmp->next;
+		}
 	}
 	return 0;
 }
@@ -7482,6 +7523,9 @@
 
 	if(!blah)
 	{
+		if(!dataname)
+			return;
+
 		blah = calloc(1, sizeof(WindowData));
 		WinSetWindowPtr(window, QWP_USER, blah);
 	}
--- a/win/dw.c	Sun Dec 01 16:21:21 2002 +0000
+++ b/win/dw.c	Mon Dec 02 19:30:02 2002 +0000
@@ -349,7 +349,21 @@
 		if(oldbitmap)
 			DeleteObject(oldbitmap);
 	}
-	else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL))==0) /* Notebook */
+	else if(strnicmp(tmpbuf, FRAMECLASSNAME, strlen(FRAMECLASSNAME)+1)==0)
+	{
+		Box *box = (Box *)thiscinfo;
+
+		if(box->count && box->items)
+			free(box->items);
+	}
+	else if(strnicmp(tmpbuf, SplitbarClassName, strlen(SplitbarClassName)+1)==0)
+	{
+		void *data = dw_window_get_data(handle, "_dw_percent");
+
+		if(data)
+			free(data);
+	}
+	else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL)+1)==0) /* Notebook */
 	{
 		NotebookPage **array = (NotebookPage **)GetWindowLong(handle, GWL_USERDATA);
 
@@ -374,6 +388,8 @@
 
 	if(thiscinfo)
 	{
+		SubclassWindow(handle, thiscinfo->pOldProc);
+
 		/* Delete the brush so as not to leak GDI objects */
 		if(thiscinfo->hbrush)
 			DeleteObject(thiscinfo->hbrush);
@@ -3649,6 +3665,8 @@
 	InsertMenuItem(menu, 65535, TRUE, &mii);
 	if(menux->hwnd)
 		DrawMenuBar(menux->hwnd);
+	if(submenu)
+		free(submenu);
 	return (HWND)id;
 }
 
@@ -7159,7 +7177,7 @@
  * a given window handle.  Used in dw_window_set_data() and
  * dw_window_get_data().
  */
-UserData *find_userdata(UserData **root, char *varname)
+UserData *_find_userdata(UserData **root, char *varname)
 {
 	UserData *tmp = *root;
 
@@ -7172,9 +7190,9 @@
 	return NULL;
 }
 
-int new_userdata(UserData **root, char *varname, void *data)
-{
-	UserData *new = find_userdata(root, varname);
+int _new_userdata(UserData **root, char *varname, void *data)
+{
+	UserData *new = _find_userdata(root, varname);
 
 	if(new)
 	{
@@ -7212,7 +7230,7 @@
 	return FALSE;
 }
 
-int remove_userdata(UserData **root, char *varname, int all)
+int _remove_userdata(UserData **root, char *varname, int all)
 {
 	UserData *prev = NULL, *tmp = *root;
 
@@ -7225,18 +7243,26 @@
 				*root = tmp->next;
 				free(tmp->varname);
 				free(tmp);
-				return 0;
+				if(!all)
+					return 0;
+				tmp = *root;
 			}
 			else
 			{
+				/* If all is true we should
+				 * never get here.
+				 */
 				prev->next = tmp->next;
 				free(tmp->varname);
 				free(tmp);
 				return 0;
 			}
 		}
-		prev = tmp;
-		tmp = tmp->next;
+		else
+		{
+			prev = tmp;
+			tmp = tmp->next;
+		}
 	}
 	return 0;
 }
@@ -7254,6 +7280,9 @@
 
 	if(!cinfo)
 	{
+		if(!dataname)
+			return;
+
 		cinfo = calloc(1, sizeof(ColorInfo));
 		SetWindowLong(window, GWL_USERDATA, (LONG)cinfo);
 	}
@@ -7261,13 +7290,13 @@
 	if(cinfo)
 	{
 		if(data)
-			new_userdata(&(cinfo->root), dataname, data);
+			_new_userdata(&(cinfo->root), dataname, data);
 		else
 		{
 			if(dataname)
-				remove_userdata(&(cinfo->root), dataname, FALSE);
+				_remove_userdata(&(cinfo->root), dataname, FALSE);
 			else
-				remove_userdata(&(cinfo->root), NULL, TRUE);
+				_remove_userdata(&(cinfo->root), NULL, TRUE);
 		}
 	}
 }
@@ -7285,7 +7314,7 @@
 
 	if(cinfo && cinfo->root && dataname)
 	{
-		UserData *ud = find_userdata(&(cinfo->root), dataname);
+		UserData *ud = _find_userdata(&(cinfo->root), dataname);
 		if(ud)
 			return ud->data;
 	}