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 cfb2d9f..3090027 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-29 Pat Thoyts <patthoyts@users.sourceforge.net>
* 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);
}
/*