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 }