Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Changes In Branch tip-658 Excluding Merge-Ins
This is equivalent to a diff from 9c01fe70 to ff848406
2023-06-04
| ||
17:18 | Merge implementation of TIP #658 - Attach identifiers to Tk menu entries, following positive vote from the TCT. Thanks to the author, Schelte Bron! check-in: e2b00bfd user: fvogel tags: trunk, main | |
2023-05-29
| ||
12:59 | Fix first part of [0e658c9479]: Remove unused function declarations from tkMacOSXInt.h - TkpShiftButton() check-in: 35b1e576 user: fvogel tags: trunk, main | |
11:12 | merge trunk check-in: c0cfd57b user: fvogel tags: bug-f41f675cca | |
2023-05-28
| ||
10:21 | Continuation lines should be indented 8 chars. Closed-Leaf check-in: ff848406 user: fvogel tags: tip-658 | |
09:33 | merge trunk check-in: 2bf0d58a user: fvogel tags: tip-658 | |
2023-05-27
| ||
20:10 | Fix [2f92166f6f]: Crash setting -foreground to empty string in a ttk::theme. Closed-Leaf check-in: 0f4e2e8d user: fvogel tags: bug-2f92166f6f | |
19:52 | Add non-regression test for [6ee162c3d9]. check-in: 9c01fe70 user: fvogel tags: trunk, main | |
19:51 | Add non-regression test for [6ee162c3d9]. check-in: 123d3e3f user: fvogel tags: core-8-6-branch | |
2023-05-25
| ||
06:15 | Fix [7447ed20ec]: Color picker failure - tk::RestoreFocusGrab does not take into account the possibility of a failing grab. check-in: 14e607a7 user: fvogel tags: trunk, main | |
Changes to doc/menu.n.
︙ | ︙ | |||
352 353 354 355 356 357 358 | .TP 12 \fInumber\fR . Specifies the entry numerically, where 0 corresponds to the top-most entry of the menu, 1 to the entry below it, and so on. .TP 12 | | | > > > > > | | > > > | | | | 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 | .TP 12 \fInumber\fR . Specifies the entry numerically, where 0 corresponds to the top-most entry of the menu, 1 to the entry below it, and so on. .TP 12 \fIid\fR . If the index does not satisfy one of the above forms then the menu is searched for an entry with the specified id. .TP 12 \fIpattern\fR . If all of the above methods for finding an entry fail, this form is used. \fIPattern\fR is pattern-matched against the label of each entry in the menu, in order from the top down, until a matching entry is found. The rules of \fBstring match\fR are used. .PP If the index could match more than one of the above forms, then the form earlier in the above list takes precedence. .PP The following widget commands are possible for menu widgets: .TP \fIpathName \fBactivate \fIindex\fR . Change the state of the entry indicated by \fIindex\fR to \fBactive\fR and redisplay it using its active colors. Any previously-active entry is deactivated. If \fIindex\fR is specified as \fB{}\fR or \fBnone\fR, or if the specified entry is disabled, then the menu ends up with no active entry. Returns an empty string. .TP \fIpathName \fBadd \fItype \fR?\fIid\fR? ?\fIoption value option value ...\fR? . Add a new entry to the bottom of the menu. The new entry's type is given by \fItype\fR and must be one of \fBcascade\fR, \fBcheckbutton\fR, \fBcommand\fR, \fBradiobutton\fR, or \fBseparator\fR, or a unique abbreviation of one of the above. If the \fIid\fR argument is specified, it is used as the entry identifier; \fIid\fR must not already exist in the menu. Otherwise, a new unique identifier is generated. If additional arguments are present, they specify the options listed in the \fBMENU ENTRY OPTIONS\fR section below. The \fBadd\fR widget command returns the id of the new entry. .TP \fIpathName \fBcget \fIoption\fR . Returns the current value of the configuration option given by \fIoption\fR. \fIOption\fR may have any of the values accepted by the \fBmenu\fR command. |
︙ | ︙ | |||
442 443 444 445 446 447 448 449 450 451 452 453 454 | \fIOptions\fR may have any of the values described in the \fBMENU ENTRY OPTIONS\fR section below. If \fIoptions\fR are specified, options are modified as indicated in the command and the command returns an empty string. If no \fIoptions\fR are specified, returns a list describing the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). .TP \fIpathName \fBindex \fIindex\fR . Returns the numerical index corresponding to \fIindex\fR, or \fB{}\fR if \fIindex\fR was specified as \fB{}\fR or \fBnone\fR. .TP | > > > > > > > > | | | | > | 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 | \fIOptions\fR may have any of the values described in the \fBMENU ENTRY OPTIONS\fR section below. If \fIoptions\fR are specified, options are modified as indicated in the command and the command returns an empty string. If no \fIoptions\fR are specified, returns a list describing the current options for entry \fIindex\fR (see \fBTk_ConfigureInfo\fR for information on the format of this list). .TP \fIpathName \fBid \fIindex\fR . Returns the id of the menu entry given by \fIindex\fR. This is the identifier that was assigned to the entry when it was created using the \fBadd\fR or \fBinsert\fR widget command. Returns an empty string for the tear-off entry, or if \fIindex\fR is equivalent to \fB{}\fR. .TP \fIpathName \fBindex \fIindex\fR . Returns the numerical index corresponding to \fIindex\fR, or \fB{}\fR if \fIindex\fR was specified as \fB{}\fR or \fBnone\fR. .TP \fIpathName \fBinsert \fIindex type \fR?\fIid\fR? ?\fIoption value option value ...\fR? . Same as the \fBadd\fR widget command except that it inserts the new entry just before the entry given by \fIindex\fR, instead of appending to the end of the menu. The \fItype\fR, \fIid\fR, \fIoption\fR, and \fIvalue\fR arguments have the same interpretation as for the \fBadd\fR widget command. It is not possible to insert new menu entries before the tear-off entry, if the menu has one. The \fBinsert\fR widget command returns the id of the new entry. .TP \fIpathName \fBinvoke \fIindex\fR . Invoke the action of the menu entry. See the sections on the individual entries above for details on what happens. If the menu entry is disabled then nothing happens. If the entry has a command associated with it then the result of that |
︙ | ︙ |
Changes to generic/tkMenu.c.
︙ | ︙ | |||
302 303 304 305 306 307 308 | /* * Command line options. Put here because MenuCmd has to look at them along * with MenuWidgetObjCmd. */ static const char *const menuOptions[] = { "activate", "add", "cget", "clone", "configure", "delete", "entrycget", | | | | 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 | /* * Command line options. Put here because MenuCmd has to look at them along * with MenuWidgetObjCmd. */ static const char *const menuOptions[] = { "activate", "add", "cget", "clone", "configure", "delete", "entrycget", "entryconfigure", "id", "index", "insert", "invoke", "post", "postcascade", "type", "unpost", "xposition", "yposition", NULL }; enum options { MENU_ACTIVATE, MENU_ADD, MENU_CGET, MENU_CLONE, MENU_CONFIGURE, MENU_DELETE, MENU_ENTRYCGET, MENU_ENTRYCONFIGURE, MENU_ID, MENU_INDEX, MENU_INSERT, MENU_INVOKE, MENU_POST, MENU_POSTCASCADE, MENU_TYPE, MENU_UNPOST, MENU_XPOSITION, MENU_YPOSITION }; /* * Prototypes for static functions in this file: */ |
︙ | ︙ | |||
447 448 449 450 451 452 453 454 455 456 457 458 459 460 | menuPtr->widgetCmd = Tcl_CreateObjCommand(interp, Tk_PathName(menuPtr->tkwin), MenuWidgetObjCmd, menuPtr, MenuCmdDeletedProc); menuPtr->active = TCL_INDEX_NONE; menuPtr->cursorPtr = NULL; menuPtr->mainMenuPtr = menuPtr; menuPtr->menuType = UNKNOWN_TYPE; TkMenuInitializeDrawingFields(menuPtr); Tk_SetClass(menuPtr->tkwin, "Menu"); Tk_SetClassProcs(menuPtr->tkwin, &menuClass, menuPtr); Tk_CreateEventHandler(newWin, ExposureMask|StructureNotifyMask|ActivateMask, TkMenuEventProc, menuPtr); | > > | 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 | menuPtr->widgetCmd = Tcl_CreateObjCommand(interp, Tk_PathName(menuPtr->tkwin), MenuWidgetObjCmd, menuPtr, MenuCmdDeletedProc); menuPtr->active = TCL_INDEX_NONE; menuPtr->cursorPtr = NULL; menuPtr->mainMenuPtr = menuPtr; menuPtr->menuType = UNKNOWN_TYPE; Tcl_InitHashTable(&menuPtr->items, TCL_STRING_KEYS); menuPtr->serial = 0; TkMenuInitializeDrawingFields(menuPtr); Tk_SetClass(menuPtr->tkwin, "Menu"); Tk_SetClassProcs(menuPtr->tkwin, &menuClass, menuPtr); Tk_CreateEventHandler(newWin, ExposureMask|StructureNotifyMask|ActivateMask, TkMenuEventProc, menuPtr); |
︙ | ︙ | |||
816 817 818 819 820 821 822 823 824 825 826 827 828 829 | } } else { result = ConfigureMenuCloneEntries(menuPtr, index, objc-3, objv+3); } Tcl_Release(mePtr); break; } case MENU_INDEX: { Tcl_Size index; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "string"); goto error; | > > > > > > > > > > > > > > > > > > > > > > | 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 | } } else { result = ConfigureMenuCloneEntries(menuPtr, index, objc-3, objv+3); } Tcl_Release(mePtr); break; } case MENU_ID: { Tcl_Size index; const char *idStr; Tcl_HashEntry *entryPtr; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "index"); goto error; } if (GetMenuIndex(interp, menuPtr, objv[2], 0, &index) != TCL_OK) { goto error; } if (index == TCL_INDEX_NONE) { goto done; } entryPtr = menuPtr->entries[index]->entryPtr; if (entryPtr) { idStr = Tcl_GetHashKey(&menuPtr->items, entryPtr); Tcl_SetObjResult(interp, Tcl_NewStringObj(idStr, TCL_INDEX_NONE)); } break; } case MENU_INDEX: { Tcl_Size index; if (objc != 3) { Tcl_WrongNumArgs(interp, 2, objv, "string"); goto error; |
︙ | ︙ | |||
1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 | DestroyMenuEntry(menuPtr->entries[i]); menuPtr->numEntries = i; } if (menuPtr->entries != NULL) { ckfree(menuPtr->entries); menuPtr->entries = NULL; } TkMenuFreeDrawOptions(menuPtr); Tk_FreeConfigOptions((char *) menuPtr, tsdPtr->menuOptionTable, menuPtr->tkwin); if (menuPtr->tkwin != NULL) { Tk_Window tkwin = menuPtr->tkwin; menuPtr->tkwin = NULL; | > | 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 | DestroyMenuEntry(menuPtr->entries[i]); menuPtr->numEntries = i; } if (menuPtr->entries != NULL) { ckfree(menuPtr->entries); menuPtr->entries = NULL; } Tcl_DeleteHashTable(&menuPtr->items); TkMenuFreeDrawOptions(menuPtr); Tk_FreeConfigOptions((char *) menuPtr, tsdPtr->menuOptionTable, menuPtr->tkwin); if (menuPtr->tkwin != NULL) { Tk_Window tkwin = menuPtr->tkwin; menuPtr->tkwin = NULL; |
︙ | ︙ | |||
1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 | && (mePtr->namePtr != NULL)) { const char *varName = Tcl_GetString(mePtr->namePtr); Tcl_UntraceVar2(menuPtr->interp, varName, NULL, TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS, MenuVarProc, mePtr); } TkpDestroyMenuEntry(mePtr); TkMenuEntryFreeDrawOptions(mePtr); Tk_FreeConfigOptions((char *) mePtr, mePtr->optionTable, menuPtr->tkwin); ckfree(mePtr); } /* | > > > > | 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 | && (mePtr->namePtr != NULL)) { const char *varName = Tcl_GetString(mePtr->namePtr); Tcl_UntraceVar2(menuPtr->interp, varName, NULL, TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS, MenuVarProc, mePtr); } if (mePtr->entryPtr) { Tcl_DeleteHashEntry(mePtr->entryPtr); mePtr->entryPtr = NULL; } TkpDestroyMenuEntry(mePtr); TkMenuEntryFreeDrawOptions(mePtr); Tk_FreeConfigOptions((char *) mePtr, mePtr->optionTable, menuPtr->tkwin); ckfree(mePtr); } /* |
︙ | ︙ | |||
2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 | * manual entry for valid .*/ int lastOK, /* Non-zero means its OK to return index just * *after* last entry. */ Tcl_Size *indexPtr) /* Where to store converted index. */ { int i; const char *string; if (TkGetIntForIndex(objPtr, menuPtr->numEntries - 1, lastOK, indexPtr) == TCL_OK) { /* TCL_INDEX_NONE is only accepted if it does not result from a negative number */ if (*indexPtr != TCL_INDEX_NONE || Tcl_GetString(objPtr)[0] != '-') { if (*indexPtr >= menuPtr->numEntries) { *indexPtr = menuPtr->numEntries - ((lastOK) ? 0 : 1); } | > | 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 | * manual entry for valid .*/ int lastOK, /* Non-zero means its OK to return index just * *after* last entry. */ Tcl_Size *indexPtr) /* Where to store converted index. */ { int i; const char *string; Tcl_HashEntry *entryPtr; if (TkGetIntForIndex(objPtr, menuPtr->numEntries - 1, lastOK, indexPtr) == TCL_OK) { /* TCL_INDEX_NONE is only accepted if it does not result from a negative number */ if (*indexPtr != TCL_INDEX_NONE || Tcl_GetString(objPtr)[0] != '-') { if (*indexPtr >= menuPtr->numEntries) { *indexPtr = menuPtr->numEntries - ((lastOK) ? 0 : 1); } |
︙ | ︙ | |||
2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 | if (string[0] == '@') { if (GetIndexFromCoords(NULL, menuPtr, string, indexPtr) == TCL_OK) { goto success; } } for (i = 0; i < (int)menuPtr->numEntries; i++) { Tcl_Obj *labelPtr = menuPtr->entries[i]->labelPtr; const char *label = (labelPtr == NULL) ? NULL : Tcl_GetString(labelPtr); if ((label != NULL) && (Tcl_StringCaseMatch(label, string, 0))) { *indexPtr = i; | > > > > > > > | 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 | if (string[0] == '@') { if (GetIndexFromCoords(NULL, menuPtr, string, indexPtr) == TCL_OK) { goto success; } } entryPtr = Tcl_FindHashEntry(&menuPtr->items, string); if (entryPtr) { TkMenuEntry *mePtr = Tcl_GetHashValue(entryPtr); *indexPtr = mePtr->index; return TCL_OK; } for (i = 0; i < (int)menuPtr->numEntries; i++) { Tcl_Obj *labelPtr = menuPtr->entries[i]->labelPtr; const char *label = (labelPtr == NULL) ? NULL : Tcl_GetString(labelPtr); if ((label != NULL) && (Tcl_StringCaseMatch(label, string, 0))) { *indexPtr = i; |
︙ | ︙ | |||
2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 | mePtr->index = index; mePtr->nextCascadePtr = NULL; if (Tk_InitOptions(menuPtr->interp, mePtr, mePtr->optionTable, menuPtr->tkwin) != TCL_OK) { ckfree(mePtr); return NULL; } TkMenuInitializeEntryDrawingFields(mePtr); if (TkpMenuNewEntry(mePtr) != TCL_OK) { Tk_FreeConfigOptions((char *) mePtr, mePtr->optionTable, menuPtr->tkwin); ckfree(mePtr); return NULL; } | > | 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 | mePtr->index = index; mePtr->nextCascadePtr = NULL; if (Tk_InitOptions(menuPtr->interp, mePtr, mePtr->optionTable, menuPtr->tkwin) != TCL_OK) { ckfree(mePtr); return NULL; } mePtr->entryPtr = NULL; TkMenuInitializeEntryDrawingFields(mePtr); if (TkpMenuNewEntry(mePtr) != TCL_OK) { Tk_FreeConfigOptions((char *) mePtr, mePtr->optionTable, menuPtr->tkwin); ckfree(mePtr); return NULL; } |
︙ | ︙ | |||
2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 | Tcl_Obj *const objv[]) /* Arguments to command: first arg is type of * entry, others are config options. */ { int type; Tcl_Size index; TkMenuEntry *mePtr; TkMenu *menuListPtr; if (indexPtr != NULL) { if (GetMenuIndex(interp, menuPtr, indexPtr, 1, &index) != TCL_OK) { return TCL_ERROR; } } else { index = menuPtr->numEntries; | > > > > | 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 | Tcl_Obj *const objv[]) /* Arguments to command: first arg is type of * entry, others are config options. */ { int type; Tcl_Size index; TkMenuEntry *mePtr; TkMenu *menuListPtr; Tcl_HashEntry *entryPtr; Tcl_Obj *idPtr = NULL; int isNew; int offs; if (indexPtr != NULL) { if (GetMenuIndex(interp, menuPtr, indexPtr, 1, &index) != TCL_OK) { return TCL_ERROR; } } else { index = menuPtr->numEntries; |
︙ | ︙ | |||
2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 | * Figure out the type of the new entry. */ if (Tcl_GetIndexFromObjStruct(interp, objv[0], menuEntryTypeStrings, sizeof(char *), "menu entry type", 0, &type) != TCL_OK) { return TCL_ERROR; } /* * Now we have to add an entry for every instance related to this menu. */ | > > > > > > > > > > > > > > > > < | | 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 | * Figure out the type of the new entry. */ if (Tcl_GetIndexFromObjStruct(interp, objv[0], menuEntryTypeStrings, sizeof(char *), "menu entry type", 0, &type) != TCL_OK) { return TCL_ERROR; } offs = 1; /* * Check for a user supplied id */ if (objc % 2 == 0) { idPtr = objv[offs]; if (Tcl_FindHashEntry(&menuPtr->items, Tcl_GetString(idPtr))) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "entry \"%s\" already exists", Tcl_GetString(idPtr))); Tcl_SetErrorCode(interp, "TK", "MENU", "ENTRY_EXISTS", NULL); return TCL_ERROR; } offs++; } /* * Now we have to add an entry for every instance related to this menu. */ for (menuListPtr = menuPtr->mainMenuPtr; menuListPtr != NULL; menuListPtr = menuListPtr->nextInstancePtr) { mePtr = MenuNewEntry(menuListPtr, index, type); if (mePtr == NULL) { return TCL_ERROR; } if (ConfigureMenuEntry(mePtr, objc - offs, objv + offs) != TCL_OK) { TkMenu *errorMenuPtr; Tcl_Size i; for (errorMenuPtr = menuPtr->mainMenuPtr; errorMenuPtr != NULL; errorMenuPtr = errorMenuPtr->nextInstancePtr) { Tcl_EventuallyFree(errorMenuPtr->entries[index], |
︙ | ︙ | |||
2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 | if (errorMenuPtr == menuListPtr) { break; } } return TCL_ERROR; } /* * If a menu has cascades, then every instance of the menu has to have * its own parallel cascade structure. So adding an entry to a menu * with clones means that the menu that the entry points to has to be * cloned for every clone the main menu has. This is special case #2 * in the comment at the top of this file. */ | > > > > > > > > > > > > > > > > > | 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 | if (errorMenuPtr == menuListPtr) { break; } } return TCL_ERROR; } if (idPtr == NULL) { char idbuf[16]; /* Generate an id for the new entry on the main menu */ do { snprintf(idbuf, sizeof(idbuf), "e%03X", ++menuPtr->serial); entryPtr = Tcl_CreateHashEntry( &menuListPtr->items, idbuf, &isNew); } while (!isNew); idPtr = Tcl_NewStringObj(idbuf, TCL_INDEX_NONE); } else { /* Reuse the specified or previously generated id on all clones */ entryPtr = Tcl_CreateHashEntry( &menuListPtr->items, Tcl_GetString(idPtr), &isNew); } Tcl_SetHashValue(entryPtr, mePtr); mePtr->entryPtr = entryPtr; /* * If a menu has cascades, then every instance of the menu has to have * its own parallel cascade structure. So adding an entry to a menu * with clones means that the menu that the entry points to has to be * cloned for every clone the main menu has. This is special case #2 * in the comment at the top of this file. */ |
︙ | ︙ | |||
2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 | Tcl_DecrRefCount(newCascadePtr); Tcl_DecrRefCount(menuNamePtr); Tcl_DecrRefCount(windowNamePtr); Tcl_DecrRefCount(normalPtr); } } } return TCL_OK; } /* *-------------------------------------------------------------- * * MenuVarProc -- | > > | 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 | Tcl_DecrRefCount(newCascadePtr); Tcl_DecrRefCount(menuNamePtr); Tcl_DecrRefCount(windowNamePtr); Tcl_DecrRefCount(normalPtr); } } } Tcl_SetObjResult(interp, idPtr); return TCL_OK; } /* *-------------------------------------------------------------- * * MenuVarProc -- |
︙ | ︙ |
Changes to generic/tkMenu.h.
︙ | ︙ | |||
179 180 181 182 183 184 185 186 187 188 189 190 191 192 | */ int entryFlags; /* Various flags. See below for * definitions. */ int index; /* Need to know which index we are. This is * zero-based. This is the top-left entry of * the menu. */ /* * Bookeeping for main menus and cascade menus. */ struct TkMenuReferences *childMenuRefPtr; /* A pointer to the hash table entry for the | > | 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | */ int entryFlags; /* Various flags. See below for * definitions. */ int index; /* Need to know which index we are. This is * zero-based. This is the top-left entry of * the menu. */ Tcl_HashEntry *entryPtr; /* Back-pointer to hash table entry */ /* * Bookeeping for main menus and cascade menus. */ struct TkMenuReferences *childMenuRefPtr; /* A pointer to the hash table entry for the |
︙ | ︙ | |||
375 376 377 378 379 380 381 382 383 384 385 386 387 388 | Tk_OptionSpec *extensionPtr;/* Needed by the configuration package for * this widget to be extended. */ Tk_SavedOptions *errorStructPtr; /* We actually have to allocate these because * multiple menus get changed during one * ConfigureMenu call. */ Tcl_Obj *activeReliefPtr; /* 3-d effect for active element. */ } TkMenu; /* * When the toplevel configure -menu command is executed, the menu may not * exist yet. We need to keep a linked list of windows that reference a * particular menu. */ | > > | 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 | Tk_OptionSpec *extensionPtr;/* Needed by the configuration package for * this widget to be extended. */ Tk_SavedOptions *errorStructPtr; /* We actually have to allocate these because * multiple menus get changed during one * ConfigureMenu call. */ Tcl_Obj *activeReliefPtr; /* 3-d effect for active element. */ Tcl_HashTable items; /* Map: id -> entry */ int serial; /* Next item # for autogenerated ids */ } TkMenu; /* * When the toplevel configure -menu command is executed, the menu may not * exist yet. We need to keep a linked list of windows that reference a * particular menu. */ |
︙ | ︙ |
Changes to library/tearoff.tcl.
︙ | ︙ | |||
136 137 138 139 140 141 142 | eval $cmd # Copy the meny entries, if any set last [$src index last] if {$last >= 0} { for {set i [$src cget -tearoff]} {$i <= $last} {incr i} { | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | eval $cmd # Copy the meny entries, if any set last [$src index last] if {$last >= 0} { for {set i [$src cget -tearoff]} {$i <= $last} {incr i} { set cmd [list $dst add [$src type $i] [$src id $i]] foreach option [$src entryconfigure $i] { lappend cmd [lindex $option 0] [lindex $option 4] } eval $cmd } } |
︙ | ︙ |
Changes to tests/menu.test.
︙ | ︙ | |||
1306 1307 1308 1309 1310 1311 1312 | test menu-3.10 {MenuWidgetCmd procedure, "add" option} -setup { destroy .m1 } -body { menu .m1 .m1 add separator } -cleanup { destroy .m1 | | | 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 | test menu-3.10 {MenuWidgetCmd procedure, "add" option} -setup { destroy .m1 } -body { menu .m1 .m1 add separator } -cleanup { destroy .m1 } -result {e001} test menu-3.11 {MenuWidgetCmd procedure, "cget" option} -setup { destroy .m1 } -body { menu .m1 .m1 cget } -returnCodes error -result {wrong # args: should be ".m1 cget option"} test menu-3.12 {MenuWidgetCmd procedure, "cget" option} -setup { |
︙ | ︙ | |||
1815 1816 1817 1818 1819 1820 1821 | test menu-3.67 {MenuWidgetCmd procedure, bad option} -setup { destroy .m1 } -body { menu .m1 .m1 foo } -cleanup { destroy .m1 | | | 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 | test menu-3.67 {MenuWidgetCmd procedure, bad option} -setup { destroy .m1 } -body { menu .m1 .m1 foo } -cleanup { destroy .m1 } -returnCodes error -result {bad option "foo": must be activate, add, cget, clone, configure, delete, entrycget, entryconfigure, id, index, insert, invoke, post, postcascade, type, unpost, xposition, or yposition} test menu-3.68 {MenuWidgetCmd procedure, fix for bug#508988} -setup { deleteWindows } -body { set t .t set m1 .t.m1 set c1 .t.c1 set c2 .t.c2 |
︙ | ︙ | |||
2643 2644 2645 2646 2647 2648 2649 | test menu-11.15 {ConfigureMenuEntry} -setup { deleteWindows } -body { menu .m1 list [.m1 add checkbutton -label "test"] [.m1 entrycget 1 -variable] } -cleanup { deleteWindows | | | | 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 | test menu-11.15 {ConfigureMenuEntry} -setup { deleteWindows } -body { menu .m1 list [.m1 add checkbutton -label "test"] [.m1 entrycget 1 -variable] } -cleanup { deleteWindows } -result {e001 test} test menu-11.16 {ConfigureMenuEntry} -setup { deleteWindows } -body { menu .m1 .m1 add radiobutton -label "test" } -cleanup { deleteWindows } -result {e001} test menu-11.17 {ConfigureMenuEntry} -setup { deleteWindows } -body { menu .m1 .m1 add checkbutton list [.m1 entryconfigure 1 -onvalue "test"] [.m1 entrycget 1 -onvalue] } -cleanup { |
︙ | ︙ | |||
2814 2815 2816 2817 2818 2819 2820 | deleteWindows } -body { menu .m1 .m1 add command -label "test" list [.m1 insert last command -label "test2"] [.m1 entrycget last -label] } -cleanup { deleteWindows | | | | 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 | deleteWindows } -body { menu .m1 .m1 add command -label "test" list [.m1 insert last command -label "test2"] [.m1 entrycget last -label] } -cleanup { deleteWindows } -result {e002 test2} test menu-13.5 {TkGetMenuIndex} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" list [.m1 insert end command -label "test2"] [.m1 entrycget end -label] } -cleanup { deleteWindows } -result {e002 test2} test menu-13.6 {TkGetMenuIndex} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "active" .m1 add command -label "test2" .m1 add command -label "test3" |
︙ | ︙ | |||
2920 2921 2922 2923 2924 2925 2926 | test menu-15.1 {MenuNewEntry} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" } -cleanup { deleteWindows | | | | | | | 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 | test menu-15.1 {MenuNewEntry} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" } -cleanup { deleteWindows } -result {e001} test menu-15.2 {MenuNewEntry} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" .m1 add command -label "test3" .m1 insert 2 command -label "test2" } -cleanup { deleteWindows } -result {e003} test menu-15.3 {MenuNewEntry} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" .m1 add command -label "test2" } -cleanup { deleteWindows } -result {e002} test menu-15.4 {MenuNewEntry} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" } -cleanup { deleteWindows } -result {e001} test menu-16.1 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 insert foo command -label "test" } -returnCodes error -result {bad menu entry index "foo"} test menu-16.2 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "test" .m1 insert test command -label "foo" } -cleanup { deleteWindows } -result {e002} test menu-16.3 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 insert -1 command -label "test" } -returnCodes error -result {bad menu entry index "-1"} test menu-16.4 {MenuAddOrInsert} -setup { |
︙ | ︙ | |||
2987 2988 2989 2990 2991 2992 2993 | test menu-16.5 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add cascade } -cleanup { deleteWindows | | | | | | | | | | | | | | | 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 | test menu-16.5 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add cascade } -cleanup { deleteWindows } -result {e001} test menu-16.6 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add checkbutton } -cleanup { deleteWindows } -result {e001} test menu-16.7 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add command } -cleanup { deleteWindows } -result {e001} test menu-16.8 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add radiobutton } -cleanup { deleteWindows } -result {e001} test menu-16.9 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add separator } -cleanup { deleteWindows } -result {e001} test menu-16.10 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add blork } -returnCodes error -result {bad menu entry type "blork": must be cascade, checkbutton, command, radiobutton, or separator} test menu-16.11 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add command } -cleanup { deleteWindows } -result {e001} test menu-16.12 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 clone .m2 .m2 clone .m3 list [.m2 add command -label "test"] [.m1 entrycget 1 -label] [.m3 entrycget 1 -label] } -cleanup { deleteWindows } -result {e001 test test} test menu-16.13 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 clone .m2 .m2 clone .m3 list [.m3 add command -label "test"] [.m1 entrycget 1 -label] [.m2 entrycget 1 -label] } -cleanup { deleteWindows } -result {e001 test test} test menu-16.14 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add command -blork fish } -returnCodes error -result {unknown option "-blork"} test menu-16.15 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "File" menu .container . configure -menu .container list [.container add cascade -label "File" -menu .m1] [. configure -menu ""] } -cleanup { deleteWindows } -result {e001 {}} test menu-16.16 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 menu .m2 set tearoff [tk::TearOffMenu .m2] list [.m2 add cascade -menu .m1] [$tearoff unpost] } -cleanup { deleteWindows } -result {e001 {}} test menu-16.17 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 menu .container . configure -menu .container set tearoff [tk::TearOffMenu .container] list [.container add cascade -label "File" -menu .m1] [. configure -menu ""] } -cleanup { deleteWindows } -result {e001 {}} test menu-16.18 {MenuAddOrInsert} -setup { deleteWindows } -body { menu .m1 menu .container .container add cascade -menu .m1 . configure -menu .container list [.container add cascade -label "File" -menu .m1] [. configure -menu ""] } -cleanup { deleteWindows } -result {e002 {}} test menu-16.19 {MenuAddOrInsert - Insert a cascade deep into the tree} -setup { deleteWindows } -body { menu .menubar menu .menubar.test -tearoff 0 .menubar add cascade -label Test -underline 0 -menu .menubar.test menu .menubar.test.cascade -tearoff 0 |
︙ | ︙ | |||
3131 3132 3133 3134 3135 3136 3137 | catch {unset foo} menu .m1 set foo "hello" list [.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye] \ [unset foo] } -cleanup { deleteWindows | | | | | | | 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 | catch {unset foo} menu .m1 set foo "hello" list [.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye] \ [unset foo] } -cleanup { deleteWindows } -result {e001 {}} # menu-17.2 - Don't know how to generate the flags in the if test menu-17.2 {MenuVarProc} -setup { deleteWindows } -body { catch {unset foo} menu .m1 list [.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye] \ [set foo ""] } -cleanup { deleteWindows } -result {e001 {}} test menu-17.3 {MenuVarProc} -setup { deleteWindows } -body { catch {unset foo} menu .m1 set foo "hello" list [.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye] \ [set foo "hello"] [unset foo] } -cleanup { deleteWindows } -result {e001 hello {}} test menu-17.4 {MenuVarProc} -setup { deleteWindows } -body { menu .m1 set foo "goodbye" list [.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye] \ [set foo "hello"] [unset foo] } -cleanup { deleteWindows } -result {e001 hello {}} test menu-17.5 {MenuVarProc} -setup { deleteWindows } -body { menu .m1 set foo "hello" list [.m1 add checkbutton -variable foo -onvalue hello -offvalue goodbye] \ [set foo "goodbye"] [unset foo] } -cleanup { deleteWindows } -result {e001 goodbye {}} test menu-17.6 {MenuVarProc [5d991b822e]} -setup { deleteWindows } -body { # Want this not to crash menu .b set var INIT .b add checkbutton -variable var |
︙ | ︙ | |||
4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 | catch {destroy .m} } -body { menu .m -type {} } -cleanup { destroy .m } -returnCodes error -result {ambiguous type "": must be menubar, normal, or tearoff} # cleanup imageFinish deleteWindows cleanupTests return # Local variables: # mode: tcl # End: | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 | catch {destroy .m} } -body { menu .m -type {} } -cleanup { destroy .m } -returnCodes error -result {ambiguous type "": must be menubar, normal, or tearoff} test menu-40.1 {identifiers - auto generated} -setup { destroy .m } -body { menu .m list [.m add command -label 1] [.m add command -label 2] [.m add command -label 3] } -cleanup { destroy .m } -result {e001 e002 e003} test menu-40.2 {identifiers - out of sequence} -setup { destroy .m } -body { menu .m -tearoff 0 .m add command -label 1 .m insert 0 command -label 2 .m add command -label 3 list [.m index e001] [.m index e002] [.m index e003] } -cleanup { destroy .m } -result {1 0 2} test menu-40.3 {identifiers - out of sequence with tearoff} -setup { destroy .m } -body { menu .m -tearoff 1 .m add command -label 1 .m insert 0 command -label 2 .m add command -label 3 list [.m index e001] [.m index e002] [.m index e003] } -cleanup { destroy .m } -result {2 1 3} test menu-40.4 {identifiers - entry id} -setup { destroy .m } -body { menu .m -tearoff 1 .m add command -label 1 .m insert 0 command -label 2 .m add command -label 3 list [.m id 0] [.m id 1] [.m id 2] [.m id 3] } -cleanup { destroy .m } -result {{} e002 e001 e003} test menu-40.5 {identifiers - assigned} -setup { destroy .m } -body { menu .m list [.m add command cmd1 -label 1] [.m insert 0 command cmd2 -label 2] [.m add command cmd3 -label 3] } -cleanup { destroy .m } -result {cmd1 cmd2 cmd3} test menu-40.6 {identifiers - mixed} -setup { destroy .m } -body { menu .m list [.m add command -label 1] [.m insert 0 command cmd2 -label 2] [.m add command -label 3] } -cleanup { destroy .m } -result {e001 cmd2 e002} test menu-40.7 {identifiers - conflict} -setup { destroy .m } -body { menu .m list [.m add command e002 -label 1] [.m add command -label 2] [.m add command -label 3] } -cleanup { destroy .m } -result {e002 e001 e003} test menu-40.8 {identifiers - clone of complete menu} -setup { destroy .m1 .m2 } -body { menu .m1 -tearoff 0 .m1 add command -label 1 .m1 insert 0 command -label 2 .m1 add command cmd3 -label 3 .m1 clone .m2 list [.m2 index e001] [.m2 index e002] [.m2 index cmd3] } -cleanup { destroy .m1 .m2 } -result {1 0 2} test menu-40.9 {identifiers - modify after cloning} -setup { destroy .m1 .m2 } -body { menu .m1 -tearoff 0 .m1 clone .m2 .m1 add command -label 1 .m1 insert 0 command -label 2 .m1 add command cmd3 -label 3 list [.m2 index e001] [.m2 index e002] [.m2 index cmd3] } -cleanup { destroy .m1 .m2 } -result {1 0 2} test menu-40.10 {identifiers - modify clone} -setup { destroy .m1 .m2 } -body { menu .m1 -tearoff 0 .m1 clone .m2 .m2 add command -label 1 .m2 insert 0 command -label 2 .m2 add command cmd3 -label 3 list [.m1 index e001] [.m1 index e002] [.m1 index cmd3] } -cleanup { destroy .m1 .m2 } -result {1 0 2} test menu-40.11 {identifiers - entrycget by id} -setup { destroy .m } -body { menu .m .m add command -label 1 .m add command -label 2 .m add command cmd3 -label 3 list [.m entrycget e001 -label] [.m entrycget e002 -label] [.m entrycget cmd3 -label] } -cleanup { destroy .m } -result {1 2 3} test menu-40.12 {identifiers - delete by id} -setup { destroy .m } -body { menu .m .m add command -label 1 .m add command -label 2 .m add command -label 3 .m add command -label 4 .m add command -label 5 .m add command -label 6 .m add command -label 7 .m add command cmd8 -label 8 .m add command cmd9 -label 9 .m delete e003 cmd8 list [.m id 0] [.m id 1] [.m id 2] } -cleanup { destroy .m } -result {e001 e002 cmd9} test menu-40.13 {identifiers - duplicate} -setup { destroy .m } -body { menu .m .m add command foo -label 1 .m add command bar -label 2 .m add command foo -label 3 } -cleanup { destroy .m } -returnCodes error -result {entry "foo" already exists} test menu-40.14 {identifiers - reserved word} -setup { destroy .m } -body { menu .m -tearoff 0 .m add command last -label 1 .m add command -label 2 .m add command -label 3 .m index last } -cleanup { destroy .m } -result {2} # cleanup imageFinish deleteWindows cleanupTests return # Local variables: # mode: tcl # End: |
Changes to tests/menuDraw.test.
︙ | ︙ | |||
23 24 25 26 27 28 29 | test menuDraw-2.1 {TkInitializeMenuEntryDrawingFields} -setup { deleteWindows } -body { menu .m1 .m1 add command } -cleanup { deleteWindows | | | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | test menuDraw-2.1 {TkInitializeMenuEntryDrawingFields} -setup { deleteWindows } -body { menu .m1 .m1 add command } -cleanup { deleteWindows } -result {e001} test menuDraw-3.1 {TkMenuFreeDrawOptions} -setup { deleteWindows } -body { menu .m1 destroy .m1 |
︙ | ︙ | |||
82 83 84 85 86 87 88 | test menuDraw-6.1 {TkMenuConfigureEntryDrawOptions - no tkfont specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" } -cleanup { deleteWindows | | | | 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | test menuDraw-6.1 {TkMenuConfigureEntryDrawOptions - no tkfont specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.2 {TkMenuConfigureEntryDrawOptions - tkfont specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -font "Courier 12" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.3 {TkMenuConfigureEntryDrawOptions - active state - wrong entry} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" .m1 entryconfigure 1 -state active } -cleanup { |
︙ | ︙ | |||
136 137 138 139 140 141 142 | test menuDraw-6.7 {TkMenuConfigureEntryDrawOptions - tkfont specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -font "Courier 12" } -cleanup { deleteWindows | | | | | | | | 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | test menuDraw-6.7 {TkMenuConfigureEntryDrawOptions - tkfont specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -font "Courier 12" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.8 {TkMenuConfigureEntryDrawOptions - border specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -background "red" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.9 {TkMenuConfigureEntryDrawOptions - foreground specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -foreground "red" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.10 {TkMenuConfigureEntryDrawOptions - activeBorder specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -activebackground "red" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.11 {TkMenuConfigureEntryDrawOptions - activeforeground specified} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -activeforeground "red" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.12 {TkMenuConfigureEntryDrawOptions - selectcolor specified} -setup { deleteWindows } -body { menu .m1 .m1 add radiobutton -label "foo" -selectcolor "red" } -cleanup { deleteWindows } -result {e001} test menuDraw-6.13 {TkMenuConfigureEntryDrawOptions - textGC disposal} -setup { deleteWindows } -body { menu .m1 .m1 add command -label "foo" -font "Helvetica 12" .m1 entryconfigure 1 -font "Courier 12" } -cleanup { |
︙ | ︙ |
Changes to tests/winMenu.test.
︙ | ︙ | |||
89 90 91 92 93 94 95 | } -setup { destroy .m1 } -body { catch {image delete image1} menu .m1 image create test image1 list [catch {.m1 add command -image image1} msg] $msg [destroy .m1] [image delete image1] | | | | | | | | | | | | | | | | | 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | } -setup { destroy .m1 } -body { catch {image delete image1} menu .m1 image create test image1 list [catch {.m1 add command -image image1} msg] $msg [destroy .m1] [image delete image1] } -result {0 e001 {} {}} test winMenu-6.3 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -bitmap questhead} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.4 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.5 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "foo"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.6 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "This string has one & in it"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.7 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "The & should be underlined." -underline 4} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.8 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "The * should be underlined." -underline 4} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.9 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "foo" -accel "bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.10 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "This string has one & in it" -accel "bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.11 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "The & should be underlined." -underline 4 -accel "bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.12 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "The * should be underlined." -underline 4 -accel "bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.13 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "foo" -accel "&bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.14 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "This string has one & in it" -accel "&bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.15 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "The & should be underlined." -underline 4 -accel "&bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-6.16 {GetEntryText} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command -label "The * should be underlined." -underline 4 -accel "&bar"} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-7.1 {ReconfigureWindowsMenu - system menu item removal} -constraints { win } -setup { destroy .m1 } -body { menu .m1 |
︙ | ︙ | |||
423 424 425 426 427 428 429 | test winMenu-9.1 {TkpMenuNewEntry} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command} msg] $msg [destroy .m1] | | | 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 | test winMenu-9.1 {TkpMenuNewEntry} -constraints win -setup { destroy .m1 } -body { menu .m1 list [catch {.m1 add command} msg] $msg [destroy .m1] } -result {0 e001 {}} test winMenu-10.1 {TkwinMenuProc} -constraints { win userInteraction } -setup { destroy .m1 } -body { |
︙ | ︙ | |||
855 856 857 858 859 860 861 | win } -setup { destroy .m1 } -body { menu .m1 -tearoff 0 .m1 add command -label Hello list [catch {.m1 add command -label Two} msg] $msg [destroy .m1] | | | | 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 | win } -setup { destroy .m1 } -body { menu .m1 -tearoff 0 .m1 add command -label Hello list [catch {.m1 add command -label Two} msg] $msg [destroy .m1] } -result {0 e002 {}} test winMenu-28.2 {TkpConfigureMenuEntry - update not pending} -constraints { win } -setup { destroy .m1 } -body { menu .m1 -tearoff 0 .m1 add command -label One update idletasks list [catch {.m1 add command -label Two} msg] $msg [destroy .m1] } -result {0 e002 {}} test winMenu-29.1 {TkpDrawMenuEntry - gc for active and not strict motif} -constraints { win } -setup { destroy .m1 } -body { |
︙ | ︙ |