diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2024-10-25 21:06:25 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2024-10-25 21:06:25 (GMT) |
| commit | 0d5336db012f45753abace489f18f0ca299c6961 (patch) | |
| tree | b1bf3280a9046df99226158978502eeb26f5b0a3 /generic/tkOldConfig.c | |
| parent | e97381a6d921de403516d5b761539a450f4af83c (diff) | |
| parent | 1320b8a2a9c1269a345d44d673a7a35707fbbe9c (diff) | |
| download | tk-core-tip-626.zip tk-core-tip-626.tar.gz tk-core-tip-626.tar.bz2 | |
Merge 9.0core-tip-626
Diffstat (limited to 'generic/tkOldConfig.c')
| -rw-r--r-- | generic/tkOldConfig.c | 184 |
1 files changed, 107 insertions, 77 deletions
diff --git a/generic/tkOldConfig.c b/generic/tkOldConfig.c index 0f22e3b..5fd55cf 100644 --- a/generic/tkOldConfig.c +++ b/generic/tkOldConfig.c @@ -33,8 +33,8 @@ */ static int DoConfig(Tcl_Interp *interp, Tk_Window tkwin, - Tk_ConfigSpec *specPtr, Tk_Uid value, - int valueIsUid, void *widgRec); + Tk_ConfigSpec *specPtr, Tcl_Obj *value, + void *widgRec); static Tk_ConfigSpec * FindConfigSpec(Tcl_Interp *interp, Tk_ConfigSpec *specs, const char *argvName, int needFlags, int hateFlags); @@ -144,8 +144,7 @@ Tk_ConfigureWidget( Tcl_SetErrorCode(interp, "TK", "VALUE_MISSING", (char *)NULL); return TCL_ERROR; } - arg = Tcl_GetString(objv[1]); - if (DoConfig(interp, tkwin, specPtr, arg, 0, widgRec) != TCL_OK) { + if (DoConfig(interp, tkwin, specPtr, objv[1], widgRec) != TCL_OK) { Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (processing \"%.40s\" option)",specPtr->argvName)); return TCL_ERROR; @@ -177,30 +176,33 @@ Tk_ConfigureWidget( value = Tk_GetOption(tkwin, specPtr->dbName, specPtr->dbClass); } if (value != NULL) { - if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) != + Tcl_Obj *arg = Tcl_NewStringObj(value, TCL_INDEX_NONE); + Tcl_IncrRefCount(arg); + if (DoConfig(interp, tkwin, specPtr, arg, widgRec) != TCL_OK) { Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (%s \"%.50s\" in widget \"%.50s\")", "database entry for", specPtr->dbName, Tk_PathName(tkwin))); + Tcl_DecrRefCount(arg); return TCL_ERROR; } + Tcl_DecrRefCount(arg); } else { - if (specPtr->defValue != NULL) { - value = Tk_GetUid(specPtr->defValue); - } else { - value = NULL; - } - if ((value != NULL) && !(specPtr->specFlags + if ((specPtr->defValue != NULL) && !(specPtr->specFlags & TK_CONFIG_DONT_SET_DEFAULT)) { - if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) != + Tcl_Obj *arg = Tcl_NewStringObj(specPtr->defValue, TCL_INDEX_NONE); + Tcl_IncrRefCount(arg); + if (DoConfig(interp, tkwin, specPtr, arg, widgRec) != TCL_OK) { Tcl_AppendObjToErrorInfo(interp, Tcl_ObjPrintf( "\n (%s \"%.50s\" in widget \"%.50s\")", "default value for", specPtr->dbName, Tk_PathName(tkwin))); + Tcl_DecrRefCount(arg); return TCL_ERROR; } + Tcl_DecrRefCount(arg); } } } @@ -332,21 +334,24 @@ DoConfig( 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. */ + Tcl_Obj *arg, /* Value to use to fill in widgRec. */ void *widgRec) /* Record whose fields are to be modified. * Values must be properly initialized. */ { void *ptr; - Tk_Uid uid; - int nullValue; + int nullValue = 0; + const char *value = Tcl_GetString(arg); - nullValue = 0; if ((*value == 0) && (specPtr->specFlags & (TK_CONFIG_NULL_OK|TCL_NULL_OK|1))) { nullValue = 1; } + if ((specPtr->specFlags & TK_CONFIG_OBJS) && (specPtr->type != TK_CONFIG_STRING) + && (specPtr->type != TK_CONFIG_PIXELS)) { + /* Prevent surprises for other options than TK_CONFIG_(STRING|PIXELS) */ + Tcl_AppendResult(interp, "TK_CONFIG_OBJS not supported", (char *)NULL); + return TCL_ERROR; + } do { if (specPtr->offset < 0) { break; @@ -354,17 +359,17 @@ DoConfig( ptr = (char *)widgRec + specPtr->offset; switch (specPtr->type) { case TK_CONFIG_BOOLEAN: - if (Tcl_GetBoolean(interp, value, (int *)ptr) != TCL_OK) { + if (Tcl_GetBooleanFromObj(interp, arg, (int *)ptr) != TCL_OK) { return TCL_ERROR; } break; case TK_CONFIG_INT: - if (Tcl_GetInt(interp, value, (int *)ptr) != TCL_OK) { + if (Tcl_GetIntFromObj(interp, arg, (int *)ptr) != TCL_OK) { return TCL_ERROR; } break; case TK_CONFIG_DOUBLE: - if (Tcl_GetDouble(interp, value, (double *)ptr) != TCL_OK) { + if (Tcl_GetDoubleFromObj(interp, arg, (double *)ptr) != TCL_OK) { return TCL_ERROR; } break; @@ -373,23 +378,29 @@ DoConfig( if (nullValue) { newStr = NULL; + } else if (specPtr->specFlags & TK_CONFIG_OBJS) { + Tcl_IncrRefCount(arg); + newStr = (char *)arg; } else { newStr = (char *)ckalloc(strlen(value) + 1); strcpy(newStr, value); } - oldStr = *((char **) ptr); + oldStr = *((char **)ptr); if (oldStr != NULL) { - ckfree(oldStr); + if (specPtr->specFlags & TK_CONFIG_OBJS) { + Tcl_DecrRefCount((Tcl_Obj *)oldStr); + } else { + ckfree(oldStr); + } } - *((char **) ptr) = newStr; + *((char **)ptr) = newStr; break; } case TK_CONFIG_UID: if (nullValue) { - *((Tk_Uid *) ptr) = NULL; + *((Tk_Uid *)ptr) = NULL; } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - *((Tk_Uid *) ptr) = uid; + *((Tk_Uid *)ptr) = Tk_GetUid(value); } break; case TK_CONFIG_COLOR: { @@ -398,17 +409,16 @@ DoConfig( if (nullValue) { newPtr = NULL; } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newPtr = Tk_GetColor(interp, tkwin, uid); + newPtr = Tk_AllocColorFromObj(interp, tkwin, arg); if (newPtr == NULL) { return TCL_ERROR; } } - oldPtr = *((XColor **) ptr); + oldPtr = *((XColor **)ptr); if (oldPtr != NULL) { Tk_FreeColor(oldPtr); } - *((XColor **) ptr) = newPtr; + *((XColor **)ptr) = newPtr; break; } case TK_CONFIG_FONT: { @@ -417,13 +427,13 @@ DoConfig( if (nullValue) { newFont = NULL; } else { - newFont = Tk_GetFont(interp, tkwin, value); + newFont = Tk_AllocFontFromObj(interp, tkwin, arg); if (newFont == NULL) { return TCL_ERROR; } } - Tk_FreeFont(*((Tk_Font *) ptr)); - *((Tk_Font *) ptr) = newFont; + Tk_FreeFont(*((Tk_Font *)ptr)); + *((Tk_Font *)ptr) = newFont; break; } case TK_CONFIG_BITMAP: { @@ -432,17 +442,16 @@ DoConfig( if (nullValue) { newBmp = None; } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newBmp = Tk_GetBitmap(interp, tkwin, uid); + newBmp = Tk_AllocBitmapFromObj(interp, tkwin, arg); if (newBmp == None) { return TCL_ERROR; } } - oldBmp = *((Pixmap *) ptr); + oldBmp = *((Pixmap *)ptr); if (oldBmp != None) { Tk_FreeBitmap(Tk_Display(tkwin), oldBmp); } - *((Pixmap *) ptr) = newBmp; + *((Pixmap *)ptr) = newBmp; break; } case TK_CONFIG_BORDER: { @@ -451,22 +460,20 @@ DoConfig( if (nullValue) { newBorder = NULL; } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newBorder = Tk_Get3DBorder(interp, tkwin, uid); + newBorder = Tk_Alloc3DBorderFromObj(interp, tkwin, arg); if (newBorder == NULL) { return TCL_ERROR; } } - oldBorder = *((Tk_3DBorder *) ptr); + oldBorder = *((Tk_3DBorder *)ptr); if (oldBorder != NULL) { Tk_Free3DBorder(oldBorder); } - *((Tk_3DBorder *) ptr) = newBorder; + *((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) { + if (Tk_GetReliefFromObj(interp, arg, (int *)ptr) != TCL_OK) { return TCL_ERROR; } break; @@ -477,50 +484,62 @@ DoConfig( if (nullValue) { newCursor = NULL; } else { - uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value); - newCursor = Tk_GetCursor(interp, tkwin, uid); + newCursor = Tk_AllocCursorFromObj(interp, tkwin, arg); if (newCursor == NULL) { return TCL_ERROR; } } - oldCursor = *((Tk_Cursor *) ptr); + oldCursor = *((Tk_Cursor *)ptr); if (oldCursor != NULL) { Tk_FreeCursor(Tk_Display(tkwin), oldCursor); } - *((Tk_Cursor *) ptr) = newCursor; + *((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) { + if (Tk_GetJustifyFromObj(interp, arg, (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) { + if (Tk_GetAnchorFromObj(interp, arg, (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) { + if (Tk_GetCapStyle(interp, value, (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) { + if (Tk_GetJoinStyle(interp, value, (int *)ptr) != TCL_OK) { return TCL_ERROR; } break; case TK_CONFIG_PIXELS: - if (nullValue) { + if (specPtr->specFlags & TK_CONFIG_OBJS) { + int dummy; + if (nullValue) { + if (*(Tcl_Obj **)ptr != NULL) { + Tcl_DecrRefCount(*(Tcl_Obj **)ptr); + *(Tcl_Obj **)ptr = NULL; + } + } else if (Tk_GetPixelsFromObj(interp, tkwin, arg, &dummy) + != TCL_OK) { + return TCL_ERROR; + } else { + Tcl_IncrRefCount(arg); + if (*(Tcl_Obj **)ptr != NULL) { + Tcl_DecrRefCount(*(Tcl_Obj **)ptr); + } + *(Tcl_Obj **)ptr = arg; + } + } else if (nullValue) { *(int *)ptr = INT_MIN; - } else if (Tk_GetPixels(interp, tkwin, value, (int *)ptr) + } else if (Tk_GetPixelsFromObj(interp, tkwin, arg, (int *)ptr) != TCL_OK) { return TCL_ERROR; } @@ -541,7 +560,7 @@ DoConfig( return TCL_ERROR; } } - *((Tk_Window *) ptr) = tkwin2; + *((Tk_Window *)ptr) = tkwin2; break; } case TK_CONFIG_CUSTOM: @@ -772,6 +791,12 @@ FormatConfigValue( } ptr = (char *)widgRec + specPtr->offset; result = ""; + if (specPtr->specFlags & TK_CONFIG_OBJS) { + if (*(Tcl_Obj **)ptr != NULL) { + result = Tcl_GetString(*(Tcl_Obj **)ptr); + } + return result; + } switch (specPtr->type) { case TK_CONFIG_BOOLEAN: if (*((int *)ptr) == 0) { @@ -789,7 +814,7 @@ FormatConfigValue( result = buffer; break; case TK_CONFIG_STRING: - result = (*(char **)ptr); + result = *(char **)ptr; if (result == NULL) { result = ""; } @@ -997,40 +1022,45 @@ Tk_FreeOptions( continue; } ptr = (char *)widgRec + specPtr->offset; + if ((specPtr->specFlags & TK_CONFIG_OBJS) && (*(Tcl_Obj **)ptr != NULL)) { + Tcl_DecrRefCount(*(Tcl_Obj **)ptr); + *(Tcl_Obj **)ptr = NULL; + continue; + } switch (specPtr->type) { case TK_CONFIG_STRING: - if (*((char **) ptr) != NULL) { - ckfree(*((char **) ptr)); - *((char **) ptr) = NULL; + 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; + 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; + 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; + 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; + 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) != NULL) { - Tk_FreeCursor(display, *((Tk_Cursor *) ptr)); - *((Tk_Cursor *) ptr) = NULL; + if (*((Tk_Cursor *)ptr) != NULL) { + Tk_FreeCursor(display, *((Tk_Cursor *)ptr)); + *((Tk_Cursor *)ptr) = NULL; } } } |
