summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--win/tkWinButton.c42
2 files changed, 47 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 5c13d07..8ec6edf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2009-11-01 Joe Mistachkin <joe@mistachkin.com>
+
+ * 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-25 Donal K. Fellows <dkf@users.sf.net>
* unix/tkUnixColor.c (TkpGetColor): [Bug 2809525]: Impose a maximum
diff --git a/win/tkWinButton.c b/win/tkWinButton.c
index 30d8c8c..ad7e77d 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.20.2.4 2006/12/19 19:50:55 hobbs Exp $
+ * RCS: @(#) $Id: tkWinButton.c,v 1.20.2.5 2009/11/02 04:59:10 mistachkin Exp $
*/
#define OEMRESOURCE
@@ -164,6 +164,40 @@ InitBoxes()
/*
*----------------------------------------------------------------------
*
+ * 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
@@ -186,6 +220,7 @@ TkpButtonSetDefaults(specPtr)
* TK_OPTION_END. */
{
int width;
+ Tk_OptionSpec *savedSpecPtr = specPtr;
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
@@ -198,9 +233,12 @@ TkpButtonSetDefaults(specPtr)
}
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);
}
/*