diff options
author | peter.spjuth@gmail.com <pspjuth> | 2004-09-16 18:22:21 (GMT) |
---|---|---|
committer | peter.spjuth@gmail.com <pspjuth> | 2004-09-16 18:22:21 (GMT) |
commit | f87160fcd88597188f0f271d905790b5591ded58 (patch) | |
tree | c14131be0da81ab6a5df59e4b7e06483716094b9 /generic/tkPlace.c | |
parent | 43d4a599d72fb6de42b9c97de6aeea661b90a174 (diff) | |
download | tk-f87160fcd88597188f0f271d905790b5591ded58.zip tk-f87160fcd88597188f0f271d905790b5591ded58.tar.gz tk-f87160fcd88597188f0f271d905790b5591ded58.tar.bz2 |
Fixed a memory leak when a placed widget was forgotten. [Bug 1028888]
Diffstat (limited to 'generic/tkPlace.c')
-rw-r--r-- | generic/tkPlace.c | 50 |
1 files changed, 41 insertions, 9 deletions
diff --git a/generic/tkPlace.c b/generic/tkPlace.c index 05a75fb..757891a 100644 --- a/generic/tkPlace.c +++ b/generic/tkPlace.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkPlace.c,v 1.13 2002/11/07 19:10:30 pspjuth Exp $ + * RCS: @(#) $Id: tkPlace.c,v 1.13.2.1 2004/09/16 18:22:21 pspjuth Exp $ */ #include "tkPort.h" @@ -49,6 +49,8 @@ typedef struct Slave { * master was deleted or never assigned. */ struct Slave *nextPtr; /* Next in list of windows placed relative * to same master (NULL for end of list). */ + Tk_OptionTable optionTable; /* Table that defines configuration options + * available for this command. */ /* * Geometry information for window; where there are both relative * and absolute values for the same attribute (e.g. x and relX) only @@ -170,7 +172,9 @@ static int ConfigureSlave _ANSI_ARGS_((Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[])); static int PlaceInfoCommand _ANSI_ARGS_((Tcl_Interp *interp, Tk_Window tkwin)); -static Slave * CreateSlave _ANSI_ARGS_((Tk_Window tkwin)); +static Slave * CreateSlave _ANSI_ARGS_((Tk_Window tkwin, + Tk_OptionTable table)); +static void FreeSlave _ANSI_ARGS_((Slave *slavePtr)); static Slave * FindSlave _ANSI_ARGS_((Tk_Window tkwin)); static Master * CreateMaster _ANSI_ARGS_((Tk_Window tkwin)); static Master * FindMaster _ANSI_ARGS_((Tk_Window tkwin)); @@ -325,7 +329,7 @@ Tk_PlaceObjCmd(clientData, interp, objc, objv) SlaveStructureProc, (ClientData) slavePtr); Tk_ManageGeometry(tkwin, (Tk_GeomMgr *) NULL, (ClientData) NULL); Tk_UnmapWindow(tkwin); - ckfree((char *) slavePtr); + FreeSlave(slavePtr); break; } @@ -379,8 +383,9 @@ Tk_PlaceObjCmd(clientData, interp, objc, objv) */ static Slave * -CreateSlave(tkwin) +CreateSlave(tkwin, table) Tk_Window tkwin; /* Token for desired slave. */ + Tk_OptionTable table; { Tcl_HashEntry *hPtr; register Slave *slavePtr; @@ -395,6 +400,7 @@ CreateSlave(tkwin) slavePtr->inTkwin = None; slavePtr->anchor = TK_ANCHOR_NW; slavePtr->borderMode = BM_INSIDE; + slavePtr->optionTable = table; Tcl_SetHashValue(hPtr, slavePtr); Tk_CreateEventHandler(tkwin, StructureNotifyMask, SlaveStructureProc, (ClientData) slavePtr); @@ -404,6 +410,32 @@ CreateSlave(tkwin) } return slavePtr; } + + +/* + *---------------------------------------------------------------------- + * + * FreeSlave -- + * + * Frees the resources held by a Slave structure. + * + * Results: + * None + * + * Side effects: + * Memory are freed. + * + *---------------------------------------------------------------------- + */ + +static void +FreeSlave(Slave *slavePtr) +{ + Tk_FreeConfigOptions((char *) slavePtr, slavePtr->optionTable, + slavePtr->tkwin); + ckfree((char *) slavePtr); +} + /* *---------------------------------------------------------------------- @@ -600,9 +632,9 @@ ConfigureSlave(interp, tkwin, table, objc, objv) return TCL_ERROR; } - slavePtr = CreateSlave(tkwin); - - if (Tk_SetOptions(interp, (char *)slavePtr, table, objc, objv, + slavePtr = CreateSlave(tkwin, table); + + if (Tk_SetOptions(interp, (char *) slavePtr, table, objc, objv, slavePtr->tkwin, &savedOptions, &mask) != TCL_OK) { Tk_RestoreSavedOptions(&savedOptions); result = TCL_ERROR; @@ -1077,7 +1109,7 @@ SlaveStructureProc(clientData, eventPtr) UnlinkSlave(slavePtr); Tcl_DeleteHashEntry(Tcl_FindHashEntry(&dispPtr->slaveTable, (char *) slavePtr->tkwin)); - ckfree((char *) slavePtr); + FreeSlave(slavePtr); } } @@ -1159,5 +1191,5 @@ PlaceLostSlaveProc(clientData, tkwin) (char *) tkwin)); Tk_DeleteEventHandler(tkwin, StructureNotifyMask, SlaveStructureProc, (ClientData) slavePtr); - ckfree((char *) slavePtr); + FreeSlave(slavePtr); } |