diff win/dw.c @ 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 e3dd5c765775
children 978b954eb70e
line wrap: on
line diff
--- 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;
 	}