From bcb6809211c95e27294400f9efa67ccf4dd0ac56 Mon Sep 17 00:00:00 2001 From: Joe Mistachkin Date: Mon, 2 Nov 2009 04:52:40 +0000 Subject: Fix for [Bug 1739613] --- ChangeLog | 7 +++++++ win/tkWinButton.c | 42 ++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index cfb2d9f..3090027 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-11-01 Joe Mistachkin + + * win/tkWinButton.c: [Bug 1739613]: The default width being stored + in TSD cannot be put into the process-wide options table. This fix + allocates storage for the default width from the heap and frees it + using an exit handler. + 2009-10-29 Pat Thoyts * win/tkWinFont.c: [Bug 1825353]: Backported patch for tiny diff --git a/win/tkWinButton.c b/win/tkWinButton.c index 22142c7..706f2cc 100644 --- a/win/tkWinButton.c +++ b/win/tkWinButton.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinButton.c,v 1.34.2.1 2009/10/05 15:08:07 patthoyts Exp $ + * RCS: @(#) $Id: tkWinButton.c,v 1.34.2.2 2009/11/02 04:52:40 mistachkin Exp $ */ #define OEMRESOURCE @@ -167,6 +167,40 @@ InitBoxes(void) /* *---------------------------------------------------------------------- * + * ButtonDefaultsExitHandler -- + * + * Frees the defaults for the buttons. + * + * Results: + * None. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +static void +ButtonDefaultsExitHandler( + ClientData clientData) /* Points to an array of option specs, + * terminated by one with type + * TK_OPTION_END. */ +{ + Tk_OptionSpec *specPtr = (Tk_OptionSpec *)clientData; + + for ( ; specPtr->type != TK_OPTION_END; specPtr++) { + if (specPtr->internalOffset == Tk_Offset(TkButton, borderWidth)) { + if (specPtr->defValue != NULL) { + ckfree((char *) specPtr->defValue); + specPtr->defValue = NULL; + } + } + } +} + +/* + *---------------------------------------------------------------------- + * * TkpButtonSetDefaults -- * * This procedure is invoked before option tables are created for @@ -189,6 +223,7 @@ TkpButtonSetDefaults( * TK_OPTION_END. */ { int width; + Tk_OptionSpec *savedSpecPtr = specPtr; ThreadSpecificData *tsdPtr = (ThreadSpecificData *) Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); @@ -201,9 +236,12 @@ TkpButtonSetDefaults( } for ( ; specPtr->type != TK_OPTION_END; specPtr++) { if (specPtr->internalOffset == Tk_Offset(TkButton, borderWidth)) { - specPtr->defValue = tsdPtr->defWidth; + char *defValue = (char *) ckalloc(strlen(tsdPtr->defWidth) + 1); + strcpy(defValue, tsdPtr->defWidth); + specPtr->defValue = defValue; } } + TkCreateExitHandler(ButtonDefaultsExitHandler, (ClientData) savedSpecPtr); } /* -- cgit v0.12