From 168bc3c1f9f4f57f0eb8be8bfa2db0fae62d55d6 Mon Sep 17 00:00:00 2001
From: "jan.nijtmans" <nijtmans@users.sourceforge.net>
Date: Tue, 11 Jun 2019 11:39:44 +0000
Subject: More TCHAR -> WCHAR conversions

---
 generic/tkWindow.c   |  8 +++---
 unix/tkUnixFont.c    |  2 +-
 win/tkWinButton.c    |  8 +++---
 win/tkWinClipboard.c |  4 +--
 win/tkWinCursor.c    |  2 +-
 win/tkWinDialog.c    | 79 +++++++++++++++++++++++++---------------------------
 win/tkWinEmbed.c     |  6 ++--
 win/tkWinFont.c      | 62 ++++++++++++++++++++---------------------
 win/tkWinInit.c      |  8 +++---
 win/tkWinKey.c       |  6 ++--
 win/tkWinMenu.c      | 14 +++++-----
 win/tkWinPixmap.c    |  2 +-
 win/tkWinScrlbr.c    |  2 +-
 win/tkWinSend.c      |  2 +-
 win/tkWinTest.c      |  4 +--
 win/tkWinWm.c        | 12 ++++----
 win/tkWinX.c         |  8 +++---
 win/ttkWinMonitor.c  |  4 +--
 win/ttkWinXPTheme.c  |  2 +-
 19 files changed, 115 insertions(+), 120 deletions(-)

