summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoe Mistachkin <joe@mistachkin.com>2009-11-02 04:52:40 (GMT)
committerJoe Mistachkin <joe@mistachkin.com>2009-11-02 04:52:40 (GMT)
commitbcb6809211c95e27294400f9efa67ccf4dd0ac56 (patch)
tree5955579ea4d3c7d80eda0ff841a46c2912de46f2
parentffa34bf2804cda3f87c6a7519e7f6e1a0ef288aa (diff)
downloadtk-bcb6809211c95e27294400f9efa67ccf4dd0ac56.zip
tk-bcb6809211c95e27294400f9efa67ccf4dd0ac56.tar.gz
tk-bcb6809211c95e27294400f9efa67ccf4dd0ac56.tar.bz2
Fix for [Bug 1739613]
-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);
}
/*