static void SetHelpMenu( TkMenu *menuPtr) /* The menu we are checking */ { TkMenuEntry *cascadeEntryPtr; int useMotifHelp = 0; const char *option = NULL; if (menuPtr->tkwin) { option = Tk_GetOption(menuPtr->tkwin, "useMotifHelp", "UseMotifHelp"); if (option != NULL) { Tcl_GetBoolean(NULL, option, &useMotifHelp); } } if (!useMotifHelp) { return; } for (cascadeEntryPtr = menuPtr->menuRefPtr->parentEntryPtr; cascadeEntryPtr != NULL; cascadeEntryPtr = cascadeEntryPtr->nextCascadePtr) { if ((cascadeEntryPtr->menuPtr->menuType == MENUBAR) && (cascadeEntryPtr->menuPtr->masterMenuPtr->tkwin != NULL) && (menuPtr->masterMenuPtr->tkwin != NULL)) { TkMenu *masterMenuPtr = cascadeEntryPtr->menuPtr->masterMenuPtr; char *helpMenuName = ckalloc(strlen(Tk_PathName( masterMenuPtr->tkwin)) + strlen(".help") + 1); strcpy(helpMenuName, Tk_PathName(masterMenuPtr->tkwin)); strcat(helpMenuName, ".help"); if (strcmp(helpMenuName, Tk_PathName(menuPtr->masterMenuPtr->tkwin)) == 0) { cascadeEntryPtr->entryFlags |= ENTRY_HELP_MENU; } else { cascadeEntryPtr->entryFlags &= ~ENTRY_HELP_MENU; } ckfree(helpMenuName); } } }
callGraphConsts::callGraphConsts(Tcl_Interp *interp, Tk_Window theTkWindow) { display = Tk_Display(theTkWindow); // needed in destructor textColor = Tk_GetColor(interp, theTkWindow, Tk_GetUid("black")); assert(textColor); // Root Item FontStruct's: Tk_Uid rootItemFontName = Tk_GetOption( theTkWindow, "listRootItemFont", "Font" ); assert( rootItemFontName != NULL ); rootItemFontStruct = Tk_GetFont( interp, theTkWindow, rootItemFontName ); Tk_Uid rootItemItalicFontName = Tk_GetOption( theTkWindow, "listRootItemEmphFont", "Font" ); assert( rootItemItalicFontName != NULL ); rootItemItalicFontStruct = Tk_GetFont( interp, theTkWindow, rootItemItalicFontName ); // Root Item Text GCs: XGCValues values; values.foreground = textColor->pixel; values.font = Tk_FontId(rootItemFontStruct); rootItemTextGC = Tk_GetGC(theTkWindow, GCForeground | GCFont, &values); assert(rootItemTextGC); values.font = Tk_FontId(rootItemItalicFontStruct); values.foreground = textColor->pixel; rootItemShadowTextGC = Tk_GetGC(theTkWindow, GCForeground | GCFont, &values); assert(rootItemShadowTextGC); // Listbox FontStruct's: Tk_Uid listboxItemFontName = Tk_GetOption( theTkWindow, "listItemFont", "Font" ); assert( listboxItemFontName ); listboxItemFontStruct = Tk_GetFont(interp, theTkWindow, listboxItemFontName ); Tk_Uid listboxItemItalicFontName = Tk_GetOption( theTkWindow, "listItemEmphFont", "Font" ); assert( listboxItemItalicFontName ); listboxItemItalicFontStruct = Tk_GetFont(interp, theTkWindow, listboxItemItalicFontName ); // Listbox Item Text GCs: values.foreground = textColor->pixel; values.font = Tk_FontId(listboxItemFontStruct); listboxItemGC = Tk_GetGC(theTkWindow, GCForeground | GCFont, &values); assert(listboxItemGC); values.font = Tk_FontId(listboxItemItalicFontStruct); values.foreground = textColor->pixel; listboxItemShadowTextGC = Tk_GetGC(theTkWindow, GCForeground | GCFont, &values); assert(listboxItemShadowTextGC); rootItemTk3DBordersByStyle.resize(2); //Color for non-recursive nodes rootItemTk3DBordersByStyle[0] = Tk_Get3DBorder(interp, theTkWindow, Tk_GetUid("gray")); assert(rootItemTk3DBordersByStyle[0]); //Color for recursive nodes rootItemTk3DBordersByStyle[1] = Tk_Get3DBorder(interp, theTkWindow, Tk_GetUid("#60c0a0")); //green assert(rootItemTk3DBordersByStyle[1]); listboxItemTk3DBordersByStyle = rootItemTk3DBordersByStyle; // 3D borders for listbox: // It seems reasonable to use the exact same colors for shg listbox items: //listboxScrollbarBorder = rootItemBorder; }
int Tk_ConfigureWidget( Tcl_Interp *interp, /* Interpreter for error reporting. */ Tk_Window tkwin, /* Window containing widget (needed to set up * X resources). */ Tk_ConfigSpec *specs, /* Describes legal options. */ int argc, /* Number of elements in argv. */ CONST char **argv, /* Command-line options. */ char *widgRec, /* Record whose fields are to be modified. * Values must be properly initialized. */ int flags) /* Used to specify additional flags that must * be present in config specs for them to be * considered. Also, may have * TK_CONFIG_ARGV_ONLY set. */ { register Tk_ConfigSpec *specPtr; Tk_Uid value; /* Value of option from database. */ int needFlags; /* Specs must contain this set of flags or * else they are not considered. */ int hateFlags; /* If a spec contains any bits here, it's not * considered. */ if (tkwin == NULL) { /* * Either we're not really in Tk, or the main window was destroyed and * we're on our way out of the application */ Tcl_AppendResult(interp, "NULL main window", NULL); return TCL_ERROR; } needFlags = flags & ~(TK_CONFIG_USER_BIT - 1); if (Tk_Depth(tkwin) <= 1) { hateFlags = TK_CONFIG_COLOR_ONLY; } else { hateFlags = TK_CONFIG_MONO_ONLY; } /* * Get the build of the config for this interpreter. */ specs = GetCachedSpecs(interp, specs); /* * Pass one: scan through all of the arguments, processing those that * match entries in the specs. */ for ( ; argc > 0; argc -= 2, argv += 2) { CONST char *arg; if (flags & TK_CONFIG_OBJS) { arg = Tcl_GetStringFromObj((Tcl_Obj *) *argv, NULL); } else { arg = *argv; } specPtr = FindConfigSpec(interp, specs, arg, needFlags, hateFlags); if (specPtr == NULL) { return TCL_ERROR; } /* * Process the entry. */ if (argc < 2) { Tcl_AppendResult(interp, "value for \"", arg, "\" missing", NULL); return TCL_ERROR; } if (flags & TK_CONFIG_OBJS) { arg = Tcl_GetString((Tcl_Obj *) argv[1]); } else { arg = argv[1]; } if (DoConfig(interp, tkwin, specPtr, arg, 0, widgRec) != TCL_OK) { char msg[100]; sprintf(msg, "\n (processing \"%.40s\" option)", specPtr->argvName); Tcl_AddErrorInfo(interp, msg); return TCL_ERROR; } if (!(flags & TK_CONFIG_ARGV_ONLY)) { specPtr->specFlags |= TK_CONFIG_OPTION_SPECIFIED; } } /* * Pass two: scan through all of the specs again; if no command-line * argument matched a spec, then check for info in the option database. * If there was nothing in the database, then use the default. */ if (!(flags & TK_CONFIG_ARGV_ONLY)) { for (specPtr=specs; specPtr->type!=TK_CONFIG_END; specPtr++) { if ((specPtr->specFlags & TK_CONFIG_OPTION_SPECIFIED) || (specPtr->argvName == NULL) || (specPtr->type == TK_CONFIG_SYNONYM)) { specPtr->specFlags &= ~TK_CONFIG_OPTION_SPECIFIED; continue; } if (((specPtr->specFlags & needFlags) != needFlags) || (specPtr->specFlags & hateFlags)) { continue; } value = NULL; if (specPtr->dbName != NULL) { value = Tk_GetOption(tkwin, specPtr->dbName, specPtr->dbClass); } if (value != NULL) { if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) != TCL_OK) { char msg[200]; sprintf(msg, "\n (%s \"%.50s\" in widget \"%.50s\")", "database entry for", specPtr->dbName, Tk_PathName(tkwin)); Tcl_AddErrorInfo(interp, msg); return TCL_ERROR; } } else { if (specPtr->defValue != NULL) { value = Tk_GetUid(specPtr->defValue); } else { value = NULL; } if ((value != NULL) && !(specPtr->specFlags & TK_CONFIG_DONT_SET_DEFAULT)) { if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) != TCL_OK) { char msg[200]; sprintf(msg, "\n (%s \"%.50s\" in widget \"%.50s\")", "default value for", specPtr->dbName, Tk_PathName(tkwin)); Tcl_AddErrorInfo(interp, msg); return TCL_ERROR; } } } } } return TCL_OK; }
int Tk_OptionObjCmd( ClientData clientData, /* Main window associated with interpreter. */ Tcl_Interp *interp, /* Current interpreter. */ int objc, /* Number of Tcl_Obj arguments. */ Tcl_Obj *const objv[]) /* Tcl_Obj arguments. */ { Tk_Window tkwin = clientData; int index, result; ThreadSpecificData *tsdPtr = Tcl_GetThreadData(&dataKey, sizeof(ThreadSpecificData)); static const char *const optionCmds[] = { "add", "clear", "get", "readfile", NULL }; enum optionVals { OPTION_ADD, OPTION_CLEAR, OPTION_GET, OPTION_READFILE }; if (objc < 2) { Tcl_WrongNumArgs(interp, 1, objv, "cmd arg ?arg ...?"); return TCL_ERROR; } result = Tcl_GetIndexFromObj(interp, objv[1], optionCmds, "option", 0, &index); if (result != TCL_OK) { return result; } result = TCL_OK; switch ((enum optionVals) index) { case OPTION_ADD: { int priority; if ((objc != 4) && (objc != 5)) { Tcl_WrongNumArgs(interp, 2, objv, "pattern value ?priority?"); return TCL_ERROR; } if (objc == 4) { priority = TK_INTERACTIVE_PRIO; } else { priority = ParsePriority(interp, Tcl_GetString(objv[4])); if (priority < 0) { return TCL_ERROR; } } Tk_AddOption(tkwin, Tcl_GetString(objv[2]), Tcl_GetString(objv[3]), priority); break; } case OPTION_CLEAR: { TkMainInfo *mainPtr; if (objc != 2) { Tcl_WrongNumArgs(interp, 2, objv, ""); return TCL_ERROR; } mainPtr = ((TkWindow *) tkwin)->mainPtr; if (mainPtr->optionRootPtr != NULL) { ClearOptionTree(mainPtr->optionRootPtr); mainPtr->optionRootPtr = NULL; } tsdPtr->cachedWindow = NULL; break; } case OPTION_GET: { Tk_Window window; Tk_Uid value; if (objc != 5) { Tcl_WrongNumArgs(interp, 2, objv, "window name class"); return TCL_ERROR; } window = Tk_NameToWindow(interp, Tcl_GetString(objv[2]), tkwin); if (window == NULL) { return TCL_ERROR; } value = Tk_GetOption(window, Tcl_GetString(objv[3]), Tcl_GetString(objv[4])); if (value != NULL) { Tcl_SetResult(interp, (char *) value, TCL_STATIC); } break; } case OPTION_READFILE: { int priority; if ((objc != 3) && (objc != 4)) { Tcl_WrongNumArgs(interp, 2, objv, "fileName ?priority?"); return TCL_ERROR; } if (objc == 4) { priority = ParsePriority(interp, Tcl_GetString(objv[3])); if (priority < 0) { return TCL_ERROR; } } else { priority = TK_INTERACTIVE_PRIO; } result = ReadOptionFile(interp, tkwin, Tcl_GetString(objv[2]), priority); break; } } return result; }