Mercurial > dwindows
comparison 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 |
comparison
equal
deleted
inserted
replaced
179:6803aba19dae | 180:4207e64d4689 |
---|---|
347 HBITMAP oldbitmap = (HBITMAP)SendMessage(handle, BM_GETIMAGE, IMAGE_BITMAP, 0); | 347 HBITMAP oldbitmap = (HBITMAP)SendMessage(handle, BM_GETIMAGE, IMAGE_BITMAP, 0); |
348 | 348 |
349 if(oldbitmap) | 349 if(oldbitmap) |
350 DeleteObject(oldbitmap); | 350 DeleteObject(oldbitmap); |
351 } | 351 } |
352 else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL))==0) /* Notebook */ | 352 else if(strnicmp(tmpbuf, FRAMECLASSNAME, strlen(FRAMECLASSNAME)+1)==0) |
353 { | |
354 Box *box = (Box *)thiscinfo; | |
355 | |
356 if(box->count && box->items) | |
357 free(box->items); | |
358 } | |
359 else if(strnicmp(tmpbuf, SplitbarClassName, strlen(SplitbarClassName)+1)==0) | |
360 { | |
361 void *data = dw_window_get_data(handle, "_dw_percent"); | |
362 | |
363 if(data) | |
364 free(data); | |
365 } | |
366 else if(strnicmp(tmpbuf, WC_TABCONTROL, strlen(WC_TABCONTROL)+1)==0) /* Notebook */ | |
353 { | 367 { |
354 NotebookPage **array = (NotebookPage **)GetWindowLong(handle, GWL_USERDATA); | 368 NotebookPage **array = (NotebookPage **)GetWindowLong(handle, GWL_USERDATA); |
355 | 369 |
356 if(array) | 370 if(array) |
357 { | 371 { |
372 | 386 |
373 dw_signal_disconnect_by_window(handle); | 387 dw_signal_disconnect_by_window(handle); |
374 | 388 |
375 if(thiscinfo) | 389 if(thiscinfo) |
376 { | 390 { |
391 SubclassWindow(handle, thiscinfo->pOldProc); | |
392 | |
377 /* Delete the brush so as not to leak GDI objects */ | 393 /* Delete the brush so as not to leak GDI objects */ |
378 if(thiscinfo->hbrush) | 394 if(thiscinfo->hbrush) |
379 DeleteObject(thiscinfo->hbrush); | 395 DeleteObject(thiscinfo->hbrush); |
380 | 396 |
381 /* Free user data linked list memory */ | 397 /* Free user data linked list memory */ |
3647 mii.cch = strlen(title); | 3663 mii.cch = strlen(title); |
3648 | 3664 |
3649 InsertMenuItem(menu, 65535, TRUE, &mii); | 3665 InsertMenuItem(menu, 65535, TRUE, &mii); |
3650 if(menux->hwnd) | 3666 if(menux->hwnd) |
3651 DrawMenuBar(menux->hwnd); | 3667 DrawMenuBar(menux->hwnd); |
3668 if(submenu) | |
3669 free(submenu); | |
3652 return (HWND)id; | 3670 return (HWND)id; |
3653 } | 3671 } |
3654 | 3672 |
3655 /* | 3673 /* |
3656 * Sets the state of a menu item check. | 3674 * Sets the state of a menu item check. |
7157 | 7175 |
7158 /* Functions for managing the user data lists that are associated with | 7176 /* Functions for managing the user data lists that are associated with |
7159 * a given window handle. Used in dw_window_set_data() and | 7177 * a given window handle. Used in dw_window_set_data() and |
7160 * dw_window_get_data(). | 7178 * dw_window_get_data(). |
7161 */ | 7179 */ |
7162 UserData *find_userdata(UserData **root, char *varname) | 7180 UserData *_find_userdata(UserData **root, char *varname) |
7163 { | 7181 { |
7164 UserData *tmp = *root; | 7182 UserData *tmp = *root; |
7165 | 7183 |
7166 while(tmp) | 7184 while(tmp) |
7167 { | 7185 { |
7170 tmp = tmp->next; | 7188 tmp = tmp->next; |
7171 } | 7189 } |
7172 return NULL; | 7190 return NULL; |
7173 } | 7191 } |
7174 | 7192 |
7175 int new_userdata(UserData **root, char *varname, void *data) | 7193 int _new_userdata(UserData **root, char *varname, void *data) |
7176 { | 7194 { |
7177 UserData *new = find_userdata(root, varname); | 7195 UserData *new = _find_userdata(root, varname); |
7178 | 7196 |
7179 if(new) | 7197 if(new) |
7180 { | 7198 { |
7181 new->data = data; | 7199 new->data = data; |
7182 return TRUE; | 7200 return TRUE; |
7210 } | 7228 } |
7211 } | 7229 } |
7212 return FALSE; | 7230 return FALSE; |
7213 } | 7231 } |
7214 | 7232 |
7215 int remove_userdata(UserData **root, char *varname, int all) | 7233 int _remove_userdata(UserData **root, char *varname, int all) |
7216 { | 7234 { |
7217 UserData *prev = NULL, *tmp = *root; | 7235 UserData *prev = NULL, *tmp = *root; |
7218 | 7236 |
7219 while(tmp) | 7237 while(tmp) |
7220 { | 7238 { |
7223 if(!prev) | 7241 if(!prev) |
7224 { | 7242 { |
7225 *root = tmp->next; | 7243 *root = tmp->next; |
7226 free(tmp->varname); | 7244 free(tmp->varname); |
7227 free(tmp); | 7245 free(tmp); |
7228 return 0; | 7246 if(!all) |
7247 return 0; | |
7248 tmp = *root; | |
7229 } | 7249 } |
7230 else | 7250 else |
7231 { | 7251 { |
7252 /* If all is true we should | |
7253 * never get here. | |
7254 */ | |
7232 prev->next = tmp->next; | 7255 prev->next = tmp->next; |
7233 free(tmp->varname); | 7256 free(tmp->varname); |
7234 free(tmp); | 7257 free(tmp); |
7235 return 0; | 7258 return 0; |
7236 } | 7259 } |
7237 } | 7260 } |
7238 prev = tmp; | 7261 else |
7239 tmp = tmp->next; | 7262 { |
7263 prev = tmp; | |
7264 tmp = tmp->next; | |
7265 } | |
7240 } | 7266 } |
7241 return 0; | 7267 return 0; |
7242 } | 7268 } |
7243 | 7269 |
7244 /* | 7270 /* |
7252 { | 7278 { |
7253 ColorInfo *cinfo = (ColorInfo *)GetWindowLong(window, GWL_USERDATA); | 7279 ColorInfo *cinfo = (ColorInfo *)GetWindowLong(window, GWL_USERDATA); |
7254 | 7280 |
7255 if(!cinfo) | 7281 if(!cinfo) |
7256 { | 7282 { |
7283 if(!dataname) | |
7284 return; | |
7285 | |
7257 cinfo = calloc(1, sizeof(ColorInfo)); | 7286 cinfo = calloc(1, sizeof(ColorInfo)); |
7258 SetWindowLong(window, GWL_USERDATA, (LONG)cinfo); | 7287 SetWindowLong(window, GWL_USERDATA, (LONG)cinfo); |
7259 } | 7288 } |
7260 | 7289 |
7261 if(cinfo) | 7290 if(cinfo) |
7262 { | 7291 { |
7263 if(data) | 7292 if(data) |
7264 new_userdata(&(cinfo->root), dataname, data); | 7293 _new_userdata(&(cinfo->root), dataname, data); |
7265 else | 7294 else |
7266 { | 7295 { |
7267 if(dataname) | 7296 if(dataname) |
7268 remove_userdata(&(cinfo->root), dataname, FALSE); | 7297 _remove_userdata(&(cinfo->root), dataname, FALSE); |
7269 else | 7298 else |
7270 remove_userdata(&(cinfo->root), NULL, TRUE); | 7299 _remove_userdata(&(cinfo->root), NULL, TRUE); |
7271 } | 7300 } |
7272 } | 7301 } |
7273 } | 7302 } |
7274 | 7303 |
7275 /* | 7304 /* |
7283 { | 7312 { |
7284 ColorInfo *cinfo = (ColorInfo *)GetWindowLong(window, GWL_USERDATA); | 7313 ColorInfo *cinfo = (ColorInfo *)GetWindowLong(window, GWL_USERDATA); |
7285 | 7314 |
7286 if(cinfo && cinfo->root && dataname) | 7315 if(cinfo && cinfo->root && dataname) |
7287 { | 7316 { |
7288 UserData *ud = find_userdata(&(cinfo->root), dataname); | 7317 UserData *ud = _find_userdata(&(cinfo->root), dataname); |
7289 if(ud) | 7318 if(ud) |
7290 return ud->data; | 7319 return ud->data; |
7291 } | 7320 } |
7292 return NULL; | 7321 return NULL; |
7293 } | 7322 } |