diff options
Diffstat (limited to 'tk8.6/generic/tkOldConfig.c')
-rw-r--r-- | tk8.6/generic/tkOldConfig.c | 1184 |
1 files changed, 0 insertions, 1184 deletions
diff --git a/tk8.6/generic/tkOldConfig.c b/tk8.6/generic/tkOldConfig.c deleted file mode 100644 index 920d93e..0000000 --- a/tk8.6/generic/tkOldConfig.c +++ /dev/null @@ -1,1184 +0,0 @@ -/* - * tkOldConfig.c -- - * - * This file contains the Tk_ConfigureWidget function. THIS FILE IS HERE - * FOR BACKWARD COMPATIBILITY; THE NEW CONFIGURATION PACKAGE SHOULD BE - * USED FOR NEW PROJECTS. - * - * Copyright (c) 1990-1994 The Regents of the University of California. - * Copyright (c) 1994-1997 Sun Microsystems, Inc. - * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - */ - -#include "tkInt.h" - -/* - * Values for "flags" field of Tk_ConfigSpec structures. Be sure to coordinate - * these values with those defined in tk.h (TK_CONFIG_COLOR_ONLY, etc.) There - * must not be overlap! - * - * INIT - Non-zero means (char *) things have been converted to - * Tk_Uid's. - */ - -#define INIT 0x20 - -/* - * Forward declarations for functions defined later in this file: - */ - -static int DoConfig(Tcl_Interp *interp, Tk_Window tkwin, - Tk_ConfigSpec *specPtr, Tk_Uid value, - int valueIsUid, char *widgRec); -static Tk_ConfigSpec * FindConfigSpec(Tcl_Interp *interp, - Tk_ConfigSpec *specs, const char *argvName, - int needFlags, int hateFlags); -static char * FormatConfigInfo(Tcl_Interp *interp, Tk_Window tkwin, - const Tk_ConfigSpec *specPtr, char *widgRec); -static const char * FormatConfigValue(Tcl_Interp *interp, Tk_Window tkwin, - const Tk_ConfigSpec *specPtr, char *widgRec, - char *buffer, Tcl_FreeProc **freeProcPtr); -static Tk_ConfigSpec * GetCachedSpecs(Tcl_Interp *interp, - const Tk_ConfigSpec *staticSpecs); -static void DeleteSpecCacheTable(ClientData clientData, - Tcl_Interp *interp); - -/* - *-------------------------------------------------------------- - * - * Tk_ConfigureWidget -- - * - * Process command-line options and database options to fill in fields of - * a widget record with resources and other parameters. - * - * Results: - * A standard Tcl return value. In case of an error, the interp's result - * will hold an error message. - * - * Side effects: - * The fields of widgRec get filled in with information from argc/argv - * and the option database. Old information in widgRec's fields gets - * recycled. A copy of the spec-table is taken with (some of) the char* - * fields converted into Tk_Uid fields; this copy will be released when - * the interpreter terminates. - * - *-------------------------------------------------------------- - */ - -int -Tk_ConfigureWidget( - Tcl_Interp *interp, /* Interpreter for error reporting. */ - Tk_Window tkwin, /* Window containing widget (needed to set up - * X resources). */ - const 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, *staticSpecs; - 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_SetObjResult(interp, Tcl_NewStringObj("NULL main window", -1)); - Tcl_SetErrorCode(interp, "TK", "NO_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. - */ - - staticSpecs = GetCachedSpecs(interp, specs); - - for (specPtr = staticSpecs; specPtr->type != TK_CONFIG_END; specPtr++) { - specPtr->specFlags &= ~TK_CONFIG_OPTION_SPECIFIED; - } - - /* - * 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_GetString((Tcl_Obj *) *argv); - } else { - arg = *argv; - } - specPtr = FindConfigSpec(interp, staticSpecs, arg, needFlags, hateFlags); - if (specPtr == NULL) { - return TCL_ERROR; - } - - /* - * Process the entry. - */ - - if (argc < 2) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "value for \"%s\" missing", arg)); - Tcl_SetErrorCode(interp, "TK", "VALUE_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) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (processing \"%.40s\" option)",specPtr->argvName)); - 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 = staticSpecs; specPtr->type != TK_CONFIG_END; specPtr++) { - if ((specPtr->specFlags & TK_CONFIG_OPTION_SPECIFIED) - || (specPtr->argvName == NULL) - || (specPtr->type == TK_CONFIG_SYNONYM)) { - 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) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (%s \"%.50s\" in widget \"%.50s\")", - "database entry for", specPtr->dbName, - Tk_PathName(tkwin))); - 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) { - Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( - "\n (%s \"%.50s\" in widget \"%.50s\")", - "default value for", specPtr->dbName, - Tk_PathName(tkwin))); - return TCL_ERROR; - } - } - } - } - } - - return TCL_OK; -} - -/* - *-------------------------------------------------------------- - * - * FindConfigSpec -- - * - * Search through a table of configuration specs, looking for one that - * matches a given argvName. - * - * Results: - * The return value is a pointer to the matching entry, or NULL if - * nothing matched. In that case an error message is left in the interp's - * result. - * - * Side effects: - * None. - * - *-------------------------------------------------------------- - */ - -static Tk_ConfigSpec * -FindConfigSpec( - Tcl_Interp *interp, /* Used for reporting errors. */ - Tk_ConfigSpec *specs, /* Pointer to table of configuration - * specifications for a widget. */ - const char *argvName, /* Name (suitable for use in a "config" - * command) identifying particular option. */ - int needFlags, /* Flags that must be present in matching - * entry. */ - int hateFlags) /* Flags that must NOT be present in matching - * entry. */ -{ - register Tk_ConfigSpec *specPtr; - register char c; /* First character of current argument. */ - Tk_ConfigSpec *matchPtr; /* Matching spec, or NULL. */ - size_t length; - - c = argvName[1]; - length = strlen(argvName); - matchPtr = NULL; - for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) { - if (specPtr->argvName == NULL) { - continue; - } - if ((specPtr->argvName[1] != c) - || (strncmp(specPtr->argvName, argvName, length) != 0)) { - continue; - } - if (((specPtr->specFlags & needFlags) != needFlags) - || (specPtr->specFlags & hateFlags)) { - continue; - } - if (specPtr->argvName[length] == 0) { - matchPtr = specPtr; - goto gotMatch; - } - if (matchPtr != NULL) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "ambiguous option \"%s\"", argvName)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "OPTION", argvName,NULL); - return NULL; - } - matchPtr = specPtr; - } - - if (matchPtr == NULL) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "unknown option \"%s\"", argvName)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "OPTION", argvName, NULL); - return NULL; - } - - /* - * Found a matching entry. If it's a synonym, then find the entry that - * it's a synonym for. - */ - - gotMatch: - specPtr = matchPtr; - if (specPtr->type == TK_CONFIG_SYNONYM) { - for (specPtr = specs; ; specPtr++) { - if (specPtr->type == TK_CONFIG_END) { - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "couldn't find synonym for option \"%s\"", - argvName)); - Tcl_SetErrorCode(interp, "TK", "LOOKUP", "OPTION", argvName, - NULL); - return NULL; - } - if ((specPtr->dbName == matchPtr->dbName) - && (specPtr->type != TK_CONFIG_SYNONYM) - && ((specPtr->specFlags & needFlags) == needFlags) - && !(specPtr->specFlags & hateFlags)) { - break; - } - } - } - return specPtr; -} - -/* - *-------------------------------------------------------------- - * - * DoConfig -- - * - * This function applies a single configuration option to a widget - * record. - * - * Results: - * A standard Tcl return value. - * - * Side effects: - * WidgRec is modified as indicated by specPtr and value. The old value - * is recycled, if that is appropriate for the value type. - * - *-------------------------------------------------------------- - */ - -static int -DoConfig( - Tcl_Interp *interp, /* Interpreter for error reporting. */ - Tk_Window tkwin, /* Window containing widget (needed to set up - * X resources). */ - Tk_ConfigSpec *specPtr, /* Specifier to apply. */ - Tk_Uid value, /* Value to use to fill in widgRec. */ - int valueIsUid, /* Non-zero means value is a Tk_Uid; zero - * means it's an ordinary string. */ - char *widgRec) /* Record whose fields are to be modified. - * Values must be properly initialized. */ -{ - char *ptr; - Tk_Uid uid; - int nullValue; - - nullValue = 0; - if ((*value == 0) && (specPtr->specFlags & TK_CONFIG_NULL_OK)) { - nullValue = 1; - } - - do { - ptr = widgRec + specPtr->offset; - switch (specPtr->type) { - case TK_CONFIG_BOOLEAN: - if (Tcl_GetBoolean(interp, value, (int *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_INT: - if (Tcl_GetInt(interp, value, (int *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_DOUBLE: - if (Tcl_GetDouble(interp, value, (double *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_STRING: { - char *oldStr, *newStr; - - if (nullValue) { - newStr = NULL; - } else { - newStr = ckalloc(strlen(value) + 1); - strcpy(newStr, value); - } - oldStr = *((char **) ptr); - if (oldStr != NULL) { - ckfree(oldStr); - } - *((char **) ptr) = newStr; - break; - } - case TK_CONFIG_UID: - if (nullValue) { - *((Tk_Uid *) ptr) = NULL; - } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - *((Tk_Uid *) ptr) = uid; - } - break; - case TK_CONFIG_COLOR: { - XColor *newPtr, *oldPtr; - - if (nullValue) { - newPtr = NULL; - } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newPtr = Tk_GetColor(interp, tkwin, uid); - if (newPtr == NULL) { - return TCL_ERROR; - } - } - oldPtr = *((XColor **) ptr); - if (oldPtr != NULL) { - Tk_FreeColor(oldPtr); - } - *((XColor **) ptr) = newPtr; - break; - } - case TK_CONFIG_FONT: { - Tk_Font newFont; - - if (nullValue) { - newFont = NULL; - } else { - newFont = Tk_GetFont(interp, tkwin, value); - if (newFont == NULL) { - return TCL_ERROR; - } - } - Tk_FreeFont(*((Tk_Font *) ptr)); - *((Tk_Font *) ptr) = newFont; - break; - } - case TK_CONFIG_BITMAP: { - Pixmap newBmp, oldBmp; - - if (nullValue) { - newBmp = None; - } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newBmp = Tk_GetBitmap(interp, tkwin, uid); - if (newBmp == None) { - return TCL_ERROR; - } - } - oldBmp = *((Pixmap *) ptr); - if (oldBmp != None) { - Tk_FreeBitmap(Tk_Display(tkwin), oldBmp); - } - *((Pixmap *) ptr) = newBmp; - break; - } - case TK_CONFIG_BORDER: { - Tk_3DBorder newBorder, oldBorder; - - if (nullValue) { - newBorder = NULL; - } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newBorder = Tk_Get3DBorder(interp, tkwin, uid); - if (newBorder == NULL) { - return TCL_ERROR; - } - } - oldBorder = *((Tk_3DBorder *) ptr); - if (oldBorder != NULL) { - Tk_Free3DBorder(oldBorder); - } - *((Tk_3DBorder *) ptr) = newBorder; - break; - } - case TK_CONFIG_RELIEF: - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - if (Tk_GetRelief(interp, uid, (int *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_CURSOR: - case TK_CONFIG_ACTIVE_CURSOR: { - Tk_Cursor newCursor, oldCursor; - - if (nullValue) { - newCursor = None; - } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newCursor = Tk_GetCursor(interp, tkwin, uid); - if (newCursor == None) { - return TCL_ERROR; - } - } - oldCursor = *((Tk_Cursor *) ptr); - if (oldCursor != None) { - Tk_FreeCursor(Tk_Display(tkwin), oldCursor); - } - *((Tk_Cursor *) ptr) = newCursor; - if (specPtr->type == TK_CONFIG_ACTIVE_CURSOR) { - Tk_DefineCursor(tkwin, newCursor); - } - break; - } - case TK_CONFIG_JUSTIFY: - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - if (Tk_GetJustify(interp, uid, (Tk_Justify *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_ANCHOR: - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - if (Tk_GetAnchor(interp, uid, (Tk_Anchor *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_CAP_STYLE: - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - if (Tk_GetCapStyle(interp, uid, (int *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_JOIN_STYLE: - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - if (Tk_GetJoinStyle(interp, uid, (int *) ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_PIXELS: - if (Tk_GetPixels(interp, tkwin, value, (int *) ptr) - != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_MM: - if (Tk_GetScreenMM(interp, tkwin, value, (double*)ptr) != TCL_OK) { - return TCL_ERROR; - } - break; - case TK_CONFIG_WINDOW: { - Tk_Window tkwin2; - - if (nullValue) { - tkwin2 = NULL; - } else { - tkwin2 = Tk_NameToWindow(interp, value, tkwin); - if (tkwin2 == NULL) { - return TCL_ERROR; - } - } - *((Tk_Window *) ptr) = tkwin2; - break; - } - case TK_CONFIG_CUSTOM: - if (specPtr->customPtr->parseProc(specPtr->customPtr->clientData, - interp, tkwin, value, widgRec, specPtr->offset)!=TCL_OK) { - return TCL_ERROR; - } - break; - default: - Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "bad config table: unknown type %d", specPtr->type)); - Tcl_SetErrorCode(interp, "TK", "BAD_CONFIG", NULL); - return TCL_ERROR; - } - specPtr++; - } while ((specPtr->argvName == NULL) && (specPtr->type != TK_CONFIG_END)); - return TCL_OK; -} - -/* - *-------------------------------------------------------------- - * - * Tk_ConfigureInfo -- - * - * Return information about the configuration options for a window, and - * their current values. - * - * Results: - * Always returns TCL_OK. The interp's result will be modified hold a - * description of either a single configuration option available for - * "widgRec" via "specs", or all the configuration options available. In - * the "all" case, the result will available for "widgRec" via "specs". - * The result will be a list, each of whose entries describes one option. - * Each entry will itself be a list containing the option's name for use - * on command lines, database name, database class, default value, and - * current value (empty string if none). For options that are synonyms, - * the list will contain only two values: name and synonym name. If the - * "name" argument is non-NULL, then the only information returned is - * that for the named argument (i.e. the corresponding entry in the - * overall list is returned). - * - * Side effects: - * None. - * - *-------------------------------------------------------------- - */ - -int -Tk_ConfigureInfo( - Tcl_Interp *interp, /* Interpreter for error reporting. */ - Tk_Window tkwin, /* Window corresponding to widgRec. */ - const Tk_ConfigSpec *specs, /* Describes legal options. */ - char *widgRec, /* Record whose fields contain current values - * for options. */ - const char *argvName, /* If non-NULL, indicates a single option - * whose info is to be returned. Otherwise - * info is returned for all options. */ - int flags) /* Used to specify additional flags that must - * be present in config specs for them to be - * considered. */ -{ - register Tk_ConfigSpec *specPtr, *staticSpecs; - int needFlags, hateFlags; - char *list; - const char *leader = "{"; - - 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. - */ - - staticSpecs = GetCachedSpecs(interp, specs); - - /* - * If information is only wanted for a single configuration spec, then - * handle that one spec specially. - */ - - Tcl_ResetResult(interp); - if (argvName != NULL) { - specPtr = FindConfigSpec(interp, staticSpecs, argvName, needFlags, - hateFlags); - if (specPtr == NULL) { - return TCL_ERROR; - } - list = FormatConfigInfo(interp, tkwin, specPtr, widgRec); - Tcl_SetObjResult(interp, Tcl_NewStringObj(list, -1)); - ckfree(list); - return TCL_OK; - } - - /* - * Loop through all the specs, creating a big list with all their - * information. - */ - - for (specPtr = staticSpecs; specPtr->type != TK_CONFIG_END; specPtr++) { - if ((argvName != NULL) && (specPtr->argvName != argvName)) { - continue; - } - if (((specPtr->specFlags & needFlags) != needFlags) - || (specPtr->specFlags & hateFlags)) { - continue; - } - if (specPtr->argvName == NULL) { - continue; - } - list = FormatConfigInfo(interp, tkwin, specPtr, widgRec); - Tcl_AppendResult(interp, leader, list, "}", NULL); - ckfree(list); - leader = " {"; - } - return TCL_OK; -} - -/* - *-------------------------------------------------------------- - * - * FormatConfigInfo -- - * - * Create a valid Tcl list holding the configuration information for a - * single configuration option. - * - * Results: - * A Tcl list, dynamically allocated. The caller is expected to arrange - * for this list to be freed eventually. - * - * Side effects: - * Memory is allocated. - * - *-------------------------------------------------------------- - */ - -static char * -FormatConfigInfo( - Tcl_Interp *interp, /* Interpreter to use for things like - * floating-point precision. */ - Tk_Window tkwin, /* Window corresponding to widget. */ - register const Tk_ConfigSpec *specPtr, - /* Pointer to information describing - * option. */ - char *widgRec) /* Pointer to record holding current values of - * info for widget. */ -{ - const char *argv[6]; - char *result; - char buffer[200]; - Tcl_FreeProc *freeProc = NULL; - - argv[0] = specPtr->argvName; - argv[1] = specPtr->dbName; - argv[2] = specPtr->dbClass; - argv[3] = specPtr->defValue; - if (specPtr->type == TK_CONFIG_SYNONYM) { - return Tcl_Merge(2, argv); - } - argv[4] = FormatConfigValue(interp, tkwin, specPtr, widgRec, buffer, - &freeProc); - if (argv[1] == NULL) { - argv[1] = ""; - } - if (argv[2] == NULL) { - argv[2] = ""; - } - if (argv[3] == NULL) { - argv[3] = ""; - } - if (argv[4] == NULL) { - argv[4] = ""; - } - result = Tcl_Merge(5, argv); - if (freeProc != NULL) { - if ((freeProc == TCL_DYNAMIC) || (freeProc == (Tcl_FreeProc *) free)) { - ckfree((char *) argv[4]); - } else { - freeProc((char *) argv[4]); - } - } - return result; -} - -/* - *---------------------------------------------------------------------- - * - * FormatConfigValue -- - * - * This function formats the current value of a configuration option. - * - * Results: - * The return value is the formatted value of the option given by specPtr - * and widgRec. If the value is static, so that it need not be freed, - * *freeProcPtr will be set to NULL; otherwise *freeProcPtr will be set - * to the address of a function to free the result, and the caller must - * invoke this function when it is finished with the result. - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -static const char * -FormatConfigValue( - Tcl_Interp *interp, /* Interpreter for use in real conversions. */ - Tk_Window tkwin, /* Window corresponding to widget. */ - const Tk_ConfigSpec *specPtr, /* Pointer to information describing option. - * Must not point to a synonym option. */ - char *widgRec, /* Pointer to record holding current values of - * info for widget. */ - char *buffer, /* Static buffer to use for small values. - * Must have at least 200 bytes of storage. */ - Tcl_FreeProc **freeProcPtr) /* Pointer to word to fill in with address of - * function to free the result, or NULL if - * result is static. */ -{ - const char *ptr, *result; - - *freeProcPtr = NULL; - ptr = widgRec + specPtr->offset; - result = ""; - switch (specPtr->type) { - case TK_CONFIG_BOOLEAN: - if (*((int *) ptr) == 0) { - result = "0"; - } else { - result = "1"; - } - break; - case TK_CONFIG_INT: - sprintf(buffer, "%d", *((int *) ptr)); - result = buffer; - break; - case TK_CONFIG_DOUBLE: - Tcl_PrintDouble(interp, *((double *) ptr), buffer); - result = buffer; - break; - case TK_CONFIG_STRING: - result = (*(char **) ptr); - if (result == NULL) { - result = ""; - } - break; - case TK_CONFIG_UID: { - Tk_Uid uid = *((Tk_Uid *) ptr); - - if (uid != NULL) { - result = uid; - } - break; - } - case TK_CONFIG_COLOR: { - XColor *colorPtr = *((XColor **) ptr); - - if (colorPtr != NULL) { - result = Tk_NameOfColor(colorPtr); - } - break; - } - case TK_CONFIG_FONT: { - Tk_Font tkfont = *((Tk_Font *) ptr); - - if (tkfont != NULL) { - result = Tk_NameOfFont(tkfont); - } - break; - } - case TK_CONFIG_BITMAP: { - Pixmap pixmap = *((Pixmap *) ptr); - - if (pixmap != None) { - result = Tk_NameOfBitmap(Tk_Display(tkwin), pixmap); - } - break; - } - case TK_CONFIG_BORDER: { - Tk_3DBorder border = *((Tk_3DBorder *) ptr); - - if (border != NULL) { - result = Tk_NameOf3DBorder(border); - } - break; - } - case TK_CONFIG_RELIEF: - result = Tk_NameOfRelief(*((int *) ptr)); - break; - case TK_CONFIG_CURSOR: - case TK_CONFIG_ACTIVE_CURSOR: { - Tk_Cursor cursor = *((Tk_Cursor *) ptr); - - if (cursor != None) { - result = Tk_NameOfCursor(Tk_Display(tkwin), cursor); - } - break; - } - case TK_CONFIG_JUSTIFY: - result = Tk_NameOfJustify(*((Tk_Justify *) ptr)); - break; - case TK_CONFIG_ANCHOR: - result = Tk_NameOfAnchor(*((Tk_Anchor *) ptr)); - break; - case TK_CONFIG_CAP_STYLE: - result = Tk_NameOfCapStyle(*((int *) ptr)); - break; - case TK_CONFIG_JOIN_STYLE: - result = Tk_NameOfJoinStyle(*((int *) ptr)); - break; - case TK_CONFIG_PIXELS: - sprintf(buffer, "%d", *((int *) ptr)); - result = buffer; - break; - case TK_CONFIG_MM: - Tcl_PrintDouble(interp, *((double *) ptr), buffer); - result = buffer; - break; - case TK_CONFIG_WINDOW: { - Tk_Window tkwin; - - tkwin = *((Tk_Window *) ptr); - if (tkwin != NULL) { - result = Tk_PathName(tkwin); - } - break; - } - case TK_CONFIG_CUSTOM: - result = specPtr->customPtr->printProc(specPtr->customPtr->clientData, - tkwin, widgRec, specPtr->offset, freeProcPtr); - break; - default: - result = "?? unknown type ??"; - } - return result; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_ConfigureValue -- - * - * This function returns the current value of a configuration option for - * a widget. - * - * Results: - * The return value is a standard Tcl completion code (TCL_OK or - * TCL_ERROR). The interp's result will be set to hold either the value - * of the option given by argvName (if TCL_OK is returned) or an error - * message (if TCL_ERROR is returned). - * - * Side effects: - * None. - * - *---------------------------------------------------------------------- - */ - -int -Tk_ConfigureValue( - Tcl_Interp *interp, /* Interpreter for error reporting. */ - Tk_Window tkwin, /* Window corresponding to widgRec. */ - const Tk_ConfigSpec *specs, /* Describes legal options. */ - char *widgRec, /* Record whose fields contain current values - * for options. */ - const char *argvName, /* Gives the command-line name for the option - * whose value is to be returned. */ - int flags) /* Used to specify additional flags that must - * be present in config specs for them to be - * considered. */ -{ - Tk_ConfigSpec *specPtr; - int needFlags, hateFlags; - Tcl_FreeProc *freeProc; - const char *result; - char buffer[200]; - - 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. - */ - - specPtr = GetCachedSpecs(interp, specs); - - specPtr = FindConfigSpec(interp, specPtr, argvName, needFlags, hateFlags); - if (specPtr == NULL) { - return TCL_ERROR; - } - result = FormatConfigValue(interp, tkwin, specPtr, widgRec, buffer, - &freeProc); - Tcl_SetObjResult(interp, Tcl_NewStringObj(result, -1)); - if (freeProc != NULL) { - if ((freeProc == TCL_DYNAMIC) || (freeProc == (Tcl_FreeProc *) free)) { - ckfree((char *) result); - } else { - freeProc((char *) result); - } - } - return TCL_OK; -} - -/* - *---------------------------------------------------------------------- - * - * Tk_FreeOptions -- - * - * Free up all resources associated with configuration options. - * - * Results: - * None. - * - * Side effects: - * Any resource in widgRec that is controlled by a configuration option - * (e.g. a Tk_3DBorder or XColor) is freed in the appropriate fashion. - * - * Notes: - * Since this is not looking anything up, this uses the static version of - * the config specs. - * - *---------------------------------------------------------------------- - */ - - /* ARGSUSED */ -void -Tk_FreeOptions( - const Tk_ConfigSpec *specs, /* Describes legal options. */ - char *widgRec, /* Record whose fields contain current values - * for options. */ - Display *display, /* X display; needed for freeing some - * resources. */ - int needFlags) /* Used to specify additional flags that must - * be present in config specs for them to be - * considered. */ -{ - register const Tk_ConfigSpec *specPtr; - char *ptr; - - for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) { - if ((specPtr->specFlags & needFlags) != needFlags) { - continue; - } - ptr = widgRec + specPtr->offset; - switch (specPtr->type) { - case TK_CONFIG_STRING: - if (*((char **) ptr) != NULL) { - ckfree(*((char **) ptr)); - *((char **) ptr) = NULL; - } - break; - case TK_CONFIG_COLOR: - if (*((XColor **) ptr) != NULL) { - Tk_FreeColor(*((XColor **) ptr)); - *((XColor **) ptr) = NULL; - } - break; - case TK_CONFIG_FONT: - Tk_FreeFont(*((Tk_Font *) ptr)); - *((Tk_Font *) ptr) = NULL; - break; - case TK_CONFIG_BITMAP: - if (*((Pixmap *) ptr) != None) { - Tk_FreeBitmap(display, *((Pixmap *) ptr)); - *((Pixmap *) ptr) = None; - } - break; - case TK_CONFIG_BORDER: - if (*((Tk_3DBorder *) ptr) != NULL) { - Tk_Free3DBorder(*((Tk_3DBorder *) ptr)); - *((Tk_3DBorder *) ptr) = NULL; - } - break; - case TK_CONFIG_CURSOR: - case TK_CONFIG_ACTIVE_CURSOR: - if (*((Tk_Cursor *) ptr) != None) { - Tk_FreeCursor(display, *((Tk_Cursor *) ptr)); - *((Tk_Cursor *) ptr) = None; - } - } - } -} - -/* - *-------------------------------------------------------------- - * - * GetCachedSpecs -- - * - * Returns a writable per-interpreter (and hence thread-local) copy of - * the given spec-table with (some of) the char* fields converted into - * Tk_Uid fields; this copy will be released when the interpreter - * terminates (during AssocData cleanup). - * - * Results: - * A pointer to the copied table. - * - * Notes: - * The conversion to Tk_Uid is only done the first time, when the table - * copy is taken. After that, the table is assumed to have Tk_Uids where - * they are needed. The time of deletion of the caches isn't very - * important unless you've got a lot of code that uses Tk_ConfigureWidget - * (or *Info or *Value} when the interpreter is being deleted. - * - *-------------------------------------------------------------- - */ - -static Tk_ConfigSpec * -GetCachedSpecs( - Tcl_Interp *interp, /* Interpreter in which to store the cache. */ - const Tk_ConfigSpec *staticSpecs) - /* Value to cache a copy of; it is also used - * as a key into the cache. */ -{ - Tk_ConfigSpec *cachedSpecs; - Tcl_HashTable *specCacheTablePtr; - Tcl_HashEntry *entryPtr; - int isNew; - - /* - * Get (or allocate if it doesn't exist) the hash table that the writable - * copies of the widget specs are stored in. In effect, this is - * self-initializing code. - */ - - specCacheTablePtr = - Tcl_GetAssocData(interp, "tkConfigSpec.threadTable", NULL); - if (specCacheTablePtr == NULL) { - specCacheTablePtr = ckalloc(sizeof(Tcl_HashTable)); - Tcl_InitHashTable(specCacheTablePtr, TCL_ONE_WORD_KEYS); - Tcl_SetAssocData(interp, "tkConfigSpec.threadTable", - DeleteSpecCacheTable, specCacheTablePtr); - } - - /* - * Look up or create the hash entry that the constant specs are mapped to, - * which will have the writable specs as its associated value. - */ - - entryPtr = Tcl_CreateHashEntry(specCacheTablePtr, (char *) staticSpecs, - &isNew); - if (isNew) { - unsigned int entrySpace = sizeof(Tk_ConfigSpec); - const Tk_ConfigSpec *staticSpecPtr; - Tk_ConfigSpec *specPtr; - - /* - * OK, no working copy in this interpreter so copy. Need to work out - * how much space to allocate first. - */ - - for (staticSpecPtr=staticSpecs; staticSpecPtr->type!=TK_CONFIG_END; - staticSpecPtr++) { - entrySpace += sizeof(Tk_ConfigSpec); - } - - /* - * Now allocate our working copy's space and copy over the contents - * from the master copy. - */ - - cachedSpecs = ckalloc(entrySpace); - memcpy(cachedSpecs, staticSpecs, entrySpace); - Tcl_SetHashValue(entryPtr, cachedSpecs); - - /* - * Finally, go through and replace database names, database classes - * and default values with Tk_Uids. This is the bit that has to be - * per-thread. - */ - - for (specPtr=cachedSpecs; specPtr->type!=TK_CONFIG_END; specPtr++) { - if (specPtr->argvName != NULL) { - if (specPtr->dbName != NULL) { - specPtr->dbName = Tk_GetUid(specPtr->dbName); - } - if (specPtr->dbClass != NULL) { - specPtr->dbClass = Tk_GetUid(specPtr->dbClass); - } - if (specPtr->defValue != NULL) { - specPtr->defValue = Tk_GetUid(specPtr->defValue); - } - } - } - } else { - cachedSpecs = Tcl_GetHashValue(entryPtr); - } - - return cachedSpecs; -} - -/* - *-------------------------------------------------------------- - * - * DeleteSpecCacheTable -- - * - * Delete the per-interpreter copy of all the Tk_ConfigSpec tables which - * were stored in the interpreter's assoc-data store. - * - * Results: - * None - * - * Side effects: - * None (does *not* use any Tk API). - * - *-------------------------------------------------------------- - */ - -static void -DeleteSpecCacheTable( - ClientData clientData, - Tcl_Interp *interp) -{ - Tcl_HashTable *tablePtr = clientData; - Tcl_HashEntry *entryPtr; - Tcl_HashSearch search; - - for (entryPtr = Tcl_FirstHashEntry(tablePtr,&search); entryPtr != NULL; - entryPtr = Tcl_NextHashEntry(&search)) { - /* - * Someone else deallocates the Tk_Uids themselves. - */ - - ckfree(Tcl_GetHashValue(entryPtr)); - } - Tcl_DeleteHashTable(tablePtr); - ckfree(tablePtr); -} - -/* - * Local Variables: - * mode: c - * c-basic-offset: 4 - * fill-column: 78 - * End: - */ |