diff --git a/generic/tkWindow.c b/generic/tkWindow.c
index 6ad9477..47be9c4 100644
--- a/generic/tkWindow.c
+++ b/generic/tkWindow.c
@@ -2851,16 +2851,16 @@ TkCygwinMainEx(
 				 * but before starting to execute commands. */
     Tcl_Interp *interp)
 {
-    TCHAR name[MAX_PATH];
+    WCHAR name[MAX_PATH];
     size_t len;
     void (*tkmainex)(int, char **, Tcl_AppInitProc *, Tcl_Interp *);
 
     /* construct "<path>/libtk8.?.dll", from "<path>/tk8?.dll" */
     len = GetModuleFileNameW(Tk_GetHINSTANCE(), name, MAX_PATH);
-    name[len-2] = TEXT('.');
+    name[len-2] = L'.';
     name[len-1] = name[len-5];
-    _tcscpy(name+len, TEXT(".dll"));
-    memcpy(name+len-8, TEXT("libtk8"), 6 * sizeof(TCHAR));
+    wcscpy(name+len, L".dll");
+    memcpy(name+len-8, L"libtk8", 6 * sizeof(WCHAR));
 
     tkcygwindll = LoadLibrary(name);
     if (!tkcygwindll) {
diff --git a/unix/tkUnixFont.c b/unix/tkUnixFont.c
index c94aff2..84de08f 100644
--- a/unix/tkUnixFont.c
+++ b/unix/tkUnixFont.c
@@ -245,7 +245,7 @@ static unsigned		RankAttributes(FontAttributes *wantPtr,
 			    FontAttributes *gotPtr);
 static void		ReleaseFont(UnixFont *fontPtr);
 static void		ReleaseSubFont(Display *display, SubFont *subFontPtr);
-static int		SeenName(const char *name, Tcl_DString *dsPtr);
+static int		SeenName(const WCHAR *name, Tcl_DString *dsPtr);
 #ifndef WORDS_BIGENDIAN
 static int		Ucs2beToUtfProc(ClientData clientData, const char*src,
 			    int srcLen, int flags, Tcl_EncodingState*statePtr,
diff --git a/win/tkWinButton.c b/win/tkWinButton.c
index 0b71327..a0d1ebd 100644
--- a/win/tkWinButton.c
+++ b/win/tkWinButton.c
@@ -131,7 +131,7 @@ InitBoxes(void)
     ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
 	    Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
 
-    hrsrc = FindResource(module, TEXT("buttons"), RT_BITMAP);
+    hrsrc = FindResource(module, L"buttons", RT_BITMAP);
     if (hrsrc == NULL) {
 	Tcl_Panic("FindResource() failed for buttons bitmap resource, "
             "resources in tk_base.rc must be linked into Tk dll or static executable");
@@ -242,15 +242,15 @@ CreateProc(
 {
     Window window;
     HWND parent;
-    const TCHAR *class;
+    const WCHAR *class;
     WinButton *butPtr = (WinButton *)instanceData;
 
     parent = Tk_GetHWND(parentWin);
     if (butPtr->info.type == TYPE_LABEL) {
-	class = TEXT("STATIC");
+	class = L"STATIC";
 	butPtr->style = SS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;
     } else {
-	class = TEXT("BUTTON");
+	class = L"BUTTON";
 	butPtr->style = BS_OWNERDRAW | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS;
     }
     butPtr->hwnd = CreateWindow(class, NULL, butPtr->style,
diff --git a/win/tkWinClipboard.c b/win/tkWinClipboard.c
index 06bc362..37e1603 100644
--- a/win/tkWinClipboard.c
+++ b/win/tkWinClipboard.c
@@ -79,8 +79,8 @@ TkSelGetSelection(
 	    goto error;
 	}
 	data = GlobalLock(handle);
-	Tcl_DStringInit(&ds)
-	Tcl_UniCharToUtfDString((TCHAR *)data, wcslen((TCHAR *)data), &ds);
+	Tcl_DStringInit(&ds);
+	Tcl_UniCharToUtfDString((WCHAR *)data, wcslen((WCHAR *)data), &ds);
 	GlobalUnlock(handle);
     } else if (IsClipboardFormatAvailable(CF_TEXT)) {
 	/*
diff --git a/win/tkWinCursor.c b/win/tkWinCursor.c
index 622ba4d..6a9dc75 100644
--- a/win/tkWinCursor.c
+++ b/win/tkWinCursor.c
@@ -41,7 +41,7 @@ typedef struct {
 
 static struct CursorName {
     const char *name;
-    LPCTSTR id;
+    LPCWSTR id;
 } cursorNames[] = {
     {"starting",		IDC_APPSTARTING},
     {"arrow",			IDC_ARROW},
diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c
index 6b7c011..14f442b 100644
--- a/win/tkWinDialog.c
+++ b/win/tkWinDialog.c
@@ -143,8 +143,8 @@ static const struct {int type; int btnIds[3];} allowedTypes[] = {
  */
 
 typedef struct {
-   TCHAR initDir[MAX_PATH];	/* Initial folder to use */
-   TCHAR retDir[MAX_PATH];	/* Returned folder to use */
+   WCHAR initDir[MAX_PATH];	/* Initial folder to use */
+   WCHAR retDir[MAX_PATH];	/* Returned folder to use */
    Tcl_Interp *interp;
    int mustExist;		/* True if file must exist to return from
 				 * callback */
@@ -161,7 +161,7 @@ typedef struct OFNData {
     int dynFileBufferSize;	/* Dynamic filename buffer size, stored to
 				 * avoid shrinking and expanding the buffer
 				 * when selection changes */
-    TCHAR *dynFileBuffer;	/* Dynamic filename buffer */
+    WCHAR *dynFileBuffer;	/* Dynamic filename buffer */
 } OFNData;
 
 /*
@@ -180,12 +180,9 @@ typedef struct OFNOpts {
     int confirmOverwrite;       /* Confirm before overwriting */
     int mustExist;              /* Used only for  */
     int forceXPStyle;          /* XXX - Force XP style even on newer systems */
-    TCHAR file[TK_MULTI_MAX_PATH]; /* File name
+    WCHAR file[TK_MULTI_MAX_PATH]; /* File name
                                       XXX - fixed size because it was so
                                       historically. Why not malloc'ed ?
-                                      XXX - also, TCHAR should really be WCHAR
-                                      because TkWinGetUnicodeEncoding is always
-                                      UCS2.
                                    */
 } OFNOpts;
 
@@ -596,7 +593,7 @@ static UINT APIENTRY	OFNHookProc(HWND hdlg, UINT uMsg, WPARAM wParam,
 			    LPARAM lParam);
 static LRESULT CALLBACK MsgBoxCBTProc(int nCode, WPARAM wParam, LPARAM lParam);
 static void		SetTkDialog(ClientData clientData);
-static const char *ConvertExternalFilename(TCHAR *filename,
+static const char *ConvertExternalFilename(WCHAR *filename,
 			    Tcl_DString *dsPtr);
 static void             LoadShellProcs(void);
 
@@ -644,7 +641,7 @@ static void LoadShellProcs()
     if (shell32_handle != NULL)
         return; /* We have already been through here. */
 
-    shell32_handle = GetModuleHandle(TEXT("shell32.dll"));
+    shell32_handle = GetModuleHandle(L"shell32.dll");
     if (shell32_handle == NULL) /* Should never happen but check anyways. */
         return;
 
@@ -1629,7 +1626,7 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper
 	 */
 
 	ofnData.dynFileBufferSize = 512;
-	ofnData.dynFileBuffer = ckalloc(512 * sizeof(TCHAR));
+	ofnData.dynFileBuffer = ckalloc(512 * sizeof(WCHAR));
     }
 
     if (optsPtr->extObj != NULL) {
@@ -1638,13 +1635,13 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper
 	    ++str;
 	Tcl_DStringInit(&extString);
 	Tcl_UtfToUniCharDString(str, -1, &extString);
-	ofn.lpstrDefExt = (TCHAR *) Tcl_DStringValue(&extString);
+	ofn.lpstrDefExt = (WCHAR *) Tcl_DStringValue(&extString);
     }
 
     Tcl_DStringInit(&filterString);
     Tcl_UtfToUniCharDString(Tcl_DStringValue(&utfFilterString),
 	    Tcl_DStringLength(&utfFilterString), &filterString);
-    ofn.lpstrFilter = (TCHAR *) Tcl_DStringValue(&filterString);
+    ofn.lpstrFilter = (WCHAR *) Tcl_DStringValue(&filterString);
     ofn.nFilterIndex = filterIndex;
 
     if (Tcl_DStringValue(&optsPtr->utfDirString)[0] != '\0') {
@@ -1671,12 +1668,12 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper
 	}
 	Tcl_DStringFree(&cwd);
     }
-    ofn.lpstrInitialDir = (TCHAR *) Tcl_DStringValue(&dirString);
+    ofn.lpstrInitialDir = (WCHAR *) Tcl_DStringValue(&dirString);
 
     if (optsPtr->titleObj != NULL) {
 	Tcl_DStringInit(&titleString);
 	Tcl_UtfToUniCharDString(Tcl_GetString(optsPtr->titleObj), -1, &titleString);
-	ofn.lpstrTitle = (TCHAR *) Tcl_DStringValue(&titleString);
+	ofn.lpstrTitle = (WCHAR *) Tcl_DStringValue(&titleString);
     }
 
     /*
@@ -1741,7 +1738,7 @@ static int GetFileNameXP(Tcl_Interp *interp, OFNOpts *optsPtr, enum OFNOper oper
 	     * first element is the directory path.
 	     */
 
-	    TCHAR *files = ofnData.dynFileBuffer;
+	    WCHAR *files = ofnData.dynFileBuffer;
 	    Tcl_Obj *returnList = Tcl_NewObj();
 	    int count = 0;
 
@@ -1953,7 +1950,7 @@ OFNHookProc(
 	if (notifyPtr->hdr.code == CDN_FILEOK ||
 		notifyPtr->hdr.code == CDN_SELCHANGE) {
 	    int dirsize, selsize;
-	    TCHAR *buffer;
+	    WCHAR *buffer;
 	    int buffersize;
 
 	    /*
@@ -1977,7 +1974,7 @@ OFNHookProc(
 
 	    if ((selsize > 1) && (dirsize > 0)) {
 		if (ofnData->dynFileBufferSize < buffersize) {
-		    buffer = ckrealloc(buffer, buffersize * sizeof(TCHAR));
+		    buffer = ckrealloc(buffer, buffersize * sizeof(WCHAR));
 		    ofnData->dynFileBufferSize = buffersize;
 		    ofnData->dynFileBuffer = buffer;
 		}
@@ -1994,7 +1991,7 @@ OFNHookProc(
 
 		if (buffer[0] == '"') {
 		    BOOL findquote = TRUE;
-		    TCHAR *tmp = buffer;
+		    WCHAR *tmp = buffer;
 
 		    while (*buffer != '\0') {
 			if (findquote) {
@@ -2023,7 +2020,7 @@ OFNHookProc(
 		    if (TCL_PATH_ABSOLUTE ==
 			    Tcl_GetPathType(Tcl_DStringValue(&tmpfile))) {
 			/* re-get the full path to the start of the buffer */
-			buffer = (TCHAR *) ofnData->dynFileBuffer;
+			buffer = (WCHAR *) ofnData->dynFileBuffer;
 			SendMessage(hdlg, CDM_GETSPEC, selsize, (LPARAM) buffer);
 		    } else {
 			*(buffer-1) = '\\';
@@ -2440,14 +2437,14 @@ Tk_ChooseDirectoryObjCmd(
     int objc,			/* Number of arguments. */
     Tcl_Obj *const objv[])	/* Argument objects. */
 {
-    TCHAR path[MAX_PATH];
+    WCHAR path[MAX_PATH];
     int oldMode, result;
     LPCITEMIDLIST pidl;		/* Returned by browser */
     BROWSEINFO bInfo;		/* Used by browser */
     ChooseDir cdCBData;	    /* Structure to pass back and forth */
     LPMALLOC pMalloc;		/* Used by shell */
     HWND hWnd;
-    TCHAR saveDir[MAX_PATH];
+    WCHAR saveDir[MAX_PATH];
     Tcl_DString titleString;	/* Title */
     Tcl_DString tempString;	/* temporary */
     Tcl_Obj *objPtr;
@@ -2475,17 +2472,17 @@ Tk_ChooseDirectoryObjCmd(
 
     utfDir = Tcl_DStringValue(&ofnOpts.utfDirString);
     if (utfDir[0] != '\0') {
-	const TCHAR *uniStr;
+	const WCHAR *uniStr;
 
 	Tcl_DStringInit(&tempString);
 	Tcl_UtfToUniCharDString(Tcl_DStringValue(&ofnOpts.utfDirString), -1,
                           &tempString);
-        uniStr = (TCHAR *) Tcl_DStringValue(&tempString);
+        uniStr = (WCHAR *) Tcl_DStringValue(&tempString);
 
         /* Convert possible relative path to full path to keep dialog happy. */
 
         GetFullPathName(uniStr, MAX_PATH, saveDir, NULL);
-        _tcsncpy(cdCBData.initDir, saveDir, MAX_PATH);
+        wcsncpy(cdCBData.initDir, saveDir, MAX_PATH);
     }
 
     /* XXX - rest of this (original) code has no error checks at all. */
@@ -2504,7 +2501,7 @@ Tk_ChooseDirectoryObjCmd(
     bInfo.hwndOwner = hWnd;
     bInfo.pszDisplayName = path;
     bInfo.pidlRoot = NULL;
-    if (_tcslen(cdCBData.initDir) == 0) {
+    if (wcslen(cdCBData.initDir) == 0) {
 	GetCurrentDirectory(MAX_PATH, cdCBData.initDir);
     }
     bInfo.lParam = (LPARAM) &cdCBData;
@@ -2514,7 +2511,7 @@ Tk_ChooseDirectoryObjCmd(
 	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.");
+	bInfo.lpszTitle = L"Please choose a directory, then select OK.";
     }
 
     /*
@@ -2574,8 +2571,8 @@ Tk_ChooseDirectoryObjCmd(
 		Tcl_SetErrorCode(interp, "TK", "DIRDIALOG", "PSEUDO", NULL);
 	    }
 	    pMalloc->lpVtbl->Free(pMalloc, (void *) pidl);
-	} else if (_tcslen(cdCBData.retDir) > 0) {
-	    _tcscpy(path, cdCBData.retDir);
+	} else if (wcslen(cdCBData.retDir) > 0) {
+	    wcscpy(path, cdCBData.retDir);
 	}
 	pMalloc->lpVtbl->Release(pMalloc);
     }
@@ -2631,11 +2628,11 @@ ChooseDirectoryValidateProc(
     LPARAM lParam,
     LPARAM lpData)
 {
-    TCHAR selDir[MAX_PATH];
+    WCHAR selDir[MAX_PATH];
     ChooseDir *chooseDirSharedData = (ChooseDir *) lpData;
     Tcl_DString tempString;
     Tcl_DString initDirString;
-    TCHAR string[MAX_PATH];
+    WCHAR string[MAX_PATH];
     ThreadSpecificData *tsdPtr =
 	    Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
 
@@ -2656,7 +2653,7 @@ ChooseDirectoryValidateProc(
 	 */
 
 	Tcl_DStringInit(&initDirString);
-	Tcl_UniCharToUtfDString((TCHAR *) lParam, wcslen((TCHAR *) lParam), &initDirString);
+	Tcl_UniCharToUtfDString((WCHAR *) lParam, wcslen((WCHAR *) lParam), &initDirString);
 	if (Tcl_TranslateFileName(chooseDirSharedData->interp,
 		Tcl_DStringValue(&initDirString), &tempString) == NULL) {
 	    /*
@@ -2671,7 +2668,7 @@ ChooseDirectoryValidateProc(
 	Tcl_DStringInit(&initDirString);
 	Tcl_UtfToUniCharDString(Tcl_DStringValue(&tempString), -1, &initDirString);
 	Tcl_DStringFree(&tempString);
-	_tcsncpy(string, (TCHAR *) Tcl_DStringValue(&initDirString),
+	wcsncpy(string, (WCHAR *) Tcl_DStringValue(&initDirString),
 		MAX_PATH);
 	Tcl_DStringFree(&initDirString);
 
@@ -2690,8 +2687,8 @@ ChooseDirectoryValidateProc(
 		 * User HAS to select a valid directory.
 		 */
 
-		wsprintf(selDir, TEXT("Directory '%s' does not exist,\n")
-		        TEXT("please select or enter an existing directory."),
+		wsprintf(selDir, L"Directory '%s' does not exist,\n"
+		        L"please select or enter an existing directory.",
 			chooseDirSharedData->retDir);
 		MessageBox(NULL, selDir, NULL, MB_ICONEXCLAMATION|MB_OK);
 		chooseDirSharedData->retDir[0] = '\0';
@@ -2731,11 +2728,11 @@ ChooseDirectoryValidateProc(
 
     case BFFM_INITIALIZED: {
 	/*
-	 * Directory browser intializing - tell it where to start from, user
+	 * Directory browser initializing - tell it where to start from, user
 	 * specified parameter.
 	 */
 
-	TCHAR *initDir = chooseDirSharedData->initDir;
+	WCHAR *initDir = chooseDirSharedData->initDir;
 
 	SetCurrentDirectory(initDir);
 
@@ -2754,7 +2751,7 @@ ChooseDirectoryValidateProc(
 		    ULONG ulCount, ulAttr;
 
 		    if (SUCCEEDED(psfFolder->lpVtbl->ParseDisplayName(
-			    psfFolder, hwnd, NULL, (TCHAR *)
+			    psfFolder, hwnd, NULL, (WCHAR *)
 			    initDir, &ulCount,&pidlMain,&ulAttr))
 			    && (pidlMain != NULL)) {
 			SendMessage(hwnd, BFFM_SETSELECTION, FALSE,
@@ -3046,12 +3043,12 @@ SetTkDialog(
 
 static const char *
 ConvertExternalFilename(
-    TCHAR *filename,
+    WCHAR *filename,
     Tcl_DString *dsPtr)
 {
     char *p;
 
-    Tcl_DStringInit(dsPtr)
+    Tcl_DStringInit(dsPtr);
     Tcl_UniCharToUtfDString(filename, wcslen(filename), dsPtr);
     for (p = Tcl_DStringValue(dsPtr); *p != '\0'; p++) {
 	/*
@@ -3179,7 +3176,7 @@ HookProc(
 	    Tcl_DStringInit(&title);
 	    Tcl_UtfToUniCharDString(Tcl_GetString(phd->titleObj), -1, &title);
 	    if (Tcl_DStringLength(&title) > 0) {
-		SetWindowText(hwndDlg, (LPCTSTR) Tcl_DStringValue(&title));
+		SetWindowText(hwndDlg, (LPCWSTR) Tcl_DStringValue(&title));
 	    }
 	    Tcl_DStringFree(&title);
 	}
@@ -3496,7 +3493,7 @@ FontchooserShowCmd(
 	cf.Flags |= CF_INITTOLOGFONTSTRUCT;
 	Tcl_DStringInit(&ds);
 	Tcl_UtfToUniCharDString(fontPtr->fa.family, -1, &ds);
-	_tcsncpy(lf.lfFaceName, (TCHAR *)Tcl_DStringValue(&ds),
+	wcsncpy(lf.lfFaceName, (WCHAR *)Tcl_DStringValue(&ds),
 		LF_FACESIZE-1);
 	Tcl_DStringFree(&ds);
 	lf.lfFaceName[LF_FACESIZE-1] = 0;
diff --git a/win/tkWinEmbed.c b/win/tkWinEmbed.c
index c45f088..22ad0dd 100644
--- a/win/tkWinEmbed.c
+++ b/win/tkWinEmbed.c
@@ -303,10 +303,10 @@ TkpUseWindow(
 	 * order to avoid bug 1096074 in future.
 	 */
 
-	TCHAR msg[256];
+	WCHAR msg[256];
 
-	wsprintf(msg, TEXT("Unable to get information of window \"%.40hs\".  Attach to this\nwindow may have unpredictable results if it is not a valid container.\n\nPress Ok to proceed or Cancel to abort attaching."), string);
-	if (IDCANCEL == MessageBox(hwnd, msg, TEXT("Tk Warning"),
+	wsprintf(msg, L"Unable to get information of window \"%.40hs\".  Attach to this\nwindow may have unpredictable results if it is not a valid container.\n\nPress Ok to proceed or Cancel to abort attaching.", string);
+	if (IDCANCEL == MessageBox(hwnd, msg, L"Tk Warning",
 		MB_OKCANCEL | MB_ICONWARNING)) {
     	    Tcl_SetObjResult(interp, Tcl_NewStringObj(
 		    "Operation has been canceled", -1));
diff --git a/win/tkWinFont.c b/win/tkWinFont.c
index 4ffa32b..1f1361d 100644
--- a/win/tkWinFont.c
+++ b/win/tkWinFont.c
@@ -50,11 +50,11 @@ typedef struct FontFamily {
     int isSymbolFont;		/* Non-zero if this is a symbol font. */
     int isWideFont;		/* 1 if this is a double-byte font, 0
 				 * otherwise. */
-    BOOL (WINAPI *textOutProc)(HDC hdc, int x, int y, TCHAR *str, int len);
+    BOOL (WINAPI *textOutProc)(HDC hdc, int x, int y, WCHAR *str, int len);
 				/* The procedure to use to draw text after it
 				 * has been converted from UTF-8 to the
 				 * encoding of this font. */
-    BOOL (WINAPI *getTextExtentPoint32Proc)(HDC, TCHAR *, int, LPSIZE);
+    BOOL (WINAPI *getTextExtentPoint32Proc)(HDC, WCHAR *, int, LPSIZE);
 				/* The procedure to use to measure text after
 				 * it has been converted from UTF-8 to the
 				 * encoding of this font. */
@@ -179,12 +179,6 @@ typedef struct ThreadSpecificData {
 static Tcl_ThreadDataKey dataKey;
 
 /*
- * Information cached about the system at startup time.
- */
-
-static Tcl_Encoding systemEncoding;
-
-/*
  * Procedures used only in this file.
  */
 
@@ -262,7 +256,6 @@ void
 TkpFontPkgInit(
     TkMainInfo *mainPtr)	/* The application being created. */
 {
-    systemEncoding = TkWinGetUnicodeEncoding();
     TkWinSetupSystemFonts(mainPtr);
 }
 
@@ -446,7 +439,7 @@ TkWinSetupSystemFonts(
     {
 	LOGFONT lfFixed = {
 	    0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET,
-	    0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, TEXT("")
+	    0, 0, DEFAULT_QUALITY, FIXED_PITCH | FF_MODERN, L""
 	};
 	long pointSize, dpi;
 	HDC hdc = GetDC(NULL);
@@ -664,11 +657,12 @@ WinFontFamilyEnumProc(
     int fontType,		/* Type of font (not used). */
     LPARAM lParam)		/* Result object to hold result. */
 {
-    char *faceName = (char *) lfPtr->elfLogFont.lfFaceName;
+    WCHAR *faceName = (WCHAR *) lfPtr->elfLogFont.lfFaceName;
     Tcl_Obj *resultObj = (Tcl_Obj *) lParam;
     Tcl_DString faceString;
 
-    Tcl_ExternalToUtfDString(systemEncoding, faceName, -1, &faceString);
+    Tcl_DStringInit(&faceString);
+    Tcl_UniCharToUtfDString(faceName, wcslen(faceName), &faceString);
     Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj(
 	    Tcl_DStringValue(&faceString), Tcl_DStringLength(&faceString)));
     Tcl_DStringFree(&faceString);
@@ -858,7 +852,7 @@ Tk_MeasureChars(
 		    (int) (p - start), &runString);
 	    size.cx = 0;
 	    familyPtr->getTextExtentPoint32Proc(hdc,
-		    (TCHAR *)Tcl_DStringValue(&runString),
+		    (WCHAR *)Tcl_DStringValue(&runString),
 		    Tcl_DStringLength(&runString) >> familyPtr->isWideFont,
 		    &size);
 	    Tcl_DStringFree(&runString);
@@ -885,7 +879,7 @@ Tk_MeasureChars(
 	Tcl_UtfToExternalDString(familyPtr->encoding, start,
 		(int) (p - start), &runString);
 	size.cx = 0;
-	familyPtr->getTextExtentPoint32Proc(hdc, (TCHAR *) Tcl_DStringValue(&runString),
+	familyPtr->getTextExtentPoint32Proc(hdc, (WCHAR *) Tcl_DStringValue(&runString),
 		Tcl_DStringLength(&runString) >> familyPtr->isWideFont,
 		&size);
 	Tcl_DStringFree(&runString);
@@ -919,7 +913,7 @@ Tk_MeasureChars(
 	    Tcl_DStringAppend(&runString,buf,dstWrote);
 	    size.cx = 0;
 	    familyPtr->getTextExtentPoint32Proc(hdc,
-		    (TCHAR *) Tcl_DStringValue(&runString),
+		    (WCHAR *) Tcl_DStringValue(&runString),
 		    Tcl_DStringLength(&runString) >> familyPtr->isWideFont,
 		    &size);
 	    if ((curX+size.cx) > maxLength) {
@@ -1469,10 +1463,10 @@ MultiFontTextOut(
  		Tcl_UtfToExternalDString(familyPtr->encoding, source,
 			(int) (p - source), &runString);
 		familyPtr->textOutProc(hdc, x-(tm.tmOverhang/2), y,
-			(TCHAR *)Tcl_DStringValue(&runString),
+			(WCHAR *)Tcl_DStringValue(&runString),
 			Tcl_DStringLength(&runString)>>familyPtr->isWideFont);
 		familyPtr->getTextExtentPoint32Proc(hdc,
-			(TCHAR *)Tcl_DStringValue(&runString),
+			(WCHAR *)Tcl_DStringValue(&runString),
 			Tcl_DStringLength(&runString) >> familyPtr->isWideFont,
 			&size);
 		x += size.cx;
@@ -1490,7 +1484,7 @@ MultiFontTextOut(
  	Tcl_UtfToExternalDString(familyPtr->encoding, source,
 		(int) (p - source), &runString);
 	familyPtr->textOutProc(hdc, x-(tm.tmOverhang/2), y,
-		(TCHAR *)Tcl_DStringValue(&runString),
+		(WCHAR *)Tcl_DStringValue(&runString),
 		Tcl_DStringLength(&runString) >> familyPtr->isWideFont);
 	Tcl_DStringFree(&runString);
     }
@@ -1565,7 +1559,7 @@ InitFont(
     Tcl_Encoding encoding;
     Tcl_DString faceString;
     TkFontAttributes *faPtr;
-    TCHAR buf[LF_FACESIZE];
+    WCHAR buf[LF_FACESIZE];
 
     window = Tk_WindowId(tkwin);
     hwnd = (window == None) ? NULL : TkWinGetHWND(window);
@@ -1590,7 +1584,8 @@ InitFont(
      */
 
     GetTextFace(hdc, LF_FACESIZE, buf);
-    Tcl_ExternalToUtfDString(systemEncoding, (char *) buf, -1, &faceString);
+    Tcl_DStringInit(&faceString);
+    Tcl_UniCharToUtfDString(buf, wcslen(buf), &faceString);
 
     fontPtr->font.fid	= (Font) fontPtr;
     fontPtr->hwnd	= hwnd;
@@ -1761,13 +1756,14 @@ AllocFontFamily(
     FontFamily *familyPtr;
     Tcl_DString faceString;
     Tcl_Encoding encoding;
-    TCHAR buf[LF_FACESIZE];
+    WCHAR buf[LF_FACESIZE];
     ThreadSpecificData *tsdPtr =
 	    Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
 
     hFont = SelectObject(hdc, hFont);
     GetTextFace(hdc, LF_FACESIZE, buf);
-    Tcl_ExternalToUtfDString(systemEncoding, (char *) buf, -1, &faceString);
+    Tcl_DStringInit(&faceString);
+    Tcl_UniCharToUtfDString(buf, wcslen(buf), &faceString);
     faceName = Tk_GetUid(Tcl_DStringValue(&faceString));
     Tcl_DStringFree(&faceString);
     hFont = SelectObject(hdc, hFont);
@@ -1825,15 +1821,15 @@ AllocFontFamily(
     if (encoding == NULL) {
 	encoding = Tcl_GetEncoding(NULL, "unicode");
 	familyPtr->textOutProc =
-	    (BOOL (WINAPI *)(HDC, int, int, TCHAR *, int)) TextOutW;
+	    (BOOL (WINAPI *)(HDC, int, int, WCHAR *, int)) TextOutW;
 	familyPtr->getTextExtentPoint32Proc =
-	    (BOOL (WINAPI *)(HDC, TCHAR *, int, LPSIZE)) GetTextExtentPoint32W;
+	    (BOOL (WINAPI *)(HDC, WCHAR *, int, LPSIZE)) GetTextExtentPoint32W;
 	familyPtr->isWideFont = 1;
     } else {
 	familyPtr->textOutProc =
-	    (BOOL (WINAPI *)(HDC, int, int, TCHAR *, int)) TextOutA;
+	    (BOOL (WINAPI *)(HDC, int, int, WCHAR *, int)) TextOutA;
 	familyPtr->getTextExtentPoint32Proc =
-	    (BOOL (WINAPI *)(HDC, TCHAR *, int, LPSIZE)) GetTextExtentPoint32A;
+	    (BOOL (WINAPI *)(HDC, WCHAR *, int, LPSIZE)) GetTextExtentPoint32A;
 	familyPtr->isWideFont = 0;
     }
 
@@ -2070,8 +2066,9 @@ WinFontCanUseProc(
     fontPtr	    = canUsePtr->fontPtr;
     nameTriedPtr    = canUsePtr->nameTriedPtr;
 
-    fallbackName = (char *) lfPtr->elfLogFont.lfFaceName;
-    Tcl_ExternalToUtfDString(systemEncoding, fallbackName, -1, &faceString);
+    fallbackName = (char *)lfPtr->elfLogFont.lfFaceName;
+    Tcl_DStringInit(&faceString);
+    Tcl_UniCharToUtfDString((WCHAR *)fallbackName, wcslen((WCHAR *)fallbackName), &faceString);
     fallbackName = Tcl_DStringValue(&faceString);
 
     if (SeenName(fallbackName, nameTriedPtr) == 0) {
@@ -2493,8 +2490,9 @@ GetScreenFont(
     lf.lfQuality	= DEFAULT_QUALITY;
     lf.lfPitchAndFamily = DEFAULT_PITCH | FF_DONTCARE;
 
-    Tcl_UtfToExternalDString(systemEncoding, faceName, -1, &ds);
-    _tcsncpy(lf.lfFaceName, (TCHAR *)Tcl_DStringValue(&ds), LF_FACESIZE-1);
+    Tcl_DStringInit(&ds);
+    Tcl_UtfToUniCharDString(faceName, -1, &ds);
+    wcsncpy(lf.lfFaceName, (WCHAR *)Tcl_DStringValue(&ds), LF_FACESIZE-1);
     Tcl_DStringFree(&ds);
     lf.lfFaceName[LF_FACESIZE-1] = 0;
     hFont = CreateFontIndirect(&lf);
@@ -2528,7 +2526,7 @@ FamilyExists(
     int result;
     Tcl_DString faceString;
 
-    Tcl_UtfToExternalDString(systemEncoding, faceName, -1, &faceString);
+    Tcl_UtfToUniCharDString(faceName, -1, &faceString);
 
     /*
      * If the family exists, WinFontExistProc() will be called and
@@ -2537,7 +2535,7 @@ FamilyExists(
      * non-zero value.
      */
 
-    result = EnumFontFamilies(hdc, (TCHAR*) Tcl_DStringValue(&faceString),
+    result = EnumFontFamilies(hdc, (WCHAR*) Tcl_DStringValue(&faceString),
 	    (FONTENUMPROC) WinFontExistProc, 0);
     Tcl_DStringFree(&faceString);
     return (result == 0);
diff --git a/win/tkWinInit.c b/win/tkWinInit.c
index 9add471..b2d5ba4 100644
--- a/win/tkWinInit.c
+++ b/win/tkWinInit.c
@@ -179,7 +179,7 @@ TkWin32ErrorObj(
     HRESULT hrError)
 {
     LPTSTR lpBuffer = NULL, p = NULL;
-    TCHAR  sBuffer[30];
+    WCHAR  sBuffer[30];
     Tcl_Obj* errPtr = NULL;
 #ifdef _UNICODE
     Tcl_DString ds;
@@ -191,11 +191,11 @@ TkWin32ErrorObj(
 
     if (lpBuffer == NULL) {
 	lpBuffer = sBuffer;
-	wsprintf(sBuffer, TEXT("Error Code: %08lX"), hrError);
+	wsprintf(sBuffer, L"Error Code: %08lX", hrError);
     }
 
-    if ((p = _tcsrchr(lpBuffer, TEXT('\r'))) != NULL) {
-	*p = TEXT('\0');
+    if ((p = wcsrchr(lpBuffer, L'\r')) != NULL) {
+	*p = L'\0';
     }
 
 #ifdef _UNICODE
diff --git a/win/tkWinKey.c b/win/tkWinKey.c
index 8db34af..c1f9891 100644
--- a/win/tkWinKey.c
+++ b/win/tkWinKey.c
@@ -186,7 +186,7 @@ KeycodeToKeysym(
 {
     BYTE keys[256];
     int result, deadkey, shift;
-    TCHAR buf[4];
+    WCHAR buf[4];
     unsigned int scancode = MapVirtualKey(keycode, 0);
 
     /*
@@ -572,7 +572,7 @@ TkpSetKeycodeAndState(
 	}
     }
     if (keySym >= 0x20) {
-	result = VkKeyScan((TCHAR) keySym);
+	result = VkKeyScan((WCHAR) keySym);
 	if (result != -1) {
 	    shift = result >> 8;
 	    if (shift & 1)
@@ -625,7 +625,7 @@ XKeysymToKeycode(
 	}
     }
     if (keysym >= 0x20) {
-	result = VkKeyScan((TCHAR) keysym);
+	result = VkKeyScan((WCHAR) keysym);
 	if (result != -1) {
 	    return (KeyCode) (result & 0xff);
 	}
diff --git a/win/tkWinMenu.c b/win/tkWinMenu.c
index 460a743..3cd6494 100644
--- a/win/tkWinMenu.c
+++ b/win/tkWinMenu.c
@@ -19,8 +19,8 @@
  * The class of the window for popup menus.
  */
 
-#define MENU_CLASS_NAME			TEXT("MenuWindowClass")
-#define EMBEDDED_MENU_CLASS_NAME	TEXT("EmbeddedMenuWindowClass")
+#define MENU_CLASS_NAME			L"MenuWindowClass"
+#define EMBEDDED_MENU_CLASS_NAME	L"EmbeddedMenuWindowClass"
 
 /*
  * Used to align a windows bitmap inside a rectangle
@@ -573,7 +573,7 @@ ReconfigureWindowsMenu(
     TkMenuEntry *mePtr;
     HMENU winMenuHdl = (HMENU) menuPtr->platformData;
     char *itemText = NULL;
-    const TCHAR *lpNewItem;
+    const WCHAR *lpNewItem;
     UINT flags;
     UINT itemID;
     int i, count, systemMenu = 0, base;
@@ -611,10 +611,10 @@ ReconfigureWindowsMenu(
 		|| (menuPtr->menuFlags & MENU_SYSTEM_MENU)) {
 		Tcl_DStringInit(&translatedText);
 		Tcl_UtfToUniCharDString(itemText, -1, &translatedText);
-	    lpNewItem = (const TCHAR *) Tcl_DStringValue(&translatedText);
+	    lpNewItem = (const WCHAR *) Tcl_DStringValue(&translatedText);
 	    flags |= MF_STRING;
 	} else {
-	    lpNewItem = (LPCTSTR) mePtr;
+	    lpNewItem = (LPCWSTR) mePtr;
 	    flags |= MF_OWNERDRAW;
 	}
 
@@ -3494,7 +3494,7 @@ TkpMenuThreadInit(void)
     ThreadSpecificData *tsdPtr =
 	    Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
 
-    tsdPtr->menuHWND = CreateWindow(MENU_CLASS_NAME, TEXT("MenuWindow"), WS_POPUP,
+    tsdPtr->menuHWND = CreateWindow(MENU_CLASS_NAME, L"MenuWindow", WS_POPUP,
 	    0, 0, 10, 10, NULL, NULL, Tk_GetHINSTANCE(), NULL);
 
     if (!tsdPtr->menuHWND) {
@@ -3502,7 +3502,7 @@ TkpMenuThreadInit(void)
     }
 
     tsdPtr->embeddedMenuHWND =
-	    CreateWindow(EMBEDDED_MENU_CLASS_NAME, TEXT("EmbeddedMenuWindow"),
+	    CreateWindow(EMBEDDED_MENU_CLASS_NAME, L"EmbeddedMenuWindow",
 	    WS_POPUP, 0, 0, 10, 10, NULL, NULL, Tk_GetHINSTANCE(), NULL);
 
     if (!tsdPtr->embeddedMenuHWND) {
diff --git a/win/tkWinPixmap.c b/win/tkWinPixmap.c
index aa1ebde..92b4f50 100644
--- a/win/tkWinPixmap.c
+++ b/win/tkWinPixmap.c
@@ -106,7 +106,7 @@ Tk_GetPixmap(
 		    MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
 		    (LPTSTR)&lpMsgBuf, 0, NULL)) {
 		MessageBox(NULL, (LPTSTR) lpMsgBuf,
-			TEXT("Tk_GetPixmap: Error from CreateDIBSection"),
+			L"Tk_GetPixmap: Error from CreateDIBSection",
 			MB_OK | MB_ICONINFORMATION);
 		LocalFree(lpMsgBuf);
 	    }
diff --git a/win/tkWinScrlbr.c b/win/tkWinScrlbr.c
index 43a33ee..1edb1d8 100644
--- a/win/tkWinScrlbr.c
+++ b/win/tkWinScrlbr.c
@@ -223,7 +223,7 @@ CreateProc(
 		| SBS_HORZ;
     }
 
-    scrollPtr->hwnd = CreateWindow(TEXT("SCROLLBAR"), NULL, style,
+    scrollPtr->hwnd = CreateWindow(L"SCROLLBAR", NULL, style,
 	    Tk_X(tkwin), Tk_Y(tkwin), Tk_Width(tkwin), Tk_Height(tkwin),
 	    parent, NULL, Tk_GetHINSTANCE(), NULL);
 
diff --git a/win/tkWinSend.c b/win/tkWinSend.c
index a4c9d4e..748ebaf 100644
--- a/win/tkWinSend.c
+++ b/win/tkWinSend.c
@@ -873,7 +873,7 @@ TkWinSend_SetExcepInfo(
     /* TODO: Handle failure to append */
 
     src = Tcl_GetString(opError);
-    Tcl_DStringInit(&ds)
+    Tcl_DStringInit(&ds);
     Tcl_UtfToUniCharDString(src, opError->length, &ds);
     pExcepInfo->bstrDescription =
 	    SysAllocString((WCHAR *) Tcl_DStringValue(&ds));
diff --git a/win/tkWinTest.c b/win/tkWinTest.c
index 68c54f6..957bc02 100644
--- a/win/tkWinTest.c
+++ b/win/tkWinTest.c
@@ -435,7 +435,7 @@ TestfindwindowObjCmd(
     int objc,			/* Number of arguments. */
     Tcl_Obj *const objv[])	/* Argument values. */
 {
-    const TCHAR  *title = NULL, *class = NULL;
+    const WCHAR  *title = NULL, *class = NULL;
     Tcl_DString titleString, classString;
     HWND hwnd = NULL;
     int r = TCL_OK;
@@ -515,7 +515,7 @@ TestgetwindowinfoObjCmd(
     Tcl_WideInt hwnd;
     Tcl_Obj *dictObj = NULL, *classObj = NULL, *textObj = NULL;
     Tcl_Obj *childrenObj = NULL;
-    TCHAR buf[512];
+    WCHAR buf[512];
     int cch, cchBuf = 256;
     Tcl_DString ds;
 
diff --git a/win/tkWinWm.c b/win/tkWinWm.c
index 6aecfa8..1337cbc 100644
--- a/win/tkWinWm.c
+++ b/win/tkWinWm.c
@@ -883,7 +883,7 @@ InitWindowClass(
 	    class.lpszClassName = TK_WIN_TOPLEVEL_CLASS_NAME;
 	    class.lpfnWndProc = WmProc;
 	    if (titlebaricon == NULL) {
-		class.hIcon = LoadIcon(Tk_GetHINSTANCE(), TEXT("tk"));
+		class.hIcon = LoadIcon(Tk_GetHINSTANCE(), L"tk");
 	    } else {
 		class.hIcon = GetIcon(titlebaricon, ICON_BIG);
 		if (class.hIcon == NULL) {
@@ -1249,7 +1249,7 @@ ReadIconFromFile(
 	Tcl_DStringInit(&ds2);
 	Tcl_UtfToUniCharDString(file, -1, &ds2);
 	Tcl_DStringFree(&ds);
-	res = (DWORD *)SHGetFileInfo((TCHAR *)Tcl_DStringValue(&ds2), 0, &sfiSM,
+	res = (DWORD *)SHGetFileInfo((WCHAR *)Tcl_DStringValue(&ds2), 0, &sfiSM,
 		sizeof(SHFILEINFO), SHGFI_SMALLICON|SHGFI_ICON);
 
 	if (res != 0) {
@@ -1257,7 +1257,7 @@ ReadIconFromFile(
 	    unsigned size;
 
 	    Tcl_ResetResult(interp);
-	    res = (DWORD *)SHGetFileInfo((TCHAR *)Tcl_DStringValue(&ds2), 0, &sfi,
+	    res = (DWORD *)SHGetFileInfo((WCHAR *)Tcl_DStringValue(&ds2), 0, &sfi,
 		    sizeof(SHFILEINFO), SHGFI_ICON);
 
 	    /*
@@ -2133,7 +2133,7 @@ UpdateWrapper(
 
 	wmPtr->wrapper = CreateWindowEx(wmPtr->exStyle,
 		TK_WIN_TOPLEVEL_CLASS_NAME,
-		(LPCTSTR) Tcl_DStringValue(&titleString),
+		(LPCWSTR) Tcl_DStringValue(&titleString),
 		wmPtr->style, x, y, width, height,
 		parentHWND, NULL, Tk_GetHINSTANCE(), NULL);
 	Tcl_DStringFree(&titleString);
@@ -5468,7 +5468,7 @@ WmTitleCmd(
     }
     if (objc == 3) {
 	if (wrapper) {
-	    TCHAR buf[256];
+	    WCHAR buf[256];
 	    Tcl_DString titleString;
 	    int size = 256;
 
@@ -5497,7 +5497,7 @@ WmTitleCmd(
 
 	    Tcl_DStringInit(&titleString);
 	    Tcl_UtfToUniCharDString(wmPtr->title, -1, &titleString);
-	    SetWindowText(wrapper, (LPCTSTR) Tcl_DStringValue(&titleString));
+	    SetWindowText(wrapper, (LPCWSTR) Tcl_DStringValue(&titleString));
 	    Tcl_DStringFree(&titleString);
 	}
     }
diff --git a/win/tkWinX.c b/win/tkWinX.c
index e410644..647474a 100644
--- a/win/tkWinX.c
+++ b/win/tkWinX.c
@@ -127,7 +127,7 @@ TkGetServerInfo(
     OSVERSIONINFOW os;
 
     if (!buffer[0]) {
-	HANDLE handle = GetModuleHandle(TEXT("NTDLL"));
+	HANDLE handle = GetModuleHandle(L"NTDLL");
 	int(__stdcall *getversion)(void *) =
 		(int(__stdcall *)(void *))GetProcAddress(handle, "RtlGetVersion");
 	os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
@@ -258,7 +258,7 @@ TkWinXInit(
 
     if (GetLocaleInfo(LANGIDFROMLCID(PTR2INT(GetKeyboardLayout(0))),
 	       LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
-	       (LPTSTR) &lpCP, sizeof(lpCP)/sizeof(TCHAR))
+	       (LPTSTR) &lpCP, sizeof(lpCP)/sizeof(WCHAR))
 	    && TranslateCharsetInfo(INT2PTR(lpCP), &lpCs, TCI_SRCCODEPAGE)) {
 	UpdateInputLanguage((int) lpCs.ciCharset);
     }
@@ -346,8 +346,8 @@ TkWinGetPlatformTheme(void)
 
 	if ((os.dwMajorVersion == 5 && os.dwMinorVersion == 1)) {
 	    HKEY hKey;
-	    LPCTSTR szSubKey = TEXT("Control Panel\\Appearance");
-	    LPCTSTR szCurrent = TEXT("Current");
+	    LPCWSTR szSubKey = L"Control Panel\\Appearance";
+	    LPCWSTR szCurrent = L"Current";
 	    DWORD dwSize = 200;
 	    char pBuffer[200];
 
diff --git a/win/ttkWinMonitor.c b/win/ttkWinMonitor.c
index 5d9cf0a..e3608f3 100644
--- a/win/ttkWinMonitor.c
+++ b/win/ttkWinMonitor.c
@@ -72,8 +72,8 @@ CreateThemeMonitorWindow(HINSTANCE hinst, Tcl_Interp *interp)
 {
     WNDCLASSEX wc;
     HWND       hwnd = NULL;
-    TCHAR      title[32] = TEXT("TtkMonitorWindow");
-    TCHAR      name[32] = TEXT("TtkMonitorClass");
+    WCHAR      title[32] = L"TtkMonitorWindow";
+    WCHAR      name[32] = L"TtkMonitorClass";
 
     wc.cbSize        = sizeof(WNDCLASSEX);
     wc.style         = CS_HREDRAW | CS_VREDRAW;
diff --git a/win/ttkWinXPTheme.c b/win/ttkWinXPTheme.c
index be9d5c8..e217149 100644
--- a/win/ttkWinXPTheme.c
+++ b/win/ttkWinXPTheme.c
@@ -95,7 +95,7 @@ LoadXPThemeProcs(HINSTANCE *phlib)
      * if we are running at least on Windows XP.
      */
     HINSTANCE handle;
-    *phlib = handle = LoadLibrary(TEXT("uxtheme.dll"));
+    *phlib = handle = LoadLibrary(L"uxtheme.dll");
     if (handle != 0)
     {
 	/*
-- 
cgit v0.12