From bd2618f68e0532440f3e927439e16c62f3a54d09 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Mon, 10 Jun 2019 21:03:59 +0000 Subject: Eliminate on Windows all usages of Tcl_WinUtfToTChar() and Tcl_WinTCharToUtf(). Proving the point of this TIP. --- generic/tkMain.c | 6 ++--- win/Makefile.in | 2 +- win/makefile.vc | 2 +- win/tkWinClipboard.c | 8 +++--- win/tkWinDialog.c | 69 ++++++++++++++++++++++++++++++++++------------------ win/tkWinInit.c | 3 ++- win/tkWinMenu.c | 6 +++-- win/tkWinSend.c | 24 +++++++++++------- win/tkWinSendCom.c | 11 +++++---- win/tkWinTest.c | 13 ++++++---- win/tkWinWm.c | 12 ++++++--- win/ttkWinXPTheme.c | 9 ++++--- 12 files changed, 103 insertions(+), 62 deletions(-) diff --git a/generic/tkMain.c b/generic/tkMain.c index 007903c..45208ab 100644 --- a/generic/tkMain.c +++ b/generic/tkMain.c @@ -85,10 +85,8 @@ NewNativeObj( Tcl_DString ds; #ifdef UNICODE - if (length > 0) { - length *= sizeof(WCHAR); - } - Tcl_WinTCharToUtf(string, length, &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(string, length, &ds); #else Tcl_ExternalToUtfDString(NULL, (char *) string, length, &ds); #endif diff --git a/win/Makefile.in b/win/Makefile.in index f857b7c..efc8354 100644 --- a/win/Makefile.in +++ b/win/Makefile.in @@ -170,7 +170,7 @@ LDFLAGS_OPTIMIZE = @LDFLAGS_OPTIMIZE@ #CFLAGS = $(CFLAGS_DEBUG) #CFLAGS = $(CFLAGS_OPTIMIZE) #CFLAGS = $(CFLAGS_DEBUG) $(CFLAGS_OPTIMIZE) -CFLAGS = @CFLAGS@ @CFLAGS_DEFAULT@ -DUNICODE -D_UNICODE -D_ATL_XP_TARGETING +CFLAGS = @CFLAGS@ @CFLAGS_DEFAULT@ -DUNICODE -D_UNICODE -D_ATL_XP_TARGETING -DTCL_UTF_MAX=3 # Special compiler flags to use when building man2tcl on Windows. MAN2TCLFLAGS = @MAN2TCLFLAGS@ diff --git a/win/makefile.vc b/win/makefile.vc index 87fe366..8380b90 100644 --- a/win/makefile.vc +++ b/win/makefile.vc @@ -326,7 +326,7 @@ CONFIG_DEFS =-DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 \ -DTK_NO_DEPRECATED=1 !endif -PRJ_DEFINES = -DBUILD_ttk $(CONFIG_DEFS) -Dinline=__inline -D _CRT_SECURE_NO_DEPRECATE -D _CRT_NONSTDC_NO_DEPRECATE +PRJ_DEFINES = -DBUILD_ttk $(CONFIG_DEFS) -Dinline=__inline -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DTCL_UTF_MAX=3 # Additional Link libraries needed beyond those in rules.vc PRJ_LIBS = netapi32.lib gdi32.lib user32.lib userenv.lib diff --git a/win/tkWinClipboard.c b/win/tkWinClipboard.c index 8c6a4a4..06bc362 100644 --- a/win/tkWinClipboard.c +++ b/win/tkWinClipboard.c @@ -79,7 +79,8 @@ TkSelGetSelection( goto error; } data = GlobalLock(handle); - Tcl_WinTCharToUtf((TCHAR *)data, -1, &ds); + Tcl_DStringInit(&ds) + Tcl_UniCharToUtfDString((TCHAR *)data, wcslen((TCHAR *)data), &ds); GlobalUnlock(handle); } else if (IsClipboardFormatAvailable(CF_TEXT)) { /* @@ -157,7 +158,8 @@ TkSelGetSelection( Tcl_DStringAppend(&ds, "\n", 1); } len = wcslen(fname); - Tcl_WinTCharToUtf(fname, len * sizeof(WCHAR), &dsTmp); + Tcl_DStringInit(&dsTmp); + Tcl_UniCharToUtfDString(fname, len, &dsTmp); Tcl_DStringAppend(&ds, Tcl_DStringValue(&dsTmp), Tcl_DStringLength(&dsTmp)); Tcl_DStringFree(&dsTmp); @@ -334,7 +336,7 @@ TkWinClipboardRender( #ifdef UNICODE Tcl_DStringInit(&ds); - Tcl_WinUtfToTChar(rawText, -1, &ds); + Tcl_UtfToUniCharDString(rawText, -1, &ds); ckfree(rawText); handle = GlobalAlloc(GMEM_MOVEABLE|GMEM_DDESHARE, (unsigned) Tcl_DStringLength(&ds) + 2); diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c index 506247c..6b7c011 100644 --- a/win/tkWinDialog.c +++ b/win/tkWinDialog.c @@ -929,7 +929,8 @@ ColorDlgHookProc( if ((title != NULL) && (title[0] != '\0')) { Tcl_DString ds; - SetWindowText(hDlg, Tcl_WinUtfToTChar(title,-1,&ds)); + Tcl_DStringInit(&ds); + SetWindowText(hDlg, Tcl_UtfToUniCharDString(title, -1, &ds)); Tcl_DStringFree(&ds); } if (tsdPtr->debugFlag) { @@ -1378,7 +1379,8 @@ static int GetFileNameVista(Tcl_Interp *interp, OFNOpts *optsPtr, const char *src; src = Tcl_GetString(optsPtr->extObj); - wstr = (LPWSTR) Tcl_WinUtfToTChar(src, optsPtr->extObj->length, &ds); + Tcl_DStringInit(&ds); + wstr = (LPWSTR) Tcl_UtfToUniCharDString(src, optsPtr->extObj->length, &ds); if (wstr[0] == L'.') ++wstr; hr = fdlgIf->lpVtbl->SetDefaultExtension(fdlgIf, wstr); @@ -1392,7 +1394,8 @@ static int GetFileNameVista(Tcl_Interp *interp, OFNOpts *optsPtr, const char *src; src = Tcl_GetString(optsPtr->titleObj); - wstr = (LPWSTR) Tcl_WinUtfToTChar(src, optsPtr->titleObj->length, &ds); + Tcl_DStringInit(&ds); + wstr = (LPWSTR) Tcl_UtfToUniCharDString(src, optsPtr->titleObj->length, &ds); hr = fdlgIf->lpVtbl->SetTitle(fdlgIf, wstr); Tcl_DStringFree(&ds); if (FAILED(hr)) @@ -1518,7 +1521,8 @@ static int GetFileNameVista(Tcl_Interp *interp, OFNOpts *optsPtr, Tcl_DString ftds; Tcl_Obj *ftobj; - Tcl_WinTCharToUtf(filterPtr[ftix-1].pszName, -1, &ftds); + Tcl_DStringInit(&ftds); + Tcl_UniCharToUtfDString(filterPtr[ftix-1].pszName, wcslen(filterPtr[ftix-1].pszName), &ftds); ftobj = Tcl_NewStringObj(Tcl_DStringValue(&ftds), Tcl_DStringLength(&ftds)); Tcl_ObjSetVar2(interp, optsPtr->typeVariableObj, NULL, @@ -1629,20 +1633,23 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper } if (optsPtr->extObj != NULL) { - str = Tcl_GetString(optsPtr->extObj); - if (str[0] == '.') - ++str; - Tcl_WinUtfToTChar(str, -1, &extString); + str = Tcl_GetString(optsPtr->extObj); + if (str[0] == '.') + ++str; + Tcl_DStringInit(&extString); + Tcl_UtfToUniCharDString(str, -1, &extString); ofn.lpstrDefExt = (TCHAR *) Tcl_DStringValue(&extString); } - Tcl_WinUtfToTChar(Tcl_DStringValue(&utfFilterString), + Tcl_DStringInit(&filterString); + Tcl_UtfToUniCharDString(Tcl_DStringValue(&utfFilterString), Tcl_DStringLength(&utfFilterString), &filterString); ofn.lpstrFilter = (TCHAR *) Tcl_DStringValue(&filterString); ofn.nFilterIndex = filterIndex; if (Tcl_DStringValue(&optsPtr->utfDirString)[0] != '\0') { - Tcl_WinUtfToTChar(Tcl_DStringValue(&optsPtr->utfDirString), + Tcl_DStringInit(&dirString); + Tcl_UtfToUniCharDString(Tcl_DStringValue(&optsPtr->utfDirString), Tcl_DStringLength(&optsPtr->utfDirString), &dirString); } else { /* @@ -1658,7 +1665,8 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper Tcl_DStringValue(&optsPtr->utfDirString), &cwd) == NULL)) { Tcl_ResetResult(interp); } else { - Tcl_WinUtfToTChar(Tcl_DStringValue(&cwd), + Tcl_DStringInit(&dirString); + Tcl_UtfToUniCharDString(Tcl_DStringValue(&cwd), Tcl_DStringLength(&cwd), &dirString); } Tcl_DStringFree(&cwd); @@ -1666,7 +1674,8 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper ofn.lpstrInitialDir = (TCHAR *) Tcl_DStringValue(&dirString); if (optsPtr->titleObj != NULL) { - Tcl_WinUtfToTChar(Tcl_GetString(optsPtr->titleObj), -1, &titleString); + Tcl_DStringInit(&titleString); + Tcl_UtfToUniCharDString(Tcl_GetString(optsPtr->titleObj), -1, &titleString); ofn.lpstrTitle = (TCHAR *) Tcl_DStringValue(&titleString); } @@ -2304,7 +2313,8 @@ static int MakeFilterVista( initialIndex = i+1; /* Windows filter indices are 1-based */ /* First stash away the text description of the pattern */ - Tcl_WinUtfToTChar(filterPtr->name, -1, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(filterPtr->name, -1, &ds); nbytes = Tcl_DStringLength(&ds); /* # bytes, not Unicode chars */ nbytes += sizeof(WCHAR); /* Terminating \0 */ dlgFilterPtr[i].pszName = ckalloc(nbytes); @@ -2332,7 +2342,8 @@ static int MakeFilterVista( } /* Again we need a Unicode form of the string */ - Tcl_WinUtfToTChar(Tcl_DStringValue(&patterns), -1, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(Tcl_DStringValue(&patterns), -1, &ds); nbytes = Tcl_DStringLength(&ds); /* # bytes, not Unicode chars */ nbytes += sizeof(WCHAR); /* Terminating \0 */ dlgFilterPtr[i].pszSpec = ckalloc(nbytes); @@ -2466,7 +2477,8 @@ Tk_ChooseDirectoryObjCmd( if (utfDir[0] != '\0') { const TCHAR *uniStr; - Tcl_WinUtfToTChar(Tcl_DStringValue(&ofnOpts.utfDirString), -1, + Tcl_DStringInit(&tempString); + Tcl_UtfToUniCharDString(Tcl_DStringValue(&ofnOpts.utfDirString), -1, &tempString); uniStr = (TCHAR *) Tcl_DStringValue(&tempString); @@ -2498,7 +2510,8 @@ Tk_ChooseDirectoryObjCmd( bInfo.lParam = (LPARAM) &cdCBData; if (ofnOpts.titleObj != NULL) { - Tcl_WinUtfToTChar(Tcl_GetString(ofnOpts.titleObj), -1, &titleString); + Tcl_DStringInit(&titleString); + Tcl_UtfToUniCharDString(Tcl_GetString(ofnOpts.titleObj), -1, &titleString); bInfo.lpszTitle = (LPTSTR) Tcl_DStringValue(&titleString); } else { bInfo.lpszTitle = TEXT("Please choose a directory, then select OK."); @@ -2642,7 +2655,8 @@ ChooseDirectoryValidateProc( * like ~ are converted correctly. */ - Tcl_WinTCharToUtf((TCHAR *) lParam, -1, &initDirString); + Tcl_DStringInit(&initDirString); + Tcl_UniCharToUtfDString((TCHAR *) lParam, wcslen((TCHAR *) lParam), &initDirString); if (Tcl_TranslateFileName(chooseDirSharedData->interp, Tcl_DStringValue(&initDirString), &tempString) == NULL) { /* @@ -2654,7 +2668,8 @@ ChooseDirectoryValidateProc( return 1; } Tcl_DStringFree(&initDirString); - Tcl_WinUtfToTChar(Tcl_DStringValue(&tempString), -1, &initDirString); + Tcl_DStringInit(&initDirString); + Tcl_UtfToUniCharDString(Tcl_DStringValue(&tempString), -1, &initDirString); Tcl_DStringFree(&tempString); _tcsncpy(string, (TCHAR *) Tcl_DStringValue(&initDirString), MAX_PATH); @@ -2934,10 +2949,12 @@ Tk_MessageBoxObjCmd( tsdPtr->hMsgBoxHook = SetWindowsHookEx(WH_CBT, MsgBoxCBTProc, NULL, GetCurrentThreadId()); src = Tcl_GetString(tmpObj); - tmpPtr = Tcl_WinUtfToTChar(src, tmpObj->length, &tmpBuf); + Tcl_DStringInit(&tmpBuf); + tmpPtr = Tcl_UtfToUniCharDString(src, tmpObj->length, &tmpBuf); if (titleObj != NULL) { src = Tcl_GetString(titleObj); - titlePtr = Tcl_WinUtfToTChar(src, titleObj->length, &titleBuf); + Tcl_DStringInit(&titleBuf); + titlePtr = Tcl_UtfToUniCharDString(src, titleObj->length, &titleBuf); } else { titlePtr = L""; Tcl_DStringInit(&titleBuf); @@ -3034,7 +3051,8 @@ ConvertExternalFilename( { char *p; - Tcl_WinTCharToUtf(filename, -1, dsPtr); + Tcl_DStringInit(dsPtr) + Tcl_UniCharToUtfDString(filename, wcslen(filename), dsPtr); for (p = Tcl_DStringValue(dsPtr); *p != '\0'; p++) { /* * Change the pathname to the Tcl "normalized" pathname, where back @@ -3071,7 +3089,8 @@ GetFontObj( int pt = 0; resObj = Tcl_NewListObj(0, NULL); - Tcl_WinTCharToUtf(plf->lfFaceName, -1, &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(plf->lfFaceName, wcslen(plf->lfFaceName), &ds); Tcl_ListObjAppendElement(NULL, resObj, Tcl_NewStringObj(Tcl_DStringValue(&ds), -1)); Tcl_DStringFree(&ds); @@ -3157,7 +3176,8 @@ HookProc( if (phd->titleObj != NULL) { Tcl_DString title; - Tcl_WinUtfToTChar(Tcl_GetString(phd->titleObj), -1, &title); + Tcl_DStringInit(&title); + Tcl_UtfToUniCharDString(Tcl_GetString(phd->titleObj), -1, &title); if (Tcl_DStringLength(&title) > 0) { SetWindowText(hwndDlg, (LPCTSTR) Tcl_DStringValue(&title)); } @@ -3474,7 +3494,8 @@ FontchooserShowCmd( } fontPtr = (TkFont *) f; cf.Flags |= CF_INITTOLOGFONTSTRUCT; - Tcl_WinUtfToTChar(fontPtr->fa.family, -1, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(fontPtr->fa.family, -1, &ds); _tcsncpy(lf.lfFaceName, (TCHAR *)Tcl_DStringValue(&ds), LF_FACESIZE-1); Tcl_DStringFree(&ds); diff --git a/win/tkWinInit.c b/win/tkWinInit.c index 780888a..9add471 100644 --- a/win/tkWinInit.c +++ b/win/tkWinInit.c @@ -199,7 +199,8 @@ TkWin32ErrorObj( } #ifdef _UNICODE - Tcl_WinTCharToUtf(lpBuffer, wcslen(lpBuffer) * sizeof (WCHAR), &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(lpBuffer, wcslen(lpBuffer), &ds); errPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); #else diff --git a/win/tkWinMenu.c b/win/tkWinMenu.c index eebe671..460a743 100644 --- a/win/tkWinMenu.c +++ b/win/tkWinMenu.c @@ -609,7 +609,8 @@ ReconfigureWindowsMenu( itemText = GetEntryText(menuPtr, mePtr); if ((menuPtr->menuType == MENUBAR) || (menuPtr->menuFlags & MENU_SYSTEM_MENU)) { - Tcl_WinUtfToTChar(itemText, -1, &translatedText); + Tcl_DStringInit(&translatedText); + Tcl_UtfToUniCharDString(itemText, -1, &translatedText); lpNewItem = (const TCHAR *) Tcl_DStringValue(&translatedText); flags |= MF_STRING; } else { @@ -1272,7 +1273,8 @@ TkWinHandleMenuEvent( const char *src = TkGetStringFromObj(labelPtr, &len); Tcl_DStringFree(&ds); - wlabel = (WCHAR *) Tcl_WinUtfToTChar(src, len, &ds); + Tcl_DStringInit(&ds); + wlabel = (WCHAR *) Tcl_UtfToUniCharDString(src, len, &ds); if ((underline + 1 < len + 1) && (menuChar == Tcl_UniCharToUpper(wlabel[underline]))) { *plResult = (2 << 16) | i; diff --git a/win/tkWinSend.c b/win/tkWinSend.c index fca8561..a4c9d4e 100644 --- a/win/tkWinSend.c +++ b/win/tkWinSend.c @@ -254,7 +254,8 @@ TkGetInterpNames( if (*p) { Tcl_DString ds; - Tcl_WinTCharToUtf(p + 1, -1, &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(p + 1, wcslen(p + 1), &ds); result = Tcl_ListObjAppendElement(interp, objList, Tcl_NewStringObj(Tcl_DStringValue(&ds), @@ -619,7 +620,8 @@ BuildMoniker( LPMONIKER pmkItem = NULL; Tcl_DString dString; - Tcl_WinUtfToTChar(name, -1, &dString); + Tcl_DStringInit(&dString); + Tcl_UtfToUniCharDString(name, -1, &dString); hr = CreateFileMoniker((LPOLESTR)Tcl_DStringValue(&dString), &pmkItem); Tcl_DStringFree(&dString); if (SUCCEEDED(hr)) { @@ -761,7 +763,8 @@ Send( vCmd.vt = VT_BSTR; src = Tcl_GetString(cmd); - Tcl_WinUtfToTChar(src, cmd->length, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(src, cmd->length, &ds); vCmd.bstrVal = SysAllocString((WCHAR *) Tcl_DStringValue(&ds)); Tcl_DStringFree(&ds); @@ -784,8 +787,8 @@ Send( ehr = VariantChangeType(&vResult, &vResult, 0, VT_BSTR); if (SUCCEEDED(ehr)) { - Tcl_WinTCharToUtf(vResult.bstrVal, (int) SysStringLen(vResult.bstrVal) * - sizeof (WCHAR), &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(vResult.bstrVal, SysStringLen(vResult.bstrVal), &ds); Tcl_DStringResult(interp, &ds); } @@ -797,8 +800,9 @@ Send( if (hr == DISP_E_EXCEPTION && ei.bstrSource != NULL) { Tcl_Obj *opError, *opErrorCode, *opErrorInfo; - Tcl_WinTCharToUtf(ei.bstrSource, (int) SysStringLen(ei.bstrSource) * - sizeof (WCHAR), &ds); + + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(ei.bstrSource, SysStringLen(ei.bstrSource), &ds); opError = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); @@ -869,12 +873,14 @@ TkWinSend_SetExcepInfo( /* TODO: Handle failure to append */ src = Tcl_GetString(opError); - Tcl_WinUtfToTChar(src, opError->length, &ds); + Tcl_DStringInit(&ds) + Tcl_UtfToUniCharDString(src, opError->length, &ds); pExcepInfo->bstrDescription = SysAllocString((WCHAR *) Tcl_DStringValue(&ds)); Tcl_DStringFree(&ds); src = Tcl_GetString(opErrorCode); - Tcl_WinUtfToTChar(src, opErrorCode->length, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(src, opErrorCode->length, &ds); pExcepInfo->bstrSource = SysAllocString((WCHAR *) Tcl_DStringValue(&ds)); Tcl_DStringFree(&ds); diff --git a/win/tkWinSendCom.c b/win/tkWinSendCom.c index 9e5b7a0..ebeef1e 100644 --- a/win/tkWinSendCom.c +++ b/win/tkWinSendCom.c @@ -385,8 +385,8 @@ Async( if (SUCCEEDED(hr) && obj->interp) { Tcl_Obj *scriptPtr; - Tcl_WinTCharToUtf(vCmd.bstrVal, (int) SysStringLen(vCmd.bstrVal) * - sizeof (WCHAR), &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(vCmd.bstrVal, SysStringLen(vCmd.bstrVal), &ds); scriptPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); @@ -440,8 +440,8 @@ Send( return hr; } - Tcl_WinTCharToUtf(v.bstrVal, (int) SysStringLen(v.bstrVal) * - sizeof (WCHAR), &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(v.bstrVal, SysStringLen(v.bstrVal), &ds); scriptPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); Tcl_Preserve(interp); @@ -457,7 +457,8 @@ Send( pvResult->vt = VT_BSTR; obj = Tcl_GetObjResult(interp); src = Tcl_GetString(obj); - Tcl_WinUtfToTChar(src, obj->length, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(src, obj->length, &ds); pvResult->bstrVal = SysAllocString((WCHAR *) Tcl_DStringValue(&ds)); Tcl_DStringFree(&ds); } diff --git a/win/tkWinTest.c b/win/tkWinTest.c index 70465d6..68c54f6 100644 --- a/win/tkWinTest.c +++ b/win/tkWinTest.c @@ -449,9 +449,11 @@ TestfindwindowObjCmd( return TCL_ERROR; } - title = Tcl_WinUtfToTChar(Tcl_GetString(objv[1]), -1, &titleString); + Tcl_DStringInit(&titleString); + title = Tcl_UtfToUniCharDString(Tcl_GetString(objv[1]), -1, &titleString); if (objc == 3) { - class = Tcl_WinUtfToTChar(Tcl_GetString(objv[2]), -1, &classString); + Tcl_DStringInit(&classString); + class = Tcl_UtfToUniCharDString(Tcl_GetString(objv[2]), -1, &classString); } if (title[0] == 0) title = NULL; @@ -531,8 +533,8 @@ TestgetwindowinfoObjCmd( AppendSystemError(interp, GetLastError()); return TCL_ERROR; } else { - Tcl_DString ds; - Tcl_WinTCharToUtf(buf, -1, &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(buf, wcslen(buf), &ds); classObj = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); } @@ -543,7 +545,8 @@ TestgetwindowinfoObjCmd( Tcl_NewWideIntObj(GetWindowLongPtr((HWND)(size_t)hwnd, GWL_ID))); cch = GetWindowText((HWND)(size_t)hwnd, (LPTSTR)buf, cchBuf); - Tcl_WinTCharToUtf(buf, cch * sizeof (WCHAR), &ds); + Tcl_DStringInit(&ds); + Tcl_UniCharToUtfDString(buf, cch, &ds); textObj = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); diff --git a/win/tkWinWm.c b/win/tkWinWm.c index a3d7f89..6aecfa8 100644 --- a/win/tkWinWm.c +++ b/win/tkWinWm.c @@ -1246,7 +1246,8 @@ ReadIconFromFile( if (file == NULL) { return NULL; } - Tcl_WinUtfToTChar(file, -1, &ds2); + Tcl_DStringInit(&ds2); + Tcl_UtfToUniCharDString(file, -1, &ds2); Tcl_DStringFree(&ds); res = (DWORD *)SHGetFileInfo((TCHAR *)Tcl_DStringValue(&ds2), 0, &sfiSM, sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_ICON); @@ -2126,7 +2127,8 @@ UpdateWrapper( */ tsdPtr->createWindow = winPtr; - Tcl_WinUtfToTChar(((wmPtr->title != NULL) ? + Tcl_DStringInit(&titleString); + Tcl_UtfToUniCharDString(((wmPtr->title != NULL) ? wmPtr->title : winPtr->nameUid), -1, &titleString); wmPtr->wrapper = CreateWindowEx(wmPtr->exStyle, @@ -5471,7 +5473,8 @@ WmTitleCmd( int size = 256; GetWindowText(wrapper, buf, size); - Tcl_WinTCharToUtf(buf, -1, &titleString); + Tcl_DStringInit(&titleString); + Tcl_UniCharToUtfDString(buf, wcslen(buf), &titleString); Tcl_SetObjResult(interp, Tcl_NewStringObj( Tcl_DStringValue(&titleString), Tcl_DStringLength(&titleString))); @@ -5492,7 +5495,8 @@ WmTitleCmd( if (!(wmPtr->flags & WM_NEVER_MAPPED) && wmPtr->wrapper != NULL) { Tcl_DString titleString; - Tcl_WinUtfToTChar(wmPtr->title, -1, &titleString); + Tcl_DStringInit(&titleString); + Tcl_UtfToUniCharDString(wmPtr->title, -1, &titleString); SetWindowText(wrapper, (LPCTSTR) Tcl_DStringValue(&titleString)); Tcl_DStringFree(&titleString); } diff --git a/win/ttkWinXPTheme.c b/win/ttkWinXPTheme.c index ebe371d..be9d5c8 100644 --- a/win/ttkWinXPTheme.c +++ b/win/ttkWinXPTheme.c @@ -833,7 +833,8 @@ static void TextElementSize( return; src = TkGetStringFromObj(element->textObj, &len); - Tcl_WinUtfToTChar(src, len, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(src, len, &ds); hr = elementData->procs->GetThemeTextExtent( elementData->hTheme, elementData->hDC, @@ -872,7 +873,8 @@ static void TextElementDraw( return; src = TkGetStringFromObj(element->textObj, &len); - Tcl_WinUtfToTChar(src, len, &ds); + Tcl_DStringInit(&ds); + Tcl_UtfToUniCharDString(src, len, &ds); hr = elementData->procs->DrawThemeText( elementData->hTheme, elementData->hDC, @@ -1139,7 +1141,8 @@ Ttk_CreateVsapiElement( return TCL_ERROR; } name = TkGetStringFromObj(objv[0], &length); - className = (WCHAR *) Tcl_WinUtfToTChar(name, length, &classBuf); + Tcl_DStringInit(&classBuf); + className = (WCHAR *) Tcl_UtfToUniCharDString(name, length, &classBuf); /* flags or padding */ if (objc > 3) { -- cgit v0.12