diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | doc/getOpenFile.n | 13 | ||||
-rw-r--r-- | library/tkfbox.tcl | 14 | ||||
-rw-r--r-- | library/xmfbox.tcl | 14 | ||||
-rw-r--r-- | macosx/tkMacOSXDialog.c | 9 | ||||
-rw-r--r-- | win/tkWinDialog.c | 471 |
6 files changed, 282 insertions, 248 deletions
@@ -1,5 +1,14 @@ 2009-10-22 Donal K. Fellows <dkf@users.sf.net> + * library/tkfbox.tcl (::tk::dialog::file::, Done): + * library/xmfbox.tcl (MotifFDialog_FileTypes) + (MotifFDialog_ActivateSEnt): + * macosx/tkMacOSXDialog.c (Tk_GetOpenFileObjCmd): + * win/tkWinDialog.c (GetFileNameW, GetFileNameA): + * doc/getOpenFile.n: [Patch 2168768]: Corrected handling of the + -typevariable option to be consistently global; it's the only way it + can work even close to the same on all platforms. + * macosx/ttkMacOSXTheme.c (RangeToFactor): [Bug 2883712]: Factor out some common code and make sure that it is 64-bit correct. diff --git a/doc/getOpenFile.n b/doc/getOpenFile.n index 1cff6d6..f378c44 100644 --- a/doc/getOpenFile.n +++ b/doc/getOpenFile.n @@ -4,7 +4,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: getOpenFile.n,v 1.25 2008/09/23 13:36:40 dkf Exp $ +'\" RCS: @(#) $Id: getOpenFile.n,v 1.26 2009/10/22 10:12:57 dkf Exp $ '\" .so man.macros .TH tk_getOpenFile n 4.2 Tk "Tk Built-In Commands" @@ -38,6 +38,7 @@ The following \fIoption\-value\fR pairs are possible as command line arguments to these two commands: .TP \fB\-defaultextension\fR \fIextension\fR +. Specifies a string that will be appended to the filename if the user enters a filename without an extension. The default value is the empty string, which means no extension will be appended to the filename in @@ -47,6 +48,7 @@ and the UNIX implementation guesses reasonable values for this from the \fB\-filetypes\fR option when this is not supplied. .TP \fB\-filetypes\fR \fIfilePatternList\fR +. If a \fBFile types\fR listbox exists in the file dialog on the particular platform, this option gives the \fIfiletype\fRs in this listbox. When the user choose a filetype in the listbox, only the files of that type @@ -57,6 +59,7 @@ types. See the section \fBSPECIFYING FILE PATTERNS\fR below for a discussion on the contents of \fIfilePatternList\fR. .TP \fB\-initialdir\fR \fIdirectory\fR +. Specifies that the files in \fIdirectory\fR should be displayed when the dialog pops up. If this parameter is not specified, then the files in the current working directory are displayed. If the @@ -64,26 +67,32 @@ parameter specifies a relative path, the return value will convert the relative path to an absolute path. .TP \fB\-initialfile\fR \fIfilename\fR +. Specifies a filename to be displayed in the dialog when it pops up. .TP \fB\-message\fR \fIstring\fR +. Specifies a message to include in the client area of the dialog. This is only available on Mac OS X. .TP \fB\-multiple\fR \fIboolean\fR +. Allows the user to choose multiple files from the Open dialog. .TP \fB\-parent\fR \fIwindow\fR +. Makes \fIwindow\fR the logical parent of the file dialog. The file dialog is displayed on top of its parent window. On Mac OS X, this turns the file dialog into a sheet attached to the parent window. .TP \fB\-title\fR \fItitleString\fR +. Specifies a string to display as the title of the dialog box. If this option is not specified, then a default title is displayed. .TP \fB\-typevariable\fR \fIvariableName\fR -The variable \fIvariableName\fR is used to preselect which filter is +. +The global variable \fIvariableName\fR is used to preselect which filter is used from \fIfilterList\fR when the dialog box is opened and is updated when the dialog box is closed, to the last selected filter. The variable is read once at the beginning to select the diff --git a/library/tkfbox.tcl b/library/tkfbox.tcl index 29fc665..b3c7156 100644 --- a/library/tkfbox.tcl +++ b/library/tkfbox.tcl @@ -10,7 +10,7 @@ # "Directory" option menu. The user can select files by clicking on the # file icons or by entering a filename in the "Filename:" entry. # -# RCS: @(#) $Id: tkfbox.tcl,v 1.74 2009/04/14 18:09:50 dkf Exp $ +# RCS: @(#) $Id: tkfbox.tcl,v 1.75 2009/10/22 10:12:57 dkf Exp $ # # Copyright (c) 1994-1998 Sun Microsystems, Inc. # @@ -172,9 +172,11 @@ proc ::tk::dialog::file:: {type args} { # Default type and name to first entry set initialtype [lindex $data(-filetypes) 0] set initialTypeName [lindex $initialtype 0] - if {($data(-typevariable) ne "") - && [uplevel 1 [list info exists $data(-typevariable)]]} { - set initialTypeName [uplevel 1 [list set $data(-typevariable)]] + if {$data(-typevariable) ne ""} { + upvar #0 $data(-typevariable) typeVariable + if {[info exists typeVariable]} { + set initialTypeName $typeVariable + } } foreach type $data(-filetypes) { set title [lindex $type 0] @@ -1133,8 +1135,8 @@ proc ::tk::dialog::file::Done {w {selectFilePath ""}} { && [info exists data(-filetypes)] && [llength $data(-filetypes)] && [info exists data(filterType)] && $data(filterType) ne "" } then { - upvar 4 $data(-typevariable) initialTypeName - set initialTypeName [lindex $data(filterType) 0] + upvar #0 $data(-typevariable) typeVariable + set typeVariable [lindex $data(filterType) 0] } } bind $data(okBtn) <Destroy> {} diff --git a/library/xmfbox.tcl b/library/xmfbox.tcl index 803d0ec..e89041e 100644 --- a/library/xmfbox.tcl +++ b/library/xmfbox.tcl @@ -4,7 +4,7 @@ # Unix platform. This implementation is used only if the # "::tk_strictMotif" flag is set. # -# RCS: @(#) $Id: xmfbox.tcl,v 1.33 2009/04/14 18:09:50 dkf Exp $ +# RCS: @(#) $Id: xmfbox.tcl,v 1.34 2009/10/22 10:12:57 dkf Exp $ # # Copyright (c) 1996 Sun Microsystems, Inc. # Copyright (c) 1998-2000 Scriptics Corporation @@ -159,9 +159,11 @@ proc ::tk::MotifFDialog_FileTypes {w} { # set data(fileType) $data(-defaulttype) # Default type to first entry set initialTypeName [lindex $data(-filetypes) 0 0] - if {($data(-typevariable) ne "") - && [uplevel 3 [list info exists $data(-typevariable)]]} { - set initialTypeName [uplevel 3 [list set $data(-typevariable)]] + if {$data(-typevariable) ne ""} { + upvar #0 $data(-typevariable) typeVariable + if {[info exists typeVariable]} { + set initialTypeName $typeVariable + } } set ix 0 set data(fileType) 0 @@ -864,8 +866,8 @@ proc ::tk::MotifFDialog_ActivateSEnt {w} { # Return selected filter if {[info exists data(-typevariable)] && $data(-typevariable) ne "" && [info exists data(-filetypes)] && $data(-filetypes) ne ""} { - upvar 2 $data(-typevariable) initialTypeName - set initialTypeName [lindex $data(-filetypes) $data(fileType) 0] + upvar #0 $data(-typevariable) typeVariable + set typeVariable [lindex $data(-filetypes) $data(fileType) 0] } if {$data(-multiple) != 0} { diff --git a/macosx/tkMacOSXDialog.c b/macosx/tkMacOSXDialog.c index 196d755..cc45c53 100644 --- a/macosx/tkMacOSXDialog.c +++ b/macosx/tkMacOSXDialog.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: tkMacOSXDialog.c,v 1.46 2009/07/06 20:29:21 dkf Exp $ + * RCS: @(#) $Id: tkMacOSXDialog.c,v 1.47 2009/10/22 10:12:57 dkf Exp $ */ #include "tkMacOSXPrivate.h" @@ -498,7 +498,12 @@ Tk_GetOpenFileObjCmd( } result = (returnCode != NSAlertErrorReturn) ? TCL_OK : TCL_ERROR; if (typeVariablePtr && result == TCL_OK) { - Tcl_SetVar(interp, Tcl_GetString(typeVariablePtr), "", 0); + /* + * The -typevariable option is not really supported. + */ + + Tcl_SetVar(interp, Tcl_GetString(typeVariablePtr), "", + TCL_GLOBAL_ONLY); } end: diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c index 14600a7..baa3225 100644 --- a/win/tkWinDialog.c +++ b/win/tkWinDialog.c @@ -8,7 +8,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkWinDialog.c,v 1.64 2009/08/02 21:40:17 nijtmans Exp $ + * RCS: @(#) $Id: tkWinDialog.c,v 1.65 2009/10/22 10:12:57 dkf Exp $ * */ @@ -265,7 +265,7 @@ void TkWinDialogDebug( int debug) { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); tsdPtr->debugFlag = debug; @@ -297,7 +297,7 @@ Tk_ChooseColorObjCmd( int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { - Tk_Window tkwin, parent; + Tk_Window tkwin = clientData, parent; HWND hWnd; int i, oldMode, winCode, result; CHOOSECOLOR chooseColor; @@ -327,8 +327,6 @@ Tk_ChooseColorObjCmd( inited = 1; } - tkwin = (Tk_Window) clientData; - parent = tkwin; chooseColor.lStructSize = sizeof(CHOOSECOLOR); chooseColor.hwndOwner = NULL; @@ -455,7 +453,7 @@ ColorDlgHookProc( WPARAM wParam, /* First message parameter. */ LPARAM lParam) /* Second message parameter. */ { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); const char *title; CHOOSECOLOR *ccPtr; @@ -477,7 +475,7 @@ ColorDlgHookProc( } if (tsdPtr->debugFlag) { tsdPtr->debugInterp = (Tcl_Interp *) ccPtr->lpTemplateName; - Tcl_DoWhenIdle(SetTkDialog, (ClientData) hDlg); + Tcl_DoWhenIdle(SetTkDialog, hDlg); } return TRUE; } @@ -573,9 +571,9 @@ GetFileNameW( { OPENFILENAMEW ofn; WCHAR file[TK_MULTI_MAX_PATH]; - int filterIndex, result, winCode, oldMode, i, multi = 0; + int filterIndex, result = TCL_ERROR, winCode, oldMode, i, multi = 0; const char *extension, *filter, *title; - Tk_Window tkwin; + Tk_Window tkwin = clientData; HWND hWnd; Tcl_Obj *filterObj, *initialTypeObj, *typeVariableObj; Tcl_DString utfFilterString, utfDirString; @@ -592,13 +590,11 @@ GetFileNameW( "-multiple", "-parent", "-title", "-typevariable", NULL }; const char *const *optionStrings; - enum options { FILE_DEFAULT, FILE_TYPES, FILE_INITDIR, FILE_INITFILE, FILE_MULTIPLE, FILE_PARENT, FILE_TITLE, FILE_TYPEVARIABLE }; - result = TCL_ERROR; file[0] = '\0'; /* @@ -609,7 +605,6 @@ GetFileNameW( filter = NULL; Tcl_DStringInit(&utfFilterString); Tcl_DStringInit(&utfDirString); - tkwin = (Tk_Window) clientData; title = NULL; filterObj = NULL; typeVariableObj = NULL; @@ -702,13 +697,14 @@ GetFileNameW( break; case FILE_TYPEVARIABLE: typeVariableObj = valuePtr; - initialTypeObj = Tcl_ObjGetVar2(interp, typeVariableObj, NULL, 0); + initialTypeObj = Tcl_ObjGetVar2(interp, typeVariableObj, NULL, + TCL_GLOBAL_ONLY); break; } } if (MakeFilter(interp, filterObj, &utfFilterString, initialTypeObj, - &filterIndex) != TCL_OK) { + &filterIndex) != TCL_OK) { goto end; } filter = Tcl_DStringValue(&utfFilterString); @@ -732,11 +728,9 @@ GetFileNameW( } else { ofn.Flags |= OFN_OVERWRITEPROMPT; } - if (tsdPtr->debugFlag != 0) { ofn.Flags |= OFN_ENABLEHOOK; } - if (multi != 0) { ofn.Flags |= OFN_ALLOWMULTISELECT; } @@ -881,6 +875,7 @@ GetFileNameW( (char *) ofn.lpstrFile, &ds), NULL); Tcl_DStringFree(&ds); } + result = TCL_OK; if ((ofn.nFilterIndex > 0) && Tcl_GetCharLength(Tcl_GetObjResult(interp)) > 0 && typeVariableObj && filterObj) { @@ -895,11 +890,11 @@ GetFileNameW( listObjv[ofn.nFilterIndex - 1], &count, &typeInfo) != TCL_OK) { result = TCL_ERROR; - } else { - Tcl_ObjSetVar2(interp, typeVariableObj, NULL, typeInfo[0], 0); + } else if (Tcl_ObjSetVar2(interp, typeVariableObj, NULL, + typeInfo[0], TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) == NULL) { + result = TCL_ERROR; } } - result = TCL_OK; } else { /* * Use the CommDlgExtendedError() function to retrieve the error code. @@ -967,7 +962,7 @@ OFNHookProcW( WPARAM wParam, /* Message parameter */ LPARAM lParam) /* Message parameter */ { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); OPENFILENAMEW *ofnPtr; @@ -984,7 +979,7 @@ OFNHookProcW( if (ofnPtr != NULL) { hdlg = GetParent(hdlg); tsdPtr->debugInterp = (Tcl_Interp *) ofnPtr->lCustData; - Tcl_DoWhenIdle(SetTkDialog, (ClientData) hdlg); + Tcl_DoWhenIdle(SetTkDialog, hdlg); TkWinSetUserData(hdlg, NULL); } } @@ -1018,9 +1013,9 @@ GetFileNameA( { OPENFILENAME ofn; TCHAR file[TK_MULTI_MAX_PATH], savePath[MAX_PATH]; - int filterIndex, result, winCode, oldMode, i, multi = 0; + int filterIndex, result = TCL_ERROR, winCode, oldMode, i, multi = 0; const char *extension, *filter, *title; - Tk_Window tkwin; + Tk_Window tkwin = clientData; HWND hWnd; Tcl_Obj *filterObj, *initialTypeObj, *typeVariableObj; Tcl_DString utfFilterString, utfDirString; @@ -1036,13 +1031,11 @@ GetFileNameA( "-multiple", "-parent", "-title", "-typevariable", NULL }; const char *const *optionStrings; - enum options { FILE_DEFAULT, FILE_TYPES, FILE_INITDIR, FILE_INITFILE, FILE_MULTIPLE, FILE_PARENT, FILE_TITLE, FILE_TYPEVARIABLE }; - result = TCL_ERROR; file[0] = '\0'; /* @@ -1053,7 +1046,6 @@ GetFileNameA( filter = NULL; Tcl_DStringInit(&utfFilterString); Tcl_DStringInit(&utfDirString); - tkwin = (Tk_Window) clientData; title = NULL; filterObj = NULL; typeVariableObj = NULL; @@ -1073,8 +1065,8 @@ GetFileNameA( optionPtr = objv[i]; valuePtr = objv[i + 1]; - if (Tcl_GetIndexFromObj(interp, optionPtr, optionStrings, - "option", 0, &index) != TCL_OK) { + if (Tcl_GetIndexFromObj(interp, optionPtr, optionStrings, "option", 0, + &index) != TCL_OK) { goto end; } @@ -1145,13 +1137,14 @@ GetFileNameA( break; case FILE_TYPEVARIABLE: typeVariableObj = valuePtr; - initialTypeObj = Tcl_ObjGetVar2(interp, typeVariableObj, NULL, 0); + initialTypeObj = Tcl_ObjGetVar2(interp, typeVariableObj, NULL, + TCL_GLOBAL_ONLY); break; } } if (MakeFilter(interp, filterObj, &utfFilterString, initialTypeObj, - &filterIndex) != TCL_OK) { + &filterIndex) != TCL_OK) { goto end; } filter = Tcl_DStringValue(&utfFilterString); @@ -1331,6 +1324,7 @@ GetFileNameA( (char *) ofn.lpstrFile, &ds), NULL); Tcl_DStringFree(&ds); } + result = TCL_OK; if ((ofn.nFilterIndex > 0) && (Tcl_GetCharLength(Tcl_GetObjResult(interp)) > 0) && typeVariableObj && filterObj) { @@ -1345,11 +1339,11 @@ GetFileNameA( listObjv[ofn.nFilterIndex - 1], &count, &typeInfo) != TCL_OK) { result = TCL_ERROR; - } else { - Tcl_ObjSetVar2(interp, typeVariableObj, NULL, typeInfo[0], 0); + } else if (Tcl_ObjSetVar2(interp, typeVariableObj, NULL, + typeInfo[0], TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) == NULL) { + result = TCL_ERROR; } } - result = TCL_OK; } else { /* * Use the CommDlgExtendedError() function to retrieve the error code. @@ -1417,7 +1411,7 @@ OFNHookProc( WPARAM wParam, /* message parameter */ LPARAM lParam) /* message parameter */ { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); OPENFILENAME *ofnPtr; @@ -1437,7 +1431,7 @@ OFNHookProc( hdlg = GetParent(hdlg); } tsdPtr->debugInterp = (Tcl_Interp *) ofnPtr->lCustData; - Tcl_DoWhenIdle(SetTkDialog, (ClientData) hdlg); + Tcl_DoWhenIdle(SetTkDialog, hdlg); TkWinSetUserData(hdlg, NULL); } } @@ -1527,7 +1521,7 @@ MakeFilter( * twice the size of the string to format the filter */ - filterStr = ckalloc((unsigned int) len * 3); + filterStr = ckalloc((unsigned) len * 3); for (filterPtr = flist.filters, p = filterStr; filterPtr; filterPtr = filterPtr->next) { @@ -1538,6 +1532,7 @@ MakeFilter( * Check initial index for match, set index. * Filter index is 1 based so increment first */ + ix++; if (index && initial && (strcmp(initial, filterPtr->name) == 0)) { *index = ix; @@ -1564,8 +1559,8 @@ MakeFilter( clausePtr=clausePtr->next) { GlobPattern *globPtr; - for (globPtr=clausePtr->patterns; globPtr; - globPtr=globPtr->next) { + for (globPtr = clausePtr->patterns; globPtr; + globPtr = globPtr->next) { strcpy(p, sep); p += strlen(sep); strcpy(p, globPtr->pattern); @@ -1683,15 +1678,14 @@ Tk_ChooseDirectoryObjCmd( Tcl_Obj *const objv[]) /* Argument objects. */ { char path[MAX_PATH]; - int oldMode, result, i; + int oldMode, result = TCL_ERROR, i; LPCITEMIDLIST pidl; /* Returned by browser */ BROWSEINFO bInfo; /* Used by browser */ CHOOSEDIRDATA cdCBData; /* Structure to pass back and forth */ LPMALLOC pMalloc; /* Used by shell */ - - Tk_Window tkwin; + Tk_Window tkwin = clientData; HWND hWnd; - const char *utfTitle; /* Title for window */ + const char *utfTitle = NULL;/* Title for window */ TCHAR saveDir[MAX_PATH]; Tcl_DString titleString; /* UTF Title */ Tcl_DString initDirString; /* Initial directory */ @@ -1707,15 +1701,10 @@ Tk_ChooseDirectoryObjCmd( * Initialize */ - result = TCL_ERROR; path[0] = '\0'; - utfTitle = NULL; - ZeroMemory(&cdCBData, sizeof(CHOOSEDIRDATA)); cdCBData.interp = interp; - tkwin = (Tk_Window) clientData; - /* * Process the command line options */ @@ -1801,10 +1790,10 @@ Tk_ChooseDirectoryObjCmd( } /* - * Set flags to add edit box, status text line and use the new ui. - * Allow override with magic variable (ignore errors in retrieval). - * See http://msdn.microsoft.com/en-us/library/bb773205(VS.85).aspx - * for possible flag values. + * Set flags to add edit box, status text line and use the new ui. Allow + * override with magic variable (ignore errors in retrieval). See + * http://msdn.microsoft.com/en-us/library/bb773205(VS.85).aspx for + * possible flag values. */ bInfo.ulFlags = BIF_EDITBOX | BIF_STATUSTEXT | BIF_RETURNFSANCESTORS @@ -1826,7 +1815,7 @@ Tk_ChooseDirectoryObjCmd( /* * Display dialog in background and process result. We look to give the * user a chance to change their mind on an invalid folder if mustexist is - * 0; + * 0. */ oldMode = Tcl_SetServiceMode(TCL_SERVICE_ALL); @@ -1894,8 +1883,8 @@ Tk_ChooseDirectoryObjCmd( * entered. * * Results: - * Returns 0 to allow default processing of message, or 1 to - * tell default dialog function not to close. + * Returns 0 to allow default processing of message, or 1 to tell default + * dialog function not to close. * *---------------------------------------------------------------------- */ @@ -1908,17 +1897,15 @@ ChooseDirectoryValidateProc( LPARAM lpData) { TCHAR selDir[MAX_PATH]; - CHOOSEDIRDATA *chooseDirSharedData; + CHOOSEDIRDATA *chooseDirSharedData = (CHOOSEDIRDATA *) lpData; Tcl_DString initDirString; char string[MAX_PATH]; - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); - chooseDirSharedData = (CHOOSEDIRDATA *)lpData; - if (tsdPtr->debugFlag) { tsdPtr->debugInterp = (Tcl_Interp *) chooseDirSharedData->interp; - Tcl_DoWhenIdle(SetTkDialog, (ClientData) hwnd); + Tcl_DoWhenIdle(SetTkDialog, hwnd); } chooseDirSharedData->utfRetDir[0] = '\0'; switch (message) { @@ -1933,11 +1920,12 @@ ChooseDirectoryValidateProc( */ if (Tcl_TranslateFileName(chooseDirSharedData->interp, - (char *)lParam, &initDirString) == NULL) { + (char *) lParam, &initDirString) == NULL) { /* * Should we expose the error (in the interp result) to the user * at this point? */ + chooseDirSharedData->utfRetDir[0] = '\0'; return 1; } @@ -1948,9 +1936,9 @@ ChooseDirectoryValidateProc( LPTSTR lpFilePart[MAX_PATH]; /* - * Get the full path name to the user entry, at this point it - * doesn't exist so see if it is supposed to. Otherwise just - * return it. + * Get the full path name to the user entry, at this point it does + * not exist so see if it is supposed to. Otherwise just return + * it. */ GetFullPathName(string, MAX_PATH, @@ -1967,9 +1955,10 @@ ChooseDirectoryValidateProc( } } else { /* - * Changed to new folder OK, return immediatly with the - * current directory in utfRetDir. + * Changed to new folder OK, return immediatly with the current + * directory in utfRetDir. */ + GetCurrentDirectory(MAX_PATH, chooseDirSharedData->utfRetDir); return 0; } @@ -1977,9 +1966,9 @@ ChooseDirectoryValidateProc( case BFFM_SELCHANGED: /* - * Set the status window to the currently selected path and enable - * the OK button if a file system folder, otherwise disable the OK - * button for things like server names. Perhaps a new switch + * Set the status window to the currently selected path and enable the + * OK button if a file system folder, otherwise disable the OK button + * for things like server names. Perhaps a new switch * -enablenonfolders can be used to allow non folders to be selected. * * Not called when user changes edit box directly. @@ -2007,8 +1996,8 @@ ChooseDirectoryValidateProc( SetCurrentDirectory(initDir); if (*initDir == '\\') { /* - * BFFM_SETSELECTION only understands UNC paths as pidls, - * so convert path to pidl using IShellFolder interface. + * BFFM_SETSELECTION only understands UNC paths as pidls, so + * convert path to pidl using IShellFolder interface. */ LPMALLOC pMalloc; @@ -2027,7 +2016,7 @@ ChooseDirectoryValidateProc( Tcl_DStringValue(&ds), &ulCount,&pidlMain,&ulAttr)) && (pidlMain != NULL)) { SendMessage(hwnd, BFFM_SETSELECTION, FALSE, - (LPARAM)pidlMain); + (LPARAM) pidlMain); pMalloc->lpVtbl->Free(pMalloc, pidlMain); } psfFolder->lpVtbl->Release(psfFolder); @@ -2036,7 +2025,7 @@ ChooseDirectoryValidateProc( pMalloc->lpVtbl->Release(pMalloc); } } else { - SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)initDir); + SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM) initDir); } SendMessage(hwnd, BFFM_ENABLEOK, 0, (LPARAM) 1); break; @@ -2071,7 +2060,7 @@ Tk_MessageBoxObjCmd( int objc, /* Number of arguments. */ Tcl_Obj *const objv[]) /* Argument objects. */ { - Tk_Window tkwin, parent; + Tk_Window tkwin = clientData, parent; HWND hWnd; Tcl_Obj *messageObj, *titleObj, *detailObj, *tmpObj; int defaultBtn, icon, type; @@ -2085,12 +2074,10 @@ Tk_MessageBoxObjCmd( MSG_DEFAULT, MSG_DETAIL, MSG_ICON, MSG_MESSAGE, MSG_PARENT, MSG_TITLE, MSG_TYPE }; - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); (void) TkWinGetUnicodeEncoding(); - tkwin = (Tk_Window) clientData; - defaultBtn = -1; detailObj = NULL; icon = MB_ICONINFORMATION; @@ -2244,8 +2231,8 @@ MsgBoxCBTProc( WPARAM wParam, LPARAM lParam) { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) - Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); + ThreadSpecificData *tsdPtr = + Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); if (nCode == HCBT_CREATEWND) { /* @@ -2256,10 +2243,11 @@ MsgBoxCBTProc( * that it's the one we want. */ - LPCBT_CREATEWND lpcbtcreate = (LPCBT_CREATEWND)lParam; + LPCBT_CREATEWND lpcbtcreate = (LPCBT_CREATEWND) lParam; if (WC_DIALOG == lpcbtcreate->lpcs->lpszClass) { HWND hwnd = (HWND) wParam; + SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM) tsdPtr->hSmallIcon); SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM) tsdPtr->hBigIcon); @@ -2278,10 +2266,10 @@ MsgBoxCBTProc( * * SetTkDialog -- * - * Records the HWND for a native dialog in the 'tk_dialog' variable - * so that the test-suite can operate on the correct dialog window. - * Use of this is enabled when a test program calls TkWinDialogDebug - * by calling the test command 'tkwinevent debug 1' + * Records the HWND for a native dialog in the 'tk_dialog' variable so + * that the test-suite can operate on the correct dialog window. Use of + * this is enabled when a test program calls TkWinDialogDebug by calling + * the test command 'tkwinevent debug 1'. * * ---------------------------------------------------------------------- */ @@ -2290,7 +2278,7 @@ static void SetTkDialog( ClientData clientData) { - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); char buf[32]; @@ -2344,24 +2332,23 @@ GetFontObj(HDC hdc, LOGFONT *plf) resObj = Tcl_NewListObj(0, NULL); Tcl_ListObjAppendElement(NULL, resObj, - Tcl_NewStringObj(plf->lfFaceName, -1)); + Tcl_NewStringObj(plf->lfFaceName, -1)); pt = -MulDiv(plf->lfHeight, 72, GetDeviceCaps(hdc, LOGPIXELSY)); Tcl_ListObjAppendElement(NULL, resObj, Tcl_NewIntObj(pt)); if (plf->lfWeight >= 700) { - Tcl_ListObjAppendElement(NULL, resObj, - Tcl_NewStringObj("bold", -1)); + Tcl_ListObjAppendElement(NULL, resObj, Tcl_NewStringObj("bold", -1)); } if (plf->lfItalic) { Tcl_ListObjAppendElement(NULL, resObj, - Tcl_NewStringObj("italic", -1)); + Tcl_NewStringObj("italic", -1)); } if (plf->lfUnderline) { Tcl_ListObjAppendElement(NULL, resObj, - Tcl_NewStringObj("underline", -1)); + Tcl_NewStringObj("underline", -1)); } if (plf->lfStrikeOut) { Tcl_ListObjAppendElement(NULL, resObj, - Tcl_NewStringObj("overstrike", -1)); + Tcl_NewStringObj("overstrike", -1)); } return resObj; } @@ -2371,12 +2358,13 @@ ApplyLogfont(Tcl_Interp *interp, Tcl_Obj *cmdObj, HDC hdc, LOGFONT *logfontPtr) { int objc; Tcl_Obj **objv, **tmpv; + Tcl_ListObjGetElements(NULL, cmdObj, &objc, &objv); - tmpv = (Tcl_Obj **)ckalloc(sizeof(Tcl_Obj *) * (objc + 2)); + tmpv = (Tcl_Obj **) ckalloc(sizeof(Tcl_Obj *) * (objc + 2)); memcpy(tmpv, objv, sizeof(Tcl_Obj *) * objc); tmpv[objc] = GetFontObj(hdc, logfontPtr); TkBackgroundEvalObjv(interp, objc+1, tmpv, TCL_EVAL_GLOBAL); - ckfree((char *)tmpv); + ckfree((char *) tmpv); } /* @@ -2384,9 +2372,8 @@ ApplyLogfont(Tcl_Interp *interp, Tcl_Obj *cmdObj, HDC hdc, LOGFONT *logfontPtr) * * HookProc -- * - * Font selection hook. If the user selects Apply on the dialog, we - * call the applyProc script with the currently selected font as - * arguments. + * Font selection hook. If the user selects Apply on the dialog, we call + * the applyProc script with the currently selected font as arguments. * * ---------------------------------------------------------------------- */ @@ -2404,25 +2391,26 @@ typedef struct HookData { static UINT_PTR CALLBACK HookProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) { - CHOOSEFONT *pcf = (CHOOSEFONT *)lParam; + CHOOSEFONT *pcf = (CHOOSEFONT *) lParam; HWND hwndCtrl; static HookData *phd = NULL; - ThreadSpecificData *tsdPtr = (ThreadSpecificData *) + ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); if (WM_INITDIALOG == msg && lParam != 0) { - phd = (HookData *)pcf->lCustData; + phd = (HookData *) pcf->lCustData; phd->hwnd = hwndDlg; if (tsdPtr->debugFlag) { tsdPtr->debugInterp = (Tcl_Interp *) phd->interp; - Tcl_DoWhenIdle(SetTkDialog, (ClientData) hwndDlg); + Tcl_DoWhenIdle(SetTkDialog, hwndDlg); } if (phd->titleObj != NULL) { Tcl_DString title; + Tcl_WinUtfToTChar(Tcl_GetString(phd->titleObj), -1, &title); if (Tcl_DStringLength(&title) > 0) { tkWinProcs->setWindowText(hwndDlg, - (LPCTSTR)Tcl_DStringValue(&title)); + (LPCTSTR) Tcl_DStringValue(&title)); } Tcl_DStringFree(&title); } @@ -2450,13 +2438,15 @@ HookProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) } /* - * Handle apply button by calling the provided command script as - * a background evaluation (ie: errors dont come back here). + * Handle apply button by calling the provided command script as a + * background evaluation (ie: errors dont come back here). */ + if (WM_COMMAND == msg && LOWORD(wParam) == 1026) { LOGFONT lf = {0}; HDC hdc = GetDC(hwndDlg); - SendMessage(hwndDlg, WM_CHOOSEFONT_GETLOGFONT, 0, (LPARAM)&lf); + + SendMessage(hwndDlg, WM_CHOOSEFONT_GETLOGFONT, 0, (LPARAM) &lf); if (phd && phd->cmdObj) { ApplyLogfont(phd->interp, phd->cmdObj, hdc, &lf); } @@ -2469,9 +2459,8 @@ HookProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) } /* - * Helper for the FontchooserConfigure command to return the - * current value of any of the options (which may be NULL in - * the structure) + * Helper for the FontchooserConfigure command to return the current value of + * any of the options (which may be NULL in the structure) */ enum FontchooserOption { @@ -2483,46 +2472,41 @@ static Tcl_Obj * FontchooserCget(HookData *hdPtr, int optionIndex) { Tcl_Obj *resObj = NULL; + switch(optionIndex) { - case FontchooserParent: { - if (hdPtr->parentObj) { - resObj = hdPtr->parentObj; - } else { - resObj = Tcl_NewStringObj(".", 1); - } - break; - } - case FontchooserTitle: { - if (hdPtr->titleObj) { - resObj = hdPtr->titleObj; - } else { - resObj = Tcl_NewStringObj("", 0); - } - break; - } - case FontchooserFont: { - if (hdPtr->fontObj) { - resObj = hdPtr->fontObj; - } else { - resObj = Tcl_NewStringObj("", 0); - } - break; + case FontchooserParent: + if (hdPtr->parentObj) { + resObj = hdPtr->parentObj; + } else { + resObj = Tcl_NewStringObj(".", 1); } - case FontchooserCmd: { - if (hdPtr->cmdObj) { - resObj = hdPtr->cmdObj; - } else { - resObj = Tcl_NewStringObj("", 0); - } - break; + break; + case FontchooserTitle: + if (hdPtr->titleObj) { + resObj = hdPtr->titleObj; + } else { + resObj = Tcl_NewStringObj("", 0); } - case FontchooserVisible: { - resObj = Tcl_NewBooleanObj(hdPtr->hwnd && IsWindow(hdPtr->hwnd)); - break; + break; + case FontchooserFont: + if (hdPtr->fontObj) { + resObj = hdPtr->fontObj; + } else { + resObj = Tcl_NewStringObj("", 0); } - default: { + break; + case FontchooserCmd: + if (hdPtr->cmdObj) { + resObj = hdPtr->cmdObj; + } else { resObj = Tcl_NewStringObj("", 0); } + break; + case FontchooserVisible: + resObj = Tcl_NewBooleanObj(hdPtr->hwnd && IsWindow(hdPtr->hwnd)); + break; + default: + resObj = Tcl_NewStringObj("", 0); } return resObj; } @@ -2532,8 +2516,8 @@ FontchooserCget(HookData *hdPtr, int optionIndex) * * FontchooserConfigureCmd -- * - * Implementation of the 'tk fontchooser configure' ensemble command. - * See the user documentation for what it does. + * Implementation of the 'tk fontchooser configure' ensemble command. See + * the user documentation for what it does. * * Results: * See the user documentation. @@ -2551,7 +2535,7 @@ FontchooserConfigureCmd( int objc, Tcl_Obj *const objv[]) { - Tk_Window tkwin = (Tk_Window)clientData; + Tk_Window tkwin = clientData; HookData *hdPtr = NULL; int i, r = TCL_OK; static const char *optionStrings[] = { @@ -2561,12 +2545,13 @@ FontchooserConfigureCmd( hdPtr = Tcl_GetAssocData(interp, "::tk::fontchooser", NULL); /* - * with no arguments we return all the options in a dict + * With no arguments we return all the options in a dict. */ if (objc == 1) { Tcl_Obj *keyObj, *valueObj; Tcl_Obj *dictObj = Tcl_NewDictObj(); + for (i = 0; r == TCL_OK && optionStrings[i] != NULL; ++i) { keyObj = Tcl_NewStringObj(optionStrings[i], -1); valueObj = FontchooserCget(hdPtr, i); @@ -2580,86 +2565,89 @@ FontchooserConfigureCmd( for (i = 1; i < objc; i += 2) { int optionIndex, len; + if (Tcl_GetIndexFromObj(interp, objv[i], optionStrings, "option", 0, &optionIndex) != TCL_OK) { return TCL_ERROR; } if (objc == 2) { - /* if one option and no arg - return the current value */ + /* + * If one option and no arg - return the current value. + */ + Tcl_SetObjResult(interp, FontchooserCget(hdPtr, optionIndex)); return TCL_OK; } if (i + 1 == objc) { Tcl_AppendResult(interp, "value for \"", - Tcl_GetString(objv[i]), "\" missing", NULL); + Tcl_GetString(objv[i]), "\" missing", NULL); return TCL_ERROR; } switch (optionIndex) { - case FontchooserVisible: { - const char *msg = "cannot change read-only option " + case FontchooserVisible: { + const char *msg = "cannot change read-only option " "\"-visible\": use the show or hide command"; - Tcl_SetObjResult(interp, Tcl_NewStringObj(msg, -1)); + + Tcl_SetObjResult(interp, Tcl_NewStringObj(msg, -1)); + return TCL_ERROR; + } + case FontchooserParent: { + Tk_Window parent = Tk_NameToWindow(interp, + Tcl_GetString(objv[i+1]), tkwin); + + if (parent == None) { return TCL_ERROR; } - case FontchooserParent: { - Tk_Window parent = Tk_NameToWindow(interp, - Tcl_GetString(objv[i+1]), tkwin); - if (parent == None) { - return TCL_ERROR; - } - if (hdPtr->parentObj) { - Tcl_DecrRefCount(hdPtr->parentObj); - } - hdPtr->parentObj = objv[i+1]; - if (Tcl_IsShared(hdPtr->parentObj)) { - hdPtr->parentObj = Tcl_DuplicateObj(hdPtr->parentObj); - } - Tcl_IncrRefCount(hdPtr->parentObj); - break; + if (hdPtr->parentObj) { + Tcl_DecrRefCount(hdPtr->parentObj); } - case FontchooserTitle: { - if (hdPtr->titleObj) { - Tcl_DecrRefCount(hdPtr->titleObj); - } - hdPtr->titleObj = objv[i+1]; - if (Tcl_IsShared(hdPtr->titleObj)) { - hdPtr->titleObj = Tcl_DuplicateObj(hdPtr->titleObj); - } - Tcl_IncrRefCount(hdPtr->titleObj); - break; + hdPtr->parentObj = objv[i+1]; + if (Tcl_IsShared(hdPtr->parentObj)) { + hdPtr->parentObj = Tcl_DuplicateObj(hdPtr->parentObj); } - case FontchooserFont: { - if (hdPtr->fontObj) { - Tcl_DecrRefCount(hdPtr->fontObj); - } - Tcl_GetStringFromObj(objv[i+1], &len); - if (len) { - hdPtr->fontObj = objv[i+1]; - if (Tcl_IsShared(hdPtr->fontObj)) { - hdPtr->fontObj = Tcl_DuplicateObj(hdPtr->fontObj); - } - Tcl_IncrRefCount(hdPtr->fontObj); - } else { - hdPtr->fontObj = NULL; - } - break; + Tcl_IncrRefCount(hdPtr->parentObj); + break; + } + case FontchooserTitle: + if (hdPtr->titleObj) { + Tcl_DecrRefCount(hdPtr->titleObj); + } + hdPtr->titleObj = objv[i+1]; + if (Tcl_IsShared(hdPtr->titleObj)) { + hdPtr->titleObj = Tcl_DuplicateObj(hdPtr->titleObj); + } + Tcl_IncrRefCount(hdPtr->titleObj); + break; + case FontchooserFont: + if (hdPtr->fontObj) { + Tcl_DecrRefCount(hdPtr->fontObj); } - case FontchooserCmd: { - if (hdPtr->cmdObj) { - Tcl_DecrRefCount(hdPtr->cmdObj); + Tcl_GetStringFromObj(objv[i+1], &len); + if (len) { + hdPtr->fontObj = objv[i+1]; + if (Tcl_IsShared(hdPtr->fontObj)) { + hdPtr->fontObj = Tcl_DuplicateObj(hdPtr->fontObj); } - Tcl_GetStringFromObj(objv[i+1], &len); - if (len) { - hdPtr->cmdObj = objv[i+1]; - if (Tcl_IsShared(hdPtr->cmdObj)) { - hdPtr->cmdObj = Tcl_DuplicateObj(hdPtr->cmdObj); - } - Tcl_IncrRefCount(hdPtr->cmdObj); - } else { - hdPtr->cmdObj = NULL; + Tcl_IncrRefCount(hdPtr->fontObj); + } else { + hdPtr->fontObj = NULL; + } + break; + case FontchooserCmd: + if (hdPtr->cmdObj) { + Tcl_DecrRefCount(hdPtr->cmdObj); + } + Tcl_GetStringFromObj(objv[i+1], &len); + if (len) { + hdPtr->cmdObj = objv[i+1]; + if (Tcl_IsShared(hdPtr->cmdObj)) { + hdPtr->cmdObj = Tcl_DuplicateObj(hdPtr->cmdObj); } - break; + Tcl_IncrRefCount(hdPtr->cmdObj); + } else { + hdPtr->cmdObj = NULL; } + break; } } return TCL_OK; @@ -2670,12 +2658,13 @@ FontchooserConfigureCmd( * * FontchooserShowCmd -- * - * Implements the 'tk fontchooser show' ensemble command. The - * per-interp configuration data for the dialog is held in an interp - * associated structure. - * Calls the Win32 FontChooser API which provides a modal dialog. - * See HookProc where we make a few changes to the dialog and set - * some additional state. + * Implements the 'tk fontchooser show' ensemble command. The per-interp + * configuration data for the dialog is held in an interp associated + * structure. + * + * Calls the Win32 FontChooser API which provides a modal dialog. See + * HookProc where we make a few changes to the dialog and set some + * additional state. * * ---------------------------------------------------------------------- */ @@ -2687,7 +2676,7 @@ FontchooserShowCmd( int objc, Tcl_Obj *const objv[]) { - Tk_Window tkwin, parent; + Tk_Window tkwin = clientData, parent; CHOOSEFONT cf; LOGFONT lf; HDC hdc; @@ -2696,9 +2685,10 @@ FontchooserShowCmd( hdPtr = Tcl_GetAssocData(interp, "::tk::fontchooser", NULL); - tkwin = parent = (Tk_Window) clientData; + parent = tkwin; if (hdPtr->parentObj) { - parent = Tk_NameToWindow(interp, Tcl_GetString(hdPtr->parentObj), tkwin); + parent = Tk_NameToWindow(interp, Tcl_GetString(hdPtr->parentObj), + tkwin); if (parent == None) { return TCL_ERROR; } @@ -2716,7 +2706,7 @@ FontchooserShowCmd( cf.Flags = CF_SCREENFONTS | CF_EFFECTS | CF_ENABLEHOOK; cf.rgbColors = RGB(0,0,0); cf.lpfnHook = HookProc; - cf.lCustData = (INT_PTR)hdPtr; + cf.lCustData = (INT_PTR) hdPtr; hdPtr->interp = interp; hdPtr->parent = parent; hdc = GetDC(cf.hwndOwner); @@ -2724,26 +2714,38 @@ FontchooserShowCmd( if (hdPtr->fontObj != NULL) { TkFont *fontPtr; Tk_Font f = Tk_AllocFontFromObj(interp, tkwin, hdPtr->fontObj); + if (f == NULL) { return TCL_ERROR; } - fontPtr = (TkFont *)f; + fontPtr = (TkFont *) f; cf.Flags |= CF_INITTOLOGFONTSTRUCT; strncpy(lf.lfFaceName, Tk_GetUid(fontPtr->fa.family), LF_FACESIZE-1); lf.lfFaceName[LF_FACESIZE-1] = 0; lf.lfHeight = -MulDiv(TkFontGetPoints(tkwin, fontPtr->fa.size), GetDeviceCaps(hdc, LOGPIXELSY), 72); - if (fontPtr->fa.weight == TK_FW_BOLD) lf.lfWeight = FW_BOLD; - if (fontPtr->fa.slant != TK_FS_ROMAN) lf.lfItalic = TRUE; - if (fontPtr->fa.underline) lf.lfUnderline = TRUE; - if (fontPtr->fa.overstrike) lf.lfStrikeOut = TRUE; + if (fontPtr->fa.weight == TK_FW_BOLD) { + lf.lfWeight = FW_BOLD; + } + if (fontPtr->fa.slant != TK_FS_ROMAN) { + lf.lfItalic = TRUE; + } + if (fontPtr->fa.underline) { + lf.lfUnderline = TRUE; + } + if (fontPtr->fa.overstrike) { + lf.lfStrikeOut = TRUE; + } Tk_FreeFont(f); } if (TCL_OK == r && hdPtr->cmdObj != NULL) { int len = 0; + r = Tcl_ListObjLength(interp, hdPtr->cmdObj, &len); - if (len > 0) cf.Flags |= CF_APPLY; + if (len > 0) { + cf.Flags |= CF_APPLY; + } } if (TCL_OK == r) { @@ -2761,7 +2763,6 @@ FontchooserShowCmd( } ReleaseDC(cf.hwndOwner, hdc); - return r; } @@ -2770,10 +2771,10 @@ FontchooserShowCmd( * * FontchooserHideCmd -- * - * Implementation of the 'tk fontchooser hide' ensemble. See the - * user documentation for details. - * As the Win32 FontChooser function is always modal all we do here - * is destroy the dialog + * Implementation of the 'tk fontchooser hide' ensemble. See the user + * documentation for details. + * As the Win32 FontChooser function is always modal all we do here is + * destroy the dialog * * ---------------------------------------------------------------------- */ @@ -2786,6 +2787,7 @@ FontchooserHideCmd( Tcl_Obj *const objv[]) { HookData *hdPtr = Tcl_GetAssocData(interp, "::tk::fontchooser", NULL); + if (hdPtr->hwnd && IsWindow(hdPtr->hwnd)) { EndDialog(hdPtr->hwnd, 0); } @@ -2797,8 +2799,8 @@ FontchooserHideCmd( * * DeleteHookData -- * - * Clean up the font chooser configuration data when the interp - * is destroyed. + * Clean up the font chooser configuration data when the interp is + * destroyed. * * ---------------------------------------------------------------------- */ @@ -2807,15 +2809,20 @@ static void DeleteHookData(ClientData clientData, Tcl_Interp *interp) { HookData *hdPtr = clientData; - if (hdPtr->parentObj) + + if (hdPtr->parentObj) { Tcl_DecrRefCount(hdPtr->parentObj); - if (hdPtr->fontObj) + } + if (hdPtr->fontObj) { Tcl_DecrRefCount(hdPtr->fontObj); - if (hdPtr->titleObj) + } + if (hdPtr->titleObj) { Tcl_DecrRefCount(hdPtr->titleObj); - if (hdPtr->cmdObj) + } + if (hdPtr->cmdObj) { Tcl_DecrRefCount(hdPtr->cmdObj); - ckfree((char *)hdPtr); + } + ckfree((char *) hdPtr); } /* @@ -2840,8 +2847,8 @@ const TkEnsemble tkFontchooserEnsemble[] = { int TkInitFontchooser(Tcl_Interp *interp, ClientData clientData) { - HookData *hdPtr = NULL; - hdPtr = (HookData *)ckalloc(sizeof(HookData)); + HookData *hdPtr = (HookData *) ckalloc(sizeof(HookData)); + memset(hdPtr, 0, sizeof(HookData)); Tcl_SetAssocData(interp, "::tk::fontchooser", DeleteHookData, hdPtr); return TCL_OK; |