summaryrefslogtreecommitdiffstats
path: root/generic/tkOldConfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkOldConfig.c')
-rw-r--r--generic/tkOldConfig.c184
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;
}
}
}