Import Tk 8.6.11
This commit is contained in:
237
win/tkWinMenu.c
237
win/tkWinMenu.c
@@ -233,13 +233,13 @@ GetNewID(
|
||||
TkMenuEntry *mePtr, /* The menu we are working with. */
|
||||
WORD *menuIDPtr) /* The resulting id. */
|
||||
{
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
WORD curID = tsdPtr->lastCommandID;
|
||||
|
||||
while (1) {
|
||||
Tcl_HashEntry *commandEntryPtr;
|
||||
int new;
|
||||
int isNew;
|
||||
|
||||
/*
|
||||
* Try the next ID number, taking care to wrap rather than stray
|
||||
@@ -255,8 +255,8 @@ GetNewID(
|
||||
}
|
||||
|
||||
commandEntryPtr = Tcl_CreateHashEntry(&tsdPtr->commandTable,
|
||||
INT2PTR(curID), &new);
|
||||
if (new) {
|
||||
INT2PTR(curID), &isNew);
|
||||
if (isNew) {
|
||||
Tcl_SetHashValue(commandEntryPtr, mePtr);
|
||||
*menuIDPtr = curID;
|
||||
tsdPtr->lastCommandID = curID;
|
||||
@@ -285,7 +285,7 @@ static void
|
||||
FreeID(
|
||||
WORD commandID)
|
||||
{
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
|
||||
/*
|
||||
@@ -328,7 +328,7 @@ TkpNewMenu(
|
||||
HMENU winMenuHdl;
|
||||
Tcl_HashEntry *hashEntryPtr;
|
||||
int newEntry;
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
|
||||
winMenuHdl = CreatePopupMenu();
|
||||
@@ -374,7 +374,7 @@ TkpDestroyMenu(
|
||||
{
|
||||
HMENU winMenuHdl = (HMENU) menuPtr->platformData;
|
||||
const char *searchName;
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
|
||||
if (menuPtr->menuFlags & MENU_RECONFIGURE_PENDING) {
|
||||
@@ -388,7 +388,7 @@ TkpDestroyMenu(
|
||||
if (menuPtr->menuFlags & MENU_SYSTEM_MENU) {
|
||||
TkMenuEntry *searchEntryPtr;
|
||||
Tcl_HashTable *tablePtr = TkGetMenuHashTable(menuPtr->interp);
|
||||
char *menuName = Tcl_GetHashKey(tablePtr,
|
||||
char *menuName = (char *)Tcl_GetHashKey(tablePtr,
|
||||
menuPtr->menuRefPtr->hashEntryPtr);
|
||||
|
||||
/*
|
||||
@@ -420,7 +420,7 @@ TkpDestroyMenu(
|
||||
|
||||
if (tsdPtr->menuHWND != NULL) {
|
||||
Tcl_HashEntry *hashEntryPtr =
|
||||
Tcl_FindHashEntry(&tsdPtr->winMenuTable, (char *) winMenuHdl);
|
||||
Tcl_FindHashEntry(&tsdPtr->winMenuTable, winMenuHdl);
|
||||
|
||||
if (hashEntryPtr != NULL) {
|
||||
Tcl_DeleteHashEntry(hashEntryPtr);
|
||||
@@ -492,16 +492,16 @@ GetEntryText(
|
||||
char *itemText;
|
||||
|
||||
if (mePtr->type == TEAROFF_ENTRY) {
|
||||
itemText = ckalloc(sizeof("(Tear-off)"));
|
||||
itemText = (char *)ckalloc(sizeof("(Tear-off)"));
|
||||
strcpy(itemText, "(Tear-off)");
|
||||
} else if (mePtr->imagePtr != NULL) {
|
||||
itemText = ckalloc(sizeof("(Image)"));
|
||||
itemText = (char *)ckalloc(sizeof("(Image)"));
|
||||
strcpy(itemText, "(Image)");
|
||||
} else if (mePtr->bitmapPtr != NULL) {
|
||||
itemText = ckalloc(sizeof("(Pixmap)"));
|
||||
itemText = (char *)ckalloc(sizeof("(Pixmap)"));
|
||||
strcpy(itemText, "(Pixmap)");
|
||||
} else if (mePtr->labelPtr == NULL || mePtr->labelLength == 0) {
|
||||
itemText = ckalloc(sizeof("( )"));
|
||||
itemText = (char *)ckalloc(sizeof("( )"));
|
||||
strcpy(itemText, "( )");
|
||||
} else {
|
||||
int i;
|
||||
@@ -511,6 +511,7 @@ GetEntryText(
|
||||
: Tcl_GetString(mePtr->accelPtr);
|
||||
const char *p, *next;
|
||||
Tcl_DString itemString;
|
||||
int ch;
|
||||
|
||||
/*
|
||||
* We have to construct the string with an ampersand preceeding the
|
||||
@@ -527,7 +528,7 @@ GetEntryText(
|
||||
if (*p == '&') {
|
||||
Tcl_DStringAppend(&itemString, "&", 1);
|
||||
}
|
||||
next = Tcl_UtfNext(p);
|
||||
next = p + TkUtfToUniChar(p, &ch);
|
||||
Tcl_DStringAppend(&itemString, p, (int) (next - p));
|
||||
}
|
||||
if (mePtr->accelLength > 0) {
|
||||
@@ -536,12 +537,12 @@ GetEntryText(
|
||||
if (*p == '&') {
|
||||
Tcl_DStringAppend(&itemString, "&", 1);
|
||||
}
|
||||
next = Tcl_UtfNext(p);
|
||||
next = p + TkUtfToUniChar(p, &ch);
|
||||
Tcl_DStringAppend(&itemString, p, (int) (next - p));
|
||||
}
|
||||
}
|
||||
|
||||
itemText = ckalloc(Tcl_DStringLength(&itemString) + 1);
|
||||
itemText = (char *)ckalloc(Tcl_DStringLength(&itemString) + 1);
|
||||
strcpy(itemText, Tcl_DStringValue(&itemString));
|
||||
Tcl_DStringFree(&itemString);
|
||||
}
|
||||
@@ -569,7 +570,7 @@ static void
|
||||
ReconfigureWindowsMenu(
|
||||
ClientData clientData) /* The menu we are rebuilding */
|
||||
{
|
||||
TkMenu *menuPtr = clientData;
|
||||
TkMenu *menuPtr = (TkMenu *)clientData;
|
||||
TkMenuEntry *mePtr;
|
||||
HMENU winMenuHdl = (HMENU) menuPtr->platformData;
|
||||
char *itemText = NULL;
|
||||
@@ -609,7 +610,8 @@ ReconfigureWindowsMenu(
|
||||
itemText = GetEntryText(menuPtr, mePtr);
|
||||
if ((menuPtr->menuType == MENUBAR)
|
||||
|| (menuPtr->menuFlags & MENU_SYSTEM_MENU)) {
|
||||
Tcl_WinUtfToTChar(itemText, -1, &translatedText);
|
||||
Tcl_DStringInit(&translatedText);
|
||||
Tcl_UtfToWCharDString(itemText, -1, &translatedText);
|
||||
lpNewItem = (LPCWSTR) Tcl_DStringValue(&translatedText);
|
||||
flags |= MF_STRING;
|
||||
} else {
|
||||
@@ -728,7 +730,7 @@ ReconfigureWindowsMenu(
|
||||
|
||||
if ((menuPtr->menuType == MENUBAR)
|
||||
&& (menuPtr->parentTopLevelPtr != NULL)) {
|
||||
HANDLE bar = TkWinGetWrapperWindow(menuPtr->parentTopLevelPtr);
|
||||
HWND bar = TkWinGetWrapperWindow(menuPtr->parentTopLevelPtr);
|
||||
|
||||
if (bar) {
|
||||
DrawMenuBar(bar);
|
||||
@@ -759,7 +761,7 @@ ReconfigureWindowsMenu(
|
||||
|
||||
int
|
||||
TkpPostMenu(
|
||||
Tcl_Interp *interp,
|
||||
Tcl_Interp *dummy,
|
||||
TkMenu *menuPtr,
|
||||
int x, int y, int index)
|
||||
{
|
||||
@@ -769,8 +771,9 @@ TkpPostMenu(
|
||||
POINT point;
|
||||
Tk_Window parentWindow = Tk_Parent(menuPtr->tkwin);
|
||||
int oldServiceMode = Tcl_GetServiceMode();
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
(void)dummy;
|
||||
|
||||
tsdPtr->inPostMenu++;
|
||||
CallPendingReconfigureImmediately(menuPtr);
|
||||
@@ -869,13 +872,14 @@ TkpPostMenu(
|
||||
|
||||
int
|
||||
TkpPostTearoffMenu(
|
||||
Tcl_Interp *interp, /* The interpreter of the menu */
|
||||
Tcl_Interp *dummy, /* The interpreter of the menu */
|
||||
TkMenu *menuPtr, /* The menu we are posting */
|
||||
int x, int y, int index) /* The root X,Y coordinates where we are
|
||||
* posting */
|
||||
{
|
||||
int vRootX, vRootY, vRootWidth, vRootHeight;
|
||||
int result;
|
||||
(void)dummy;
|
||||
|
||||
if (index >= menuPtr->numEntries) {
|
||||
index = menuPtr->numEntries - 1;
|
||||
@@ -1064,7 +1068,7 @@ TkWinEmbeddedMenuProc(
|
||||
{
|
||||
static int nIdles = 0;
|
||||
LRESULT lResult = 1;
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
|
||||
switch(message) {
|
||||
@@ -1140,15 +1144,16 @@ TkWinHandleMenuEvent(
|
||||
int returnResult = 0;
|
||||
TkMenu *menuPtr;
|
||||
TkMenuEntry *mePtr;
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
(void)phwnd;
|
||||
|
||||
switch (*pMessage) {
|
||||
case WM_UNINITMENUPOPUP:
|
||||
hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->winMenuTable,
|
||||
(char *) *pwParam);
|
||||
*pwParam);
|
||||
if (hashEntryPtr != NULL) {
|
||||
menuPtr = Tcl_GetHashValue(hashEntryPtr);
|
||||
menuPtr = (TkMenu *)Tcl_GetHashValue(hashEntryPtr);
|
||||
if ((menuPtr->menuRefPtr != NULL)
|
||||
&& (menuPtr->menuRefPtr->parentEntryPtr != NULL)) {
|
||||
TkPostSubmenu(menuPtr->interp,
|
||||
@@ -1160,10 +1165,10 @@ TkWinHandleMenuEvent(
|
||||
case WM_INITMENU:
|
||||
TkMenuInit();
|
||||
hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->winMenuTable,
|
||||
(char *) *pwParam);
|
||||
*pwParam);
|
||||
if (hashEntryPtr != NULL) {
|
||||
tsdPtr->oldServiceMode = Tcl_SetServiceMode(TCL_SERVICE_ALL);
|
||||
menuPtr = Tcl_GetHashValue(hashEntryPtr);
|
||||
menuPtr = (TkMenu *)Tcl_GetHashValue(hashEntryPtr);
|
||||
tsdPtr->modalMenuPtr = menuPtr;
|
||||
CallPendingReconfigureImmediately(menuPtr);
|
||||
RecursivelyClearActiveMenu(menuPtr);
|
||||
@@ -1199,7 +1204,7 @@ TkWinHandleMenuEvent(
|
||||
if (hashEntryPtr == NULL) {
|
||||
break;
|
||||
}
|
||||
mePtr = Tcl_GetHashValue(hashEntryPtr);
|
||||
mePtr = (TkMenuEntry *)Tcl_GetHashValue(hashEntryPtr);
|
||||
if (mePtr != NULL) {
|
||||
TkMenuReferences *menuRefPtr;
|
||||
TkMenuEntry *parentEntryPtr;
|
||||
@@ -1245,16 +1250,16 @@ TkWinHandleMenuEvent(
|
||||
|
||||
case WM_MENUCHAR: {
|
||||
hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->winMenuTable,
|
||||
(char *) *plParam);
|
||||
*plParam);
|
||||
if (hashEntryPtr != NULL) {
|
||||
int i, len, underline;
|
||||
Tcl_Obj *labelPtr;
|
||||
LPCWSTR wlabel;
|
||||
WCHAR *wlabel;
|
||||
int menuChar;
|
||||
Tcl_DString ds;
|
||||
|
||||
*plResult = 0;
|
||||
menuPtr = Tcl_GetHashValue(hashEntryPtr);
|
||||
menuPtr = (TkMenu *)Tcl_GetHashValue(hashEntryPtr);
|
||||
/*
|
||||
* Assume we have something directly convertable to Tcl_UniChar.
|
||||
* True at least for wide systems.
|
||||
@@ -1272,8 +1277,9 @@ TkWinHandleMenuEvent(
|
||||
const char *src = Tcl_GetStringFromObj(labelPtr, &len);
|
||||
|
||||
Tcl_DStringFree(&ds);
|
||||
wlabel = (LPCWSTR) Tcl_WinUtfToTChar(src, len, &ds);
|
||||
if ((underline < len) && (menuChar ==
|
||||
Tcl_DStringInit(&ds);
|
||||
wlabel = Tcl_UtfToWCharDString(src, len, &ds);
|
||||
if ((underline + 1 < len + 1) && (menuChar ==
|
||||
Tcl_UniCharToUpper(wlabel[underline]))) {
|
||||
*plResult = (2 << 16) | i;
|
||||
returnResult = 1;
|
||||
@@ -1325,7 +1331,7 @@ TkWinHandleMenuEvent(
|
||||
}
|
||||
mePtr = (TkMenuEntry *) itemPtr->itemData;
|
||||
menuPtr = mePtr->menuPtr;
|
||||
twdPtr = ckalloc(sizeof(TkWinDrawable));
|
||||
twdPtr = (TkWinDrawable *)ckalloc(sizeof(TkWinDrawable));
|
||||
twdPtr->type = TWD_WINDC;
|
||||
twdPtr->winDC.hdc = itemPtr->hDC;
|
||||
|
||||
@@ -1389,9 +1395,9 @@ TkWinHandleMenuEvent(
|
||||
menuPtr = NULL;
|
||||
if (*plParam != 0) {
|
||||
hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->winMenuTable,
|
||||
(char *) *plParam);
|
||||
*plParam);
|
||||
if (hashEntryPtr != NULL) {
|
||||
menuPtr = Tcl_GetHashValue(hashEntryPtr);
|
||||
menuPtr = (TkMenu *)Tcl_GetHashValue(hashEntryPtr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1416,7 +1422,7 @@ TkWinHandleMenuEvent(
|
||||
hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->commandTable,
|
||||
INT2PTR(entryIndex));
|
||||
if (hashEntryPtr != NULL) {
|
||||
mePtr = Tcl_GetHashValue(hashEntryPtr);
|
||||
mePtr = (TkMenuEntry *)Tcl_GetHashValue(hashEntryPtr);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1505,7 +1511,7 @@ TkpSetWindowMenuBar(
|
||||
TkMenu *menuPtr) /* The menu we are inserting */
|
||||
{
|
||||
HMENU winMenuHdl;
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
|
||||
if (menuPtr != NULL) {
|
||||
@@ -1514,7 +1520,7 @@ TkpSetWindowMenuBar(
|
||||
|
||||
winMenuHdl = (HMENU) menuPtr->platformData;
|
||||
hashEntryPtr = Tcl_FindHashEntry(&tsdPtr->winMenuTable,
|
||||
(char *) winMenuHdl);
|
||||
winMenuHdl);
|
||||
Tcl_DeleteHashEntry(hashEntryPtr);
|
||||
DestroyMenu(winMenuHdl);
|
||||
winMenuHdl = CreateMenu();
|
||||
@@ -1553,6 +1559,10 @@ TkpSetMainMenubar(
|
||||
const char *menuName) /* The name of the menu to put in front. If
|
||||
* NULL, use the default menu bar. */
|
||||
{
|
||||
(void)interp;
|
||||
(void)tkwin;
|
||||
(void)menuName;
|
||||
|
||||
/*
|
||||
* Nothing to do.
|
||||
*/
|
||||
@@ -1583,6 +1593,10 @@ GetMenuIndicatorGeometry(
|
||||
int *widthPtr, /* The resulting width */
|
||||
int *heightPtr) /* The resulting height */
|
||||
{
|
||||
(void)menuPtr;
|
||||
(void)tkfont;
|
||||
(void)fmPtr;
|
||||
|
||||
*heightPtr = indicatorDimensions[0];
|
||||
if (mePtr->hideMargin) {
|
||||
*widthPtr = 0;
|
||||
@@ -1631,7 +1645,13 @@ GetMenuAccelGeometry(
|
||||
{
|
||||
*heightPtr = fmPtr->linespace;
|
||||
if (mePtr->type == CASCADE_ENTRY) {
|
||||
*widthPtr = 0;
|
||||
/*
|
||||
* Cascade entries have no accelerator but do show an arrow. Set
|
||||
* this field width to the width of the OBM_MNARROW system bitmap
|
||||
* used to display the arrow. I couldn't find how to query the
|
||||
* system for this value, therefore I resort to hardcoding.
|
||||
*/
|
||||
*widthPtr = CASCADE_ARROW_WIDTH;
|
||||
} else if ((menuPtr->menuType != MENUBAR) && (mePtr->accelPtr != NULL)) {
|
||||
const char *accel = Tcl_GetString(mePtr->accelPtr);
|
||||
|
||||
@@ -1666,7 +1686,10 @@ GetTearoffEntryGeometry(
|
||||
int *widthPtr, /* The resulting width */
|
||||
int *heightPtr) /* The resulting height */
|
||||
{
|
||||
if (menuPtr->menuType != MASTER_MENU) {
|
||||
(void)mePtr;
|
||||
(void)tkfont;
|
||||
|
||||
if (menuPtr->menuType != MAIN_MENU) {
|
||||
*heightPtr = 0;
|
||||
} else {
|
||||
*heightPtr = fmPtr->linespace;
|
||||
@@ -1699,6 +1722,10 @@ GetMenuSeparatorGeometry(
|
||||
int *widthPtr, /* The resulting width */
|
||||
int *heightPtr) /* The resulting height */
|
||||
{
|
||||
(void)menuPtr;
|
||||
(void)mePtr;
|
||||
(void)tkfont;
|
||||
|
||||
*widthPtr = 0;
|
||||
*heightPtr = fmPtr->linespace - (2 * fmPtr->descent);
|
||||
}
|
||||
@@ -1812,6 +1839,11 @@ DrawMenuEntryIndicator(
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
(void)tkfont;
|
||||
(void)fmPtr;
|
||||
(void)width;
|
||||
(void)height;
|
||||
|
||||
if ((mePtr->type == CHECK_BUTTON_ENTRY)
|
||||
|| (mePtr->type == RADIO_BUTTON_ENTRY)) {
|
||||
if (mePtr->indicatorOn && (mePtr->entryFlags & ENTRY_SELECTED)) {
|
||||
@@ -1892,6 +1924,9 @@ DrawMenuEntryAccelerator(
|
||||
int baseline;
|
||||
int leftEdge = x + mePtr->indicatorSpace + mePtr->labelWidth;
|
||||
const char *accel;
|
||||
(void)activeBorder;
|
||||
(void)width;
|
||||
(void)height;
|
||||
|
||||
if (menuPtr->menuType == MENUBAR) {
|
||||
return;
|
||||
@@ -1909,7 +1944,7 @@ DrawMenuEntryAccelerator(
|
||||
* Draw disabled 3D text highlight only with the Win95/98 look.
|
||||
*/
|
||||
|
||||
if (TkWinGetPlatformTheme() == TK_THEME_WIN_CLASSIC) {
|
||||
if (TkWinGetPlatformTheme() != TK_THEME_WIN_XP) {
|
||||
if ((mePtr->state == ENTRY_DISABLED)
|
||||
&& (menuPtr->disabledFgPtr != NULL) && (accel != NULL)) {
|
||||
COLORREF oldFgColor = gc->foreground;
|
||||
@@ -1935,8 +1970,9 @@ DrawMenuEntryAccelerator(
|
||||
* DrawMenuEntryArrow --
|
||||
*
|
||||
* This function draws the arrow bitmap on the right side of a menu
|
||||
* entry. This function is only used when drawing the arrow for a
|
||||
* disabled cascade menu.
|
||||
* entry. This function is only used when drawing the arrow for:
|
||||
* - a disabled cascade item
|
||||
* - a cascade item in any state in a torn-off menu
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
@@ -1965,11 +2001,23 @@ DrawMenuEntryArrow(
|
||||
COLORREF oldFgColor;
|
||||
COLORREF oldBgColor;
|
||||
RECT rect;
|
||||
(void)gc;
|
||||
(void)activeBorder;
|
||||
|
||||
if (!drawArrow || (mePtr->type != CASCADE_ENTRY)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Don't draw the arrow if a submenu is not attached to this
|
||||
* cascade entry.
|
||||
*/
|
||||
|
||||
if ((mePtr->childMenuRefPtr == NULL)
|
||||
|| (mePtr->childMenuRefPtr->menuPtr == NULL)) {
|
||||
return;
|
||||
}
|
||||
|
||||
oldFgColor = gc->foreground;
|
||||
oldBgColor = gc->background;
|
||||
|
||||
@@ -2035,6 +2083,10 @@ DrawMenuSeparator(
|
||||
{
|
||||
XPoint points[2];
|
||||
Tk_3DBorder border;
|
||||
(void)mePtr;
|
||||
(void)gc;
|
||||
(void)tkfont;
|
||||
(void)fmPtr;
|
||||
|
||||
points[0].x = x;
|
||||
points[0].y = y + height / 2;
|
||||
@@ -2074,16 +2126,20 @@ DrawMenuUnderline(
|
||||
int width, /* Width of entry */
|
||||
int height) /* Height of entry */
|
||||
{
|
||||
(void)fmPtr;
|
||||
(void)width;
|
||||
|
||||
if ((mePtr->underline >= 0) && (mePtr->labelPtr != NULL)) {
|
||||
int len;
|
||||
|
||||
len = Tcl_GetCharLength(mePtr->labelPtr);
|
||||
if (mePtr->underline < len) {
|
||||
const char *label, *start, *end;
|
||||
int ch;
|
||||
|
||||
label = Tcl_GetString(mePtr->labelPtr);
|
||||
start = Tcl_UtfAtIndex(label, mePtr->underline);
|
||||
end = Tcl_UtfNext(start);
|
||||
start = TkUtfAtIndex(label, mePtr->underline);
|
||||
end = start + TkUtfToUniChar(start, &ch);
|
||||
Tk_UnderlineChars(menuPtr->display, d,
|
||||
gc, tkfont, label, x + mePtr->indicatorSpace,
|
||||
y + (height + fmPtr->ascent - fmPtr->descent) / 2,
|
||||
@@ -2113,7 +2169,7 @@ DrawMenuUnderline(
|
||||
|
||||
static int
|
||||
TkWinMenuKeyObjCmd(
|
||||
ClientData clientData, /* Unused. */
|
||||
ClientData dummy, /* Unused. */
|
||||
Tcl_Interp *interp, /* Current interpreter. */
|
||||
int objc, /* Number of arguments. */
|
||||
Tcl_Obj *const objv[]) /* Argument objects. */
|
||||
@@ -2125,6 +2181,7 @@ TkWinMenuKeyObjCmd(
|
||||
TkWindow *winPtr;
|
||||
KeySym keySym;
|
||||
int i;
|
||||
(void)dummy;
|
||||
|
||||
if (objc != 3) {
|
||||
Tcl_WrongNumArgs(interp, 1, objv, "window keySym");
|
||||
@@ -2174,17 +2231,16 @@ TkWinMenuKeyObjCmd(
|
||||
virtualKey = XKeysymToKeycode(winPtr->display, keySym);
|
||||
scanCode = MapVirtualKeyW(virtualKey, 0);
|
||||
if (0 != scanCode) {
|
||||
XKeyEvent xkey = eventPtr->xkey;
|
||||
TkKeyEvent xkey;
|
||||
memcpy(&xkey, eventPtr, sizeof(xkey));
|
||||
CallWindowProcW(DefWindowProcW, Tk_GetHWND(Tk_WindowId(tkwin)),
|
||||
WM_SYSKEYDOWN, virtualKey,
|
||||
(int) ((scanCode << 16) | (1 << 29)));
|
||||
if (xkey.nbytes > 0) {
|
||||
for (i = 0; i < xkey.nbytes; i++) {
|
||||
CallWindowProcW(DefWindowProcW,
|
||||
Tk_GetHWND(Tk_WindowId(tkwin)), WM_SYSCHAR,
|
||||
xkey.trans_chars[i],
|
||||
(int) ((scanCode << 16) | (1 << 29)));
|
||||
}
|
||||
for (i = 0; i < xkey.nbytes; i++) {
|
||||
CallWindowProcW(DefWindowProcW,
|
||||
Tk_GetHWND(Tk_WindowId(tkwin)), WM_SYSCHAR,
|
||||
xkey.trans_chars[i],
|
||||
(int) ((scanCode << 16) | (1 << 29)));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2257,8 +2313,7 @@ TkpInitializeMenuBindings(
|
||||
*/
|
||||
|
||||
(void) Tcl_CreateObjCommand(interp, "tk::WinMenuKey",
|
||||
TkWinMenuKeyObjCmd,
|
||||
(ClientData) Tk_MainWindow(interp), (Tcl_CmdDeleteProc *) NULL);
|
||||
TkWinMenuKeyObjCmd, Tk_MainWindow(interp), NULL);
|
||||
|
||||
(void) Tk_CreateBinding(interp, bindingTable, (ClientData) uid,
|
||||
"<Alt_L>", "tk::WinMenuKey %W %N", 0);
|
||||
@@ -2441,7 +2496,7 @@ DrawMenuEntryLabel(
|
||||
int baseline = y + (height + fmPtr->ascent - fmPtr->descent) / 2;
|
||||
const char *label = Tcl_GetString(mePtr->labelPtr);
|
||||
|
||||
if (TkWinGetPlatformTheme() == TK_THEME_WIN_CLASSIC) {
|
||||
if (TkWinGetPlatformTheme() != TK_THEME_WIN_XP) {
|
||||
/*
|
||||
* Win 95/98 systems draw disabled menu text with a 3D
|
||||
* highlight, unless the menu item is highlighted,
|
||||
@@ -2537,8 +2592,12 @@ DrawTearoffEntry(
|
||||
XPoint points[2];
|
||||
int segmentWidth, maxX;
|
||||
Tk_3DBorder border;
|
||||
(void)mePtr;
|
||||
(void)gc;
|
||||
(void)tkfont;
|
||||
(void)fmPtr;
|
||||
|
||||
if (menuPtr->menuType != MASTER_MENU) {
|
||||
if (menuPtr->menuType != MAIN_MENU) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2580,7 +2639,7 @@ DrawTearoffEntry(
|
||||
|
||||
int
|
||||
TkpConfigureMenuEntry(
|
||||
register TkMenuEntry *mePtr)/* Information about menu entry; may or may
|
||||
TkMenuEntry *mePtr)/* Information about menu entry; may or may
|
||||
* not already have values for some fields. */
|
||||
{
|
||||
ScheduleMenuReconfigure(mePtr->menuPtr);
|
||||
@@ -2644,7 +2703,7 @@ TkpDrawMenuEntry(
|
||||
menuDc = TkWinGetDrawableDC(menuPtr->display, menuDrawable, &dcState);
|
||||
|
||||
memDc = CreateCompatibleDC(menuDc);
|
||||
oldBitmap = SelectObject(memDc,
|
||||
oldBitmap = (HBITMAP)SelectObject(memDc,
|
||||
CreateCompatibleBitmap(menuDc, width, height) );
|
||||
|
||||
memWinDraw.type = TWD_WINDC;
|
||||
@@ -3101,27 +3160,28 @@ static void
|
||||
MenuSelectEvent(
|
||||
TkMenu *menuPtr) /* the menu we have selected. */
|
||||
{
|
||||
XVirtualEvent event;
|
||||
union {XEvent general; XVirtualEvent virt;} event;
|
||||
union {DWORD msgpos; POINTS point;} root;
|
||||
|
||||
event.type = VirtualEvent;
|
||||
event.serial = menuPtr->display->request;
|
||||
event.send_event = 0;
|
||||
event.display = menuPtr->display;
|
||||
memset(&event, 0, sizeof(event));
|
||||
event.virt.type = VirtualEvent;
|
||||
event.virt.serial = menuPtr->display->request;
|
||||
event.virt.send_event = 0;
|
||||
event.virt.display = menuPtr->display;
|
||||
Tk_MakeWindowExist(menuPtr->tkwin);
|
||||
event.event = Tk_WindowId(menuPtr->tkwin);
|
||||
event.root = XRootWindow(menuPtr->display, 0);
|
||||
event.subwindow = None;
|
||||
event.time = TkpGetMS();
|
||||
event.virt.event = Tk_WindowId(menuPtr->tkwin);
|
||||
event.virt.root = XRootWindow(menuPtr->display, 0);
|
||||
event.virt.subwindow = None;
|
||||
event.virt.time = TkpGetMS();
|
||||
|
||||
root.msgpos = GetMessagePos();
|
||||
event.x_root = root.point.x;
|
||||
event.y_root = root.point.y;
|
||||
event.state = TkWinGetModifierState();
|
||||
event.same_screen = 1;
|
||||
event.name = Tk_GetUid("MenuSelect");
|
||||
event.user_data = NULL;
|
||||
Tk_QueueWindowEvent((XEvent *) &event, TCL_QUEUE_TAIL);
|
||||
event.virt.x_root = root.point.x;
|
||||
event.virt.y_root = root.point.y;
|
||||
event.virt.state = TkWinGetModifierState();
|
||||
event.virt.same_screen = 1;
|
||||
event.virt.name = Tk_GetUid("MenuSelect");
|
||||
event.virt.user_data = NULL;
|
||||
Tk_QueueWindowEvent(&event.general, TCL_QUEUE_TAIL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3186,8 +3246,9 @@ HWND
|
||||
Tk_GetMenuHWND(
|
||||
Tk_Window tkwin)
|
||||
{
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
(void)tkwin;
|
||||
|
||||
TkMenuInit();
|
||||
return tsdPtr->embeddedMenuHWND;
|
||||
@@ -3211,8 +3272,10 @@ Tk_GetMenuHWND(
|
||||
|
||||
static void
|
||||
MenuExitHandler(
|
||||
ClientData clientData) /* Not used */
|
||||
ClientData dummy) /* Not used */
|
||||
{
|
||||
(void)dummy;
|
||||
|
||||
UnregisterClassW(MENU_CLASS_NAME, Tk_GetHINSTANCE());
|
||||
UnregisterClassW(EMBEDDED_MENU_CLASS_NAME, Tk_GetHINSTANCE());
|
||||
}
|
||||
@@ -3236,10 +3299,11 @@ MenuExitHandler(
|
||||
|
||||
static void
|
||||
MenuThreadExitHandler(
|
||||
ClientData clientData) /* Not used */
|
||||
ClientData dummy) /* Not used */
|
||||
{
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
(void)dummy;
|
||||
|
||||
DestroyWindow(tsdPtr->menuHWND);
|
||||
DestroyWindow(tsdPtr->embeddedMenuHWND);
|
||||
@@ -3276,6 +3340,8 @@ TkWinGetMenuSystemDefault(
|
||||
const char *className) /* The name of the option class. */
|
||||
{
|
||||
Tcl_Obj *valuePtr = NULL;
|
||||
(void)tkwin;
|
||||
(void)className;
|
||||
|
||||
if ((strcmp(dbName, "activeBorderWidth") == 0) ||
|
||||
(strcmp(dbName, "borderWidth") == 0)) {
|
||||
@@ -3324,7 +3390,6 @@ SetDefaults(
|
||||
int padding;
|
||||
#endif
|
||||
} nc;
|
||||
OSVERSIONINFOW os;
|
||||
|
||||
/*
|
||||
* Set all of the default options. The loop will terminate when we run out
|
||||
@@ -3344,9 +3409,7 @@ SetDefaults(
|
||||
|
||||
nc.metrics.cbSize = sizeof(nc);
|
||||
|
||||
os.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
||||
GetVersionExW(&os);
|
||||
if (os.dwMajorVersion < 6) {
|
||||
if (TkWinGetPlatformTheme() != TK_THEME_WIN_VISTA) {
|
||||
nc.metrics.cbSize -= sizeof(int);
|
||||
}
|
||||
|
||||
@@ -3479,7 +3542,7 @@ TkpMenuInit(void)
|
||||
void
|
||||
TkpMenuThreadInit(void)
|
||||
{
|
||||
ThreadSpecificData *tsdPtr =
|
||||
ThreadSpecificData *tsdPtr = (ThreadSpecificData *)
|
||||
Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData));
|
||||
|
||||
tsdPtr->menuHWND = CreateWindowW(MENU_CLASS_NAME, L"MenuWindow", WS_POPUP,
|
||||
|
||||
Reference in New Issue
Block a user