From 14ffbbfd3279791bcc99fd50066d6821e92cc5f9 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Tue, 24 Sep 2019 11:49:30 +0000 Subject: Allow "wm frame" to return id's > 0xFFFFFFFF on 64-bit platforms (if the id really is that large). Backport the (internal) use of TCL_Z_MODIFIER from Tk 8.7. --- generic/tkInt.h | 10 ++++++++++ macosx/tkMacOSXWm.c | 4 +++- unix/tkUnixWm.c | 4 +++- win/tkWinWm.c | 6 ++++-- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/generic/tkInt.h b/generic/tkInt.h index cd27afc..e4e49cb 100644 --- a/generic/tkInt.h +++ b/generic/tkInt.h @@ -84,6 +84,16 @@ # endif #endif +#ifndef TCL_Z_MODIFIER +# if defined(_WIN64) +# define TCL_Z_MODIFIER "I" +# elif defined(__GNUC__) && !defined(_WIN32) +# define TCL_Z_MODIFIER "z" +# else +# define TCL_Z_MODIFIER "" +# endif +#endif /* !TCL_Z_MODIFIER */ + /* * Opaque type declarations: */ diff --git a/macosx/tkMacOSXWm.c b/macosx/tkMacOSXWm.c index ca19197..25966a6 100644 --- a/macosx/tkMacOSXWm.c +++ b/macosx/tkMacOSXWm.c @@ -1984,6 +1984,7 @@ WmFrameCmd( { register WmInfo *wmPtr = winPtr->wmInfoPtr; Window window; + char buf[TCL_INTEGER_SPACE]; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "window"); @@ -1993,7 +1994,8 @@ WmFrameCmd( if (window == None) { window = Tk_WindowId((Tk_Window) winPtr); } - Tcl_SetObjResult(interp, Tcl_ObjPrintf("0x%x", (unsigned) window)); + sprintf(buf, "0x%" TCL_Z_MODIFIER "x", (size_t)window); + Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1)); return TCL_OK; } diff --git a/unix/tkUnixWm.c b/unix/tkUnixWm.c index 7b69713..f09b59c 100644 --- a/unix/tkUnixWm.c +++ b/unix/tkUnixWm.c @@ -1871,6 +1871,7 @@ WmFrameCmd( { register WmInfo *wmPtr = winPtr->wmInfoPtr; Window window; + char buf[TCL_INTEGER_SPACE]; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "window"); @@ -1880,7 +1881,8 @@ WmFrameCmd( if (window == None) { window = Tk_WindowId((Tk_Window) winPtr); } - Tcl_SetObjResult(interp, Tcl_ObjPrintf("0x%x", (unsigned) window)); + sprintf(buf, "0x%" TCL_Z_MODIFIER "x", (size_t)window); + Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1)); return TCL_OK; } diff --git a/win/tkWinWm.c b/win/tkWinWm.c index 8b3e449..dcafd68 100644 --- a/win/tkWinWm.c +++ b/win/tkWinWm.c @@ -3711,6 +3711,7 @@ WmFrameCmd( { register WmInfo *wmPtr = winPtr->wmInfoPtr; HWND hwnd; + char buf[TCL_INTEGER_SPACE]; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "window"); @@ -3723,7 +3724,8 @@ WmFrameCmd( if (hwnd == NULL) { hwnd = Tk_GetHWND(Tk_WindowId((Tk_Window) winPtr)); } - Tcl_SetObjResult(interp, Tcl_ObjPrintf("0x%x", PTR2INT(hwnd))); + sprintf(buf, "0x%" TCL_Z_MODIFIER "x", (size_t)hwnd); + Tcl_SetObjResult(interp, Tcl_NewStringObj(buf, -1)); return TCL_OK; } @@ -5466,7 +5468,7 @@ WmTitleCmd( int size = 256; GetWindowTextW(wrapper, buf, size); - Tcl_WinTCharToUtf(buf, -1, &titleString); + Tcl_WinTCharToUtf((LPCTSTR)buf, -1, &titleString); Tcl_SetObjResult(interp, Tcl_NewStringObj( Tcl_DStringValue(&titleString), Tcl_DStringLength(&titleString))); -- cgit v0.12 From 93a3e63b7e9a22f94f1101b7ba32ac79738e5b65 Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Tue, 24 Sep 2019 11:52:02 +0000 Subject: Add type-casts to many usage of Tcl_WinTCharToUtf(), so Tk compiles without warnings when omitting -DUNICODE. --- win/tkWinClipboard.c | 4 ++-- win/tkWinDialog.c | 16 ++++++++-------- win/tkWinFont.c | 8 ++++---- win/tkWinInit.c | 2 +- win/tkWinMenu.c | 4 ++-- win/tkWinSend.c | 6 +++--- win/tkWinSendCom.c | 6 +++--- win/tkWinTest.c | 20 ++++++++++---------- win/tkWinX.c | 2 +- win/ttkWinXPTheme.c | 4 ++-- 10 files changed, 36 insertions(+), 36 deletions(-) diff --git a/win/tkWinClipboard.c b/win/tkWinClipboard.c index c4399ab..8886f2a 100644 --- a/win/tkWinClipboard.c +++ b/win/tkWinClipboard.c @@ -79,7 +79,7 @@ TkSelGetSelection( goto error; } data = GlobalLock(handle); - Tcl_WinTCharToUtf((WCHAR *)data, -1, &ds); + Tcl_WinTCharToUtf((LPCTSTR)data, -1, &ds); GlobalUnlock(handle); } else if (IsClipboardFormatAvailable(CF_TEXT)) { /* @@ -157,7 +157,7 @@ TkSelGetSelection( Tcl_DStringAppend(&ds, "\n", 1); } len = wcslen(fname); - Tcl_WinTCharToUtf(fname, len * sizeof(WCHAR), &dsTmp); + Tcl_WinTCharToUtf((LPCTSTR)fname, len * sizeof(WCHAR), &dsTmp); Tcl_DStringAppend(&ds, Tcl_DStringValue(&dsTmp), Tcl_DStringLength(&dsTmp)); Tcl_DStringFree(&dsTmp); diff --git a/win/tkWinDialog.c b/win/tkWinDialog.c index 8f61428..27137e7 100644 --- a/win/tkWinDialog.c +++ b/win/tkWinDialog.c @@ -922,7 +922,7 @@ ColorDlgHookProc( if ((title != NULL) && (title[0] != '\0')) { Tcl_DString ds; - SetWindowTextW(hDlg, Tcl_WinUtfToTChar(title,-1,&ds)); + SetWindowTextW(hDlg, (LPCWSTR)Tcl_WinUtfToTChar(title,-1,&ds)); Tcl_DStringFree(&ds); } if (tsdPtr->debugFlag) { @@ -1511,7 +1511,7 @@ static int GetFileNameVista(Tcl_Interp *interp, OFNOpts *optsPtr, Tcl_DString ftds; Tcl_Obj *ftobj; - Tcl_WinTCharToUtf(filterPtr[ftix-1].pszName, -1, &ftds); + Tcl_WinTCharToUtf((LPCTSTR)filterPtr[ftix-1].pszName, -1, &ftds); ftobj = Tcl_NewStringObj(Tcl_DStringValue(&ftds), Tcl_DStringLength(&ftds)); Tcl_ObjSetVar2(interp, optsPtr->typeVariableObj, NULL, @@ -2493,7 +2493,7 @@ Tk_ChooseDirectoryObjCmd( bInfo.lParam = (LPARAM) &cdCBData; if (ofnOpts.titleObj != NULL) { - bInfo.lpszTitle = (LPCWSTR) Tcl_WinUtfToTChar( + bInfo.lpszTitle = (LPCWSTR)Tcl_WinUtfToTChar( Tcl_GetString(ofnOpts.titleObj), -1, &titleString); } else { bInfo.lpszTitle = L"Please choose a directory, then select OK."; @@ -2637,7 +2637,7 @@ ChooseDirectoryValidateProc( * like ~ are converted correctly. */ - Tcl_WinTCharToUtf((WCHAR *) lParam, -1, &initDirString); + Tcl_WinTCharToUtf((LPCTSTR) lParam, -1, &initDirString); if (Tcl_TranslateFileName(chooseDirSharedData->interp, Tcl_DStringValue(&initDirString), &tempString) == NULL) { /* @@ -2929,10 +2929,10 @@ Tk_MessageBoxObjCmd( tsdPtr->hMsgBoxHook = SetWindowsHookExW(WH_CBT, MsgBoxCBTProc, NULL, GetCurrentThreadId()); src = Tcl_GetString(tmpObj); - tmpPtr = Tcl_WinUtfToTChar(src, tmpObj->length, &tmpBuf); + tmpPtr = (LPCWSTR)Tcl_WinUtfToTChar(src, tmpObj->length, &tmpBuf); if (titleObj != NULL) { src = Tcl_GetString(titleObj); - titlePtr = Tcl_WinUtfToTChar(src, titleObj->length, &titleBuf); + titlePtr = (LPCWSTR)Tcl_WinUtfToTChar(src, titleObj->length, &titleBuf); } else { titlePtr = L""; Tcl_DStringInit(&titleBuf); @@ -3029,7 +3029,7 @@ ConvertExternalFilename( { char *p; - Tcl_WinTCharToUtf(filename, -1, dsPtr); + Tcl_WinTCharToUtf((LPCTSTR)filename, -1, dsPtr); for (p = Tcl_DStringValue(dsPtr); *p != '\0'; p++) { /* * Change the pathname to the Tcl "normalized" pathname, where back @@ -3066,7 +3066,7 @@ GetFontObj( int pt = 0; resObj = Tcl_NewListObj(0, NULL); - Tcl_WinTCharToUtf(plf->lfFaceName, -1, &ds); + Tcl_WinTCharToUtf((LPCTSTR)plf->lfFaceName, -1, &ds); Tcl_ListObjAppendElement(NULL, resObj, Tcl_NewStringObj(Tcl_DStringValue(&ds), -1)); Tcl_DStringFree(&ds); diff --git a/win/tkWinFont.c b/win/tkWinFont.c index bcac5c5..321ecc4 100644 --- a/win/tkWinFont.c +++ b/win/tkWinFont.c @@ -660,7 +660,7 @@ WinFontFamilyEnumProc( Tcl_Obj *resultObj = (Tcl_Obj *) lParam; Tcl_DString faceString; - Tcl_WinTCharToUtf(lfPtr->elfLogFont.lfFaceName, -1, &faceString); + Tcl_WinTCharToUtf((LPCTSTR)lfPtr->elfLogFont.lfFaceName, -1, &faceString); Tcl_ListObjAppendElement(NULL, resultObj, Tcl_NewStringObj( Tcl_DStringValue(&faceString), Tcl_DStringLength(&faceString))); Tcl_DStringFree(&faceString); @@ -1567,7 +1567,7 @@ InitFont( GetTextMetricsW(hdc, &tm); GetTextFaceW(hdc, LF_FACESIZE, buf); - Tcl_WinTCharToUtf(buf, -1, &faceString); + Tcl_WinTCharToUtf((LPCTSTR)buf, -1, &faceString); fontPtr->font.fid = (Font) fontPtr; fontPtr->hwnd = hwnd; @@ -1744,7 +1744,7 @@ AllocFontFamily( hFont = SelectObject(hdc, hFont); GetTextFaceW(hdc, LF_FACESIZE, buf); - Tcl_WinTCharToUtf(buf, -1, &faceString); + Tcl_WinTCharToUtf((LPCTSTR)buf, -1, &faceString); faceName = Tk_GetUid(Tcl_DStringValue(&faceString)); Tcl_DStringFree(&faceString); hFont = SelectObject(hdc, hFont); @@ -2047,7 +2047,7 @@ WinFontCanUseProc( fontPtr = canUsePtr->fontPtr; nameTriedPtr = canUsePtr->nameTriedPtr; - fallbackName = Tcl_WinTCharToUtf(lfPtr->elfLogFont.lfFaceName, -1, &faceString); + fallbackName = Tcl_WinTCharToUtf((LPCTSTR)lfPtr->elfLogFont.lfFaceName, -1, &faceString); if (SeenName(fallbackName, nameTriedPtr) == 0) { subFontPtr = CanUseFallback(hdc, fontPtr, fallbackName, ch, diff --git a/win/tkWinInit.c b/win/tkWinInit.c index 15614a0..a1ab098 100644 --- a/win/tkWinInit.c +++ b/win/tkWinInit.c @@ -196,7 +196,7 @@ TkWin32ErrorObj( *p = '\0'; } - Tcl_WinTCharToUtf(lpBuffer, -1, &ds); + Tcl_WinTCharToUtf((LPCTSTR)lpBuffer, -1, &ds); errPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); diff --git a/win/tkWinMenu.c b/win/tkWinMenu.c index 0d25ca9..ce9a482 100644 --- a/win/tkWinMenu.c +++ b/win/tkWinMenu.c @@ -1249,7 +1249,7 @@ TkWinHandleMenuEvent( if (hashEntryPtr != NULL) { int i, len, underline; Tcl_Obj *labelPtr; - WCHAR *wlabel; + LPCWSTR wlabel; int menuChar; Tcl_DString ds; @@ -1272,7 +1272,7 @@ TkWinHandleMenuEvent( const char *src = Tcl_GetStringFromObj(labelPtr, &len); Tcl_DStringFree(&ds); - wlabel = (WCHAR *) Tcl_WinUtfToTChar(src, len, &ds); + wlabel = (LPCWSTR) Tcl_WinUtfToTChar(src, len, &ds); if ((underline < len) && (menuChar == Tcl_UniCharToUpper(wlabel[underline]))) { *plResult = (2 << 16) | i; diff --git a/win/tkWinSend.c b/win/tkWinSend.c index fca8561..d8ef23b 100644 --- a/win/tkWinSend.c +++ b/win/tkWinSend.c @@ -254,7 +254,7 @@ TkGetInterpNames( if (*p) { Tcl_DString ds; - Tcl_WinTCharToUtf(p + 1, -1, &ds); + Tcl_WinTCharToUtf((LPCTSTR)(p + 1), -1, &ds); result = Tcl_ListObjAppendElement(interp, objList, Tcl_NewStringObj(Tcl_DStringValue(&ds), @@ -784,7 +784,7 @@ Send( ehr = VariantChangeType(&vResult, &vResult, 0, VT_BSTR); if (SUCCEEDED(ehr)) { - Tcl_WinTCharToUtf(vResult.bstrVal, (int) SysStringLen(vResult.bstrVal) * + Tcl_WinTCharToUtf((LPCTSTR)vResult.bstrVal, SysStringLen(vResult.bstrVal) * sizeof (WCHAR), &ds); Tcl_DStringResult(interp, &ds); } @@ -797,7 +797,7 @@ Send( if (hr == DISP_E_EXCEPTION && ei.bstrSource != NULL) { Tcl_Obj *opError, *opErrorCode, *opErrorInfo; - Tcl_WinTCharToUtf(ei.bstrSource, (int) SysStringLen(ei.bstrSource) * + Tcl_WinTCharToUtf((LPCTSTR)ei.bstrSource, SysStringLen(ei.bstrSource) * sizeof (WCHAR), &ds); opError = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); diff --git a/win/tkWinSendCom.c b/win/tkWinSendCom.c index 9e5b7a0..3f4f387 100644 --- a/win/tkWinSendCom.c +++ b/win/tkWinSendCom.c @@ -385,7 +385,7 @@ Async( if (SUCCEEDED(hr) && obj->interp) { Tcl_Obj *scriptPtr; - Tcl_WinTCharToUtf(vCmd.bstrVal, (int) SysStringLen(vCmd.bstrVal) * + Tcl_WinTCharToUtf((LPCTSTR)vCmd.bstrVal, SysStringLen(vCmd.bstrVal) * sizeof (WCHAR), &ds); scriptPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); @@ -440,8 +440,8 @@ Send( return hr; } - Tcl_WinTCharToUtf(v.bstrVal, (int) SysStringLen(v.bstrVal) * - sizeof (WCHAR), &ds); + Tcl_WinTCharToUtf((LPCTSTR)v.bstrVal, SysStringLen(v.bstrVal) * + sizeof(WCHAR), &ds); scriptPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); Tcl_Preserve(interp); diff --git a/win/tkWinTest.c b/win/tkWinTest.c index ddda29b..f5cb17c 100644 --- a/win/tkWinTest.c +++ b/win/tkWinTest.c @@ -177,7 +177,7 @@ AppendSystemError( } else { char *msgPtr; - Tcl_WinTCharToUtf(wMsgPtr, -1, &ds); + Tcl_WinTCharToUtf((LPCTSTR)wMsgPtr, -1, &ds); LocalFree(wMsgPtr); msgPtr = Tcl_DStringValue(&ds); @@ -416,7 +416,7 @@ TestwineventObjCmd( /* * testfindwindow title ?class? - * Find a Windows window using the FindWindow API call. This takes the window + * Find a Windows window using the FindWindowW API call. This takes the window * title and optionally the window class and if found returns the HWND and * raises an error if the window is not found. * eg: testfindwindow Console TkTopLevel @@ -446,9 +446,9 @@ TestfindwindowObjCmd( return TCL_ERROR; } - title = Tcl_WinUtfToTChar(Tcl_GetString(objv[1]), -1, &titleString); + title = (LPCWSTR)Tcl_WinUtfToTChar(Tcl_GetString(objv[1]), -1, &titleString); if (objc == 3) { - class = Tcl_WinUtfToTChar(Tcl_GetString(objv[2]), -1, &classString); + class = (LPCWSTR)Tcl_WinUtfToTChar(Tcl_GetString(objv[2]), -1, &classString); } if (title[0] == 0) title = NULL; @@ -475,7 +475,7 @@ TestfindwindowObjCmd( AppendSystemError(interp, GetLastError()); r = TCL_ERROR; } else { - Tcl_SetObjResult(interp, Tcl_NewLongObj(PTR2INT(hwnd))); + Tcl_SetObjResult(interp, Tcl_NewWideIntObj((Tcl_WideInt)(((size_t)hwnd) + 1) - 1)); } Tcl_DStringFree(&titleString); @@ -491,7 +491,7 @@ EnumChildrenProc( { Tcl_Obj *listObj = (Tcl_Obj *) lParam; - Tcl_ListObjAppendElement(NULL, listObj, Tcl_NewLongObj(PTR2INT(hwnd))); + Tcl_ListObjAppendElement(NULL, listObj, Tcl_NewWideIntObj((Tcl_WideInt)(((size_t)hwnd) + 1) - 1)); return TRUE; } @@ -524,7 +524,7 @@ TestgetwindowinfoObjCmd( return TCL_ERROR; } else { Tcl_DString ds; - Tcl_WinTCharToUtf(buf, -1, &ds); + Tcl_WinTCharToUtf((LPCTSTR)buf, -1, &ds); classObj = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); } @@ -532,16 +532,16 @@ TestgetwindowinfoObjCmd( dictObj = Tcl_NewDictObj(); Tcl_DictObjPut(interp, dictObj, Tcl_NewStringObj("class", 5), classObj); Tcl_DictObjPut(interp, dictObj, Tcl_NewStringObj("id", 2), - Tcl_NewLongObj(GetWindowLongA(INT2PTR(hwnd), GWL_ID))); + Tcl_NewWideIntObj(GetWindowLongPtrW(INT2PTR(hwnd), GWL_ID))); cch = GetWindowTextW(INT2PTR(hwnd), buf, cchBuf); - Tcl_WinTCharToUtf(buf, cch * sizeof (WCHAR), &ds); + Tcl_WinTCharToUtf((LPCTSTR)buf, cch * sizeof (WCHAR), &ds); textObj = Tcl_NewStringObj(Tcl_DStringValue(&ds), Tcl_DStringLength(&ds)); Tcl_DStringFree(&ds); Tcl_DictObjPut(interp, dictObj, Tcl_NewStringObj("text", 4), textObj); Tcl_DictObjPut(interp, dictObj, Tcl_NewStringObj("parent", 6), - Tcl_NewLongObj(PTR2INT(GetParent((INT2PTR(hwnd)))))); + Tcl_NewWideIntObj((Tcl_WideInt)(((size_t)GetParent((INT2PTR(hwnd)))) + 1) - 1)); childrenObj = Tcl_NewListObj(0, NULL); EnumChildWindows(INT2PTR(hwnd), EnumChildrenProc, (LPARAM)childrenObj); diff --git a/win/tkWinX.c b/win/tkWinX.c index c633e03..58fe754 100644 --- a/win/tkWinX.c +++ b/win/tkWinX.c @@ -1536,7 +1536,7 @@ UpdateInputLanguage( return; } - wsprintfA(codepage, "cp%d", charsetInfo.ciACP); + sprintf(codepage, "cp%d", charsetInfo.ciACP); if ((encoding = Tcl_GetEncoding(NULL, codepage)) == NULL) { /* diff --git a/win/ttkWinXPTheme.c b/win/ttkWinXPTheme.c index c877c09..1375bb6 100644 --- a/win/ttkWinXPTheme.c +++ b/win/ttkWinXPTheme.c @@ -1115,7 +1115,7 @@ Ttk_CreateVsapiElement( XPThemeData *themeData = clientData; ElementInfo *elementPtr = NULL; ClientData elementData; - WCHAR *className; + LPCWSTR className; int partId = 0; Ttk_StateTable *stateTable; Ttk_Padding pad = {0, 0, 0, 0}; @@ -1143,7 +1143,7 @@ Ttk_CreateVsapiElement( return TCL_ERROR; } name = Tcl_GetStringFromObj(objv[0], &length); - className = (WCHAR *) Tcl_WinUtfToTChar(name, length, &classBuf); + className = (LPCWSTR) Tcl_WinUtfToTChar(name, length, &classBuf); /* flags or padding */ if (objc > 3) { -- cgit v0.12