Mercurial > dwindows
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; }