aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlecoanet2004-04-30 14:56:50 +0000
committerlecoanet2004-04-30 14:56:50 +0000
commita42310190047400463d564c39576392fadfe01f3 (patch)
tree56e973071d49ca1547c7fd8eee1f8a62f14c4ebf
parent30e013bf3cde25d0d518c3e9263c4e818a6b2e61 (diff)
downloadtkzinc-a42310190047400463d564c39576392fadfe01f3.zip
tkzinc-a42310190047400463d564c39576392fadfe01f3.tar.gz
tkzinc-a42310190047400463d564c39576392fadfe01f3.tar.bz2
tkzinc-a42310190047400463d564c39576392fadfe01f3.tar.xz
Introduced a new Tcl_ObjType "attribute" that is able to
cache the attribute look up from one invocation to the other. This could speed up slighty the code. Available only in Tcl.
-rw-r--r--generic/Item.c1535
1 files changed, 797 insertions, 738 deletions
diff --git a/generic/Item.c b/generic/Item.c
index 64a4368..a78360e 100644
--- a/generic/Item.c
+++ b/generic/Item.c
@@ -102,6 +102,26 @@ static char *attribute_type_strings[] = {
};
+#ifndef PTK
+static int SetAttrFromAny _ANSI_ARGS_((Tcl_Interp *interp, Tcl_Obj *obj));
+
+/*
+ * The structure below defines an object type that is used to cache the
+ * result of looking up an attribute name. If an object has this type, then
+ * its internalPtr1 field points to the attr_desc table in which it was looked up,
+ * and the internalPtr2 field points to the entry that matched.
+ */
+
+Tcl_ObjType ZnAttrObjType = {
+ "attribute", /* name */
+ (Tcl_FreeInternalRepProc *) NULL, /* freeIntRepProc */
+ (Tcl_DupInternalRepProc *) NULL, /* dupIntRepProc */
+ (Tcl_UpdateStringProc *) NULL, /* updateStringProc */
+ SetAttrFromAny /* setFromAnyProc */
+};
+#endif
+
+
/*
**********************************************************************************
*
@@ -110,8 +130,8 @@ static char *attribute_type_strings[] = {
**********************************************************************************
*/
static void Invalidate(ZnItem item, int reason);
-static void AttributeToObj(ZnWInfo *wi, void *record, ZnAttrConfig *desc,
- char *buffer, Tcl_Obj *result);
+static void AttributeToObj(Tcl_Interp *interp, void *record, ZnAttrConfig *desc,
+ Tcl_Obj *result);
@@ -152,6 +172,81 @@ InitAttrDesc(ZnAttrConfig *attr_desc)
}
}
+/*
+ *----------------------------------------------------------------------
+ *
+ * SetAttrFromAny --
+ *
+ * This procedure is called to convert a Tcl object to an attribute
+ * descriptor. This is only possible if given a attr_desc table, so
+ * this method always returns an error.
+ *
+ *----------------------------------------------------------------------
+ */
+#ifndef PTK
+static int
+SetAttrFromAny(Tcl_Interp *interp,
+ Tcl_Obj *obj __unused)
+{
+ Tcl_AppendToObj(Tcl_GetObjResult(interp),
+ "can't convert value to attribute except via GetAttrDesc",
+ -1);
+ return TCL_ERROR;
+}
+#endif
+
+
+/*
+ **********************************************************************************
+ *
+ * GetAttrDesc --
+ *
+ **********************************************************************************
+ */
+static ZnAttrConfig *
+GetAttrDesc(Tcl_Interp *interp,
+ Tcl_Obj *arg,
+ ZnAttrConfig *desc_table)
+{
+ Tk_Uid attr_uid;
+ ZnAttrConfig *desc;
+
+#ifndef PTK
+ if (arg->typePtr == &ZnAttrObjType) {
+ if (arg->internalRep.twoPtrValue.ptr1 == (void *) desc_table) {
+ return (ZnAttrConfig *) arg->internalRep.twoPtrValue.ptr2;
+ }
+ }
+#endif
+
+ /*
+ * Answer not cached, look it up.
+ */
+ attr_uid = Tk_GetUid(Tcl_GetString(arg));
+ desc = desc_table;
+
+ while (True) {
+ if (desc->type == ZN_CONFIG_END) {
+ Tcl_AppendResult(interp, "unknown attribute \"", attr_uid, "\"", NULL);
+ return NULL;
+ }
+ else if (attr_uid == desc->uid) {
+#ifndef PTK
+ if ((arg->typePtr != NULL) && (arg->typePtr->freeIntRepProc != NULL)) {
+ arg->typePtr->freeIntRepProc(arg);
+ }
+ arg->internalRep.twoPtrValue.ptr1 = (void *) desc_table;
+ arg->internalRep.twoPtrValue.ptr2 = (void *) desc;
+ arg->typePtr = &ZnAttrObjType;
+#endif
+ return desc;
+ }
+ else {
+ desc++;
+ }
+ }
+}
+
/*
**********************************************************************************
@@ -161,51 +256,38 @@ InitAttrDesc(ZnAttrConfig *attr_desc)
**********************************************************************************
*/
int
-ZnAttributesInfo(ZnWInfo *wi,
+ZnAttributesInfo(Tcl_Interp *interp,
void *record,
- ZnAttrConfig *desc,
+ ZnAttrConfig *desc_table,
int argc,
Tcl_Obj *CONST args[])
{
- Tk_Uid attr_uid = NULL;
Tcl_Obj *l, *entries[5];
- char buffer[256];
if (argc == 1) {
- attr_uid = Tk_GetUid(Tcl_GetString(args[0]));
-
- while (True) {
- if (desc->type == ZN_CONFIG_END) {
- Tcl_AppendResult(wi->interp, "unknown attribute \"",
- Tcl_GetString(args[0]), "\"", NULL);
- return TCL_ERROR;
- }
- else if (attr_uid == desc->uid) {
- break;
- }
- else {
- desc++;
- }
+ ZnAttrConfig *desc = GetAttrDesc(interp, args[0], desc_table);
+ if (!desc) {
+ return TCL_ERROR;
}
entries[0] = Tcl_NewStringObj(desc->name, -1);
entries[1] = Tcl_NewStringObj(attribute_type_strings[desc->type], -1);
entries[2] = Tcl_NewBooleanObj(desc->read_only ? 1 : 0);
entries[3] = Tcl_NewStringObj("", -1);
entries[4] = Tcl_NewStringObj("", -1);
- AttributeToObj(wi, record, desc, buffer, entries[4]);
- Tcl_SetObjResult(wi->interp, Tcl_NewListObj(5, entries));
+ AttributeToObj(interp, record, desc, entries[4]);
+ Tcl_SetObjResult(interp, Tcl_NewListObj(5, entries));
}
else {
- l = Tcl_GetObjResult(wi->interp);
- while (desc->type != ZN_CONFIG_END) {
- entries[0] = Tcl_NewStringObj(desc->name, -1);
- entries[1] = Tcl_NewStringObj(attribute_type_strings[desc->type], -1);
- entries[2] = Tcl_NewBooleanObj(desc->read_only ? 1 : 0);
+ l = Tcl_GetObjResult(interp);
+ while (desc_table->type != ZN_CONFIG_END) {
+ entries[0] = Tcl_NewStringObj(desc_table->name, -1);
+ entries[1] = Tcl_NewStringObj(attribute_type_strings[desc_table->type], -1);
+ entries[2] = Tcl_NewBooleanObj(desc_table->read_only ? 1 : 0);
entries[3] = Tcl_NewStringObj("", -1);
entries[4] = Tcl_NewStringObj("", -1);
- AttributeToObj(wi, record, desc, buffer, entries[4]);
- Tcl_ListObjAppendElement(wi->interp, l, Tcl_NewListObj(5, entries));
- desc++;
+ AttributeToObj(interp, record, desc_table, entries[4]);
+ Tcl_ListObjAppendElement(interp, l, Tcl_NewListObj(5, entries));
+ desc_table++;
}
}
@@ -224,762 +306,751 @@ int
ZnConfigureAttributes(ZnWInfo *wi,
ZnItem item,
void *record,
- ZnAttrConfig *attr_desc,
+ ZnAttrConfig *desc_table,
int argc,
Tcl_Obj *CONST args[],
int *flags)
{
int i;
- Tk_Uid attr_uid;
ZnAttrConfig *desc;
ZnPtr valp;
char *str;
for (i = 0; i < argc; i += 2) {
- attr_uid = Tk_GetUid(Tcl_GetString(args[i]));
-
- desc = attr_desc;
- while (True) {
- if (desc->type == ZN_CONFIG_END) {
- Tcl_AppendResult(wi->interp, "unknown attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- else if (attr_uid == desc->uid) {
- if (desc->read_only) {
- Tcl_AppendResult(wi->interp, "attribute \"",
- Tcl_GetString(args[i]), "\" can only be read", NULL);
- return TCL_ERROR;
+ desc = GetAttrDesc(wi->interp, args[i], desc_table);
+ if (!desc) {
+ return TCL_ERROR;
+ }
+ else if (desc->read_only) {
+ Tcl_AppendResult(wi->interp, "attribute \"",
+ Tcl_GetString(args[i]), "\" can only be read", NULL);
+ return TCL_ERROR;
+ }
+
+ valp = ((char *) record) + desc->offset;
+ /*printf("record <0x%X>, valp <0x%X>, offset %d\n", record, valp, desc->offset);*/
+ switch (desc->type) {
+ case ZN_CONFIG_GRADIENT:
+ {
+ ZnGradient *g;
+ Tk_Uid new_name = Tk_GetUid(Tcl_GetString(args[i+1]));
+ char *name = NULL;
+ if (*((ZnGradient **) valp)) {
+ name = ZnNameOfGradient(*((ZnGradient **) valp));
}
- valp = ((char *) record) + desc->offset;
- /*printf("record <0x%X>, valp <0x%X>, offset %d\n", record, valp, desc->offset);*/
- switch (desc->type) {
- case ZN_CONFIG_GRADIENT:
- {
- ZnGradient *g;
- Tk_Uid new_name = Tk_GetUid(Tcl_GetString(args[i+1]));
- char *name = NULL;
- if (*((ZnGradient **) valp)) {
- name = ZnNameOfGradient(*((ZnGradient **) valp));
- }
- if (name != new_name) {
- g = ZnGetGradient(wi->interp, wi->win, new_name);
- if (!g) {
- Tcl_AppendResult(wi->interp,
- " gradient expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (*((ZnGradient **) valp)) {
- ZnFreeGradient(*((ZnGradient **) valp));
- }
- *((ZnGradient **) valp) = g;
- *flags |= desc->flags;
- }
- break;
+ if (name != new_name) {
+ g = ZnGetGradient(wi->interp, wi->win, new_name);
+ if (!g) {
+ Tcl_AppendResult(wi->interp,
+ " gradient expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
}
- case ZN_CONFIG_GRADIENT_LIST:
- {
- ZnList new_grad_list = NULL;
- ZnGradient **grads;
- unsigned int num_grads, j, k;
- Tcl_Obj **elems;
+ if (*((ZnGradient **) valp)) {
+ ZnFreeGradient(*((ZnGradient **) valp));
+ }
+ *((ZnGradient **) valp) = g;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_GRADIENT_LIST:
+ {
+ ZnList new_grad_list = NULL;
+ ZnGradient **grads;
+ unsigned int num_grads, j, k;
+ Tcl_Obj **elems;
- if (Tcl_ListObjGetElements(wi->interp, args[i+1],
- &num_grads, &elems) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp,
- " gradient list expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (num_grads) {
- new_grad_list = ZnListNew(num_grads, sizeof(ZnGradient *));
- ZnListAssertSize(new_grad_list, num_grads);
- grads = ZnListArray(new_grad_list);
- for (j = 0; j < num_grads; j++) {
- str = Tcl_GetString(elems[j]);
- if (!*str) {
- if (j == 0) {
- goto grads_err;
- }
- grads[j] = grads[j-1];
- }
- else {
- grads[j] = ZnGetGradient(wi->interp, wi->win, str);
- }
- if (!grads[j]) {
- grads_err:
- Tcl_AppendResult(wi->interp, " invalid gradient \"", str,
- "\" in gradient list", NULL);
- for (k = 0; k < j; k++) {
- ZnFreeGradient(grads[k]);
- }
- ZnListFree(new_grad_list);
- return TCL_ERROR;
- }
- }
- }
- if (*((ZnList *) valp)) {
- num_grads = ZnListSize(*((ZnList *) valp));
- grads = ZnListArray(*((ZnList *) valp));
- for (j = 0; j < num_grads; j++) {
- if (grads[j]) {
- ZnFreeGradient(grads[j]);
- }
+ if (Tcl_ListObjGetElements(wi->interp, args[i+1],
+ &num_grads, &elems) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp,
+ " gradient list expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (num_grads) {
+ new_grad_list = ZnListNew(num_grads, sizeof(ZnGradient *));
+ ZnListAssertSize(new_grad_list, num_grads);
+ grads = ZnListArray(new_grad_list);
+ for (j = 0; j < num_grads; j++) {
+ str = Tcl_GetString(elems[j]);
+ if (!*str) {
+ if (j == 0) {
+ goto grads_err;
}
- ZnListFree(*((ZnList *) valp));
- *((ZnList *) valp) = new_grad_list;
- *flags |= desc->flags;
+ grads[j] = grads[j-1];
}
else {
- if (new_grad_list) {
- *((ZnList *) valp) = new_grad_list;
- *flags |= desc->flags;
+ grads[j] = ZnGetGradient(wi->interp, wi->win, str);
+ }
+ if (!grads[j]) {
+ grads_err:
+ Tcl_AppendResult(wi->interp, " invalid gradient \"", str,
+ "\" in gradient list", NULL);
+ for (k = 0; k < j; k++) {
+ ZnFreeGradient(grads[k]);
}
- }
- break;
- }
- case ZN_CONFIG_BOOL:
- {
- int b;
- if (Tcl_GetBooleanFromObj(wi->interp, args[i+1], &b) != TCL_OK) {
- Tcl_AppendResult(wi->interp, " boolean expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
+ ZnListFree(new_grad_list);
return TCL_ERROR;
}
- if (b ^ (ISSET(*((unsigned short *) valp), desc->bool_bit) != 0)) {
- ASSIGN(*((unsigned short *) valp), desc->bool_bit, b);
- *flags |= desc->flags;
+ }
+ }
+ if (*((ZnList *) valp)) {
+ num_grads = ZnListSize(*((ZnList *) valp));
+ grads = ZnListArray(*((ZnList *) valp));
+ for (j = 0; j < num_grads; j++) {
+ if (grads[j]) {
+ ZnFreeGradient(grads[j]);
}
- break;
}
- case ZN_CONFIG_IMAGE:
- case ZN_CONFIG_BITMAP:
- {
- ZnImage image = ZnUnspecifiedImage;
- ZnBool is_bmap = True;
- char *name = "";
-
- if (*((ZnImage *) valp) != ZnUnspecifiedImage) {
- name = ZnNameOfImage(*((ZnImage *) valp));
+ ZnListFree(*((ZnList *) valp));
+ *((ZnList *) valp) = new_grad_list;
+ *flags |= desc->flags;
+ }
+ else {
+ if (new_grad_list) {
+ *((ZnList *) valp) = new_grad_list;
+ *flags |= desc->flags;
+ }
+ }
+ break;
+ }
+ case ZN_CONFIG_BOOL:
+ {
+ int b;
+ if (Tcl_GetBooleanFromObj(wi->interp, args[i+1], &b) != TCL_OK) {
+ Tcl_AppendResult(wi->interp, " boolean expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (b ^ (ISSET(*((unsigned short *) valp), desc->bool_bit) != 0)) {
+ ASSIGN(*((unsigned short *) valp), desc->bool_bit, b);
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_IMAGE:
+ case ZN_CONFIG_BITMAP:
+ {
+ ZnImage image = ZnUnspecifiedImage;
+ ZnBool is_bmap = True;
+ char *name = "";
+
+ if (*((ZnImage *) valp) != ZnUnspecifiedImage) {
+ name = ZnNameOfImage(*((ZnImage *) valp));
+ }
+ str = Tcl_GetString(args[i+1]);
+ if (strcmp(name, str) != 0) {
+ if (strlen(str) != 0) {
+ if (desc->type == ZN_CONFIG_IMAGE) {
+ image = ZnGetImage(wi, str, ZnUpdateItemImage, record);
+ if (image == ZnUnspecifiedImage) {
+ Tcl_AppendResult(wi->interp, " image expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
}
- str = Tcl_GetString(args[i+1]);
- if (strcmp(name, str) != 0) {
- if (strlen(str) != 0) {
- if (desc->type == ZN_CONFIG_IMAGE) {
- image = ZnGetImage(wi, str, ZnUpdateItemImage, record);
- if (image == ZnUnspecifiedImage) {
- Tcl_AppendResult(wi->interp, " image expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- }
- else {
- image = ZnGetImage(wi, str, NULL, NULL);
- if ((image == ZnUnspecifiedImage) ||
- (!(is_bmap = ZnImageIsBitmap(image)))) {
- if (!is_bmap) {
- ZnFreeImage(image, NULL, NULL);
- }
- Tcl_AppendResult(wi->interp, " bitmap expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
+ else {
+ image = ZnGetImage(wi, str, NULL, NULL);
+ if ((image == ZnUnspecifiedImage) ||
+ (!(is_bmap = ZnImageIsBitmap(image)))) {
+ if (!is_bmap) {
+ ZnFreeImage(image, NULL, NULL);
}
+ Tcl_AppendResult(wi->interp, " bitmap expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
}
- if (*((ZnImage *) valp) != ZnUnspecifiedImage) {
- ZnFreeImage(*((ZnImage *) valp), ZnUpdateItemImage, record);
- }
- *((ZnImage *) valp) = image;
- *flags |= desc->flags;
}
- break;
}
- case ZN_CONFIG_BITMAP_LIST:
- {
- ZnList new_pat_list = NULL;
- ZnImage *pats;
- unsigned int num_pats, j, k;
- Tcl_Obj **elems;
- ZnBool is_bmap = True;
-
- if (Tcl_ListObjGetElements(wi->interp, args[i+1],
- &num_pats, &elems) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp,
- " pattern list expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (num_pats) {
- new_pat_list = ZnListNew(num_pats, sizeof(Pixmap));
- ZnListAssertSize(new_pat_list, num_pats);
- pats = ZnListArray(new_pat_list);
- for (j = 0; j < num_pats; j++) {
- str = Tcl_GetString(elems[j]);
- if (strlen(str) != 0) {
- pats[j] = ZnGetImage(wi, str, NULL, NULL);
- if ((pats[j] == ZnUnspecifiedImage) ||
+ if (*((ZnImage *) valp) != ZnUnspecifiedImage) {
+ ZnFreeImage(*((ZnImage *) valp), ZnUpdateItemImage, record);
+ }
+ *((ZnImage *) valp) = image;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_BITMAP_LIST:
+ {
+ ZnList new_pat_list = NULL;
+ ZnImage *pats;
+ unsigned int num_pats, j, k;
+ Tcl_Obj **elems;
+ ZnBool is_bmap = True;
+
+ if (Tcl_ListObjGetElements(wi->interp, args[i+1],
+ &num_pats, &elems) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp,
+ " pattern list expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (num_pats) {
+ new_pat_list = ZnListNew(num_pats, sizeof(Pixmap));
+ ZnListAssertSize(new_pat_list, num_pats);
+ pats = ZnListArray(new_pat_list);
+ for (j = 0; j < num_pats; j++) {
+ str = Tcl_GetString(elems[j]);
+ if (strlen(str) != 0) {
+ pats[j] = ZnGetImage(wi, str, NULL, NULL);
+ if ((pats[j] == ZnUnspecifiedImage) ||
!(is_bmap = ZnImageIsBitmap(pats[j]))) {
- if (!is_bmap) {
- ZnFreeImage(pats[j], NULL, NULL);
- }
- for (k = 0; k < j; k++) {
- ZnFreeImage(pats[k], NULL, NULL);
- }
- ZnListFree(new_pat_list);
- Tcl_AppendResult(wi->interp, " unknown pattern \"", str,
- "\" in pattern list", NULL);
- return TCL_ERROR;
- }
- }
- else {
- pats[j] = ZnUnspecifiedImage;
- }
- }
- }
- if (*((ZnList *) valp)) {
- num_pats = ZnListSize(*((ZnList *) valp));
- pats = ZnListArray(*((ZnList *) valp));
- for (j = 0; j < num_pats; j++) {
- if (pats[j] != ZnUnspecifiedImage) {
+ if (!is_bmap) {
ZnFreeImage(pats[j], NULL, NULL);
}
+ for (k = 0; k < j; k++) {
+ ZnFreeImage(pats[k], NULL, NULL);
+ }
+ ZnListFree(new_pat_list);
+ Tcl_AppendResult(wi->interp, " unknown pattern \"", str,
+ "\" in pattern list", NULL);
+ return TCL_ERROR;
}
- ZnListFree(*((ZnList *) valp));
- *((ZnList *) valp) = new_pat_list;
- *flags |= desc->flags;
}
else {
- if (new_pat_list) {
- *((ZnList *) valp) = new_pat_list;
- *flags |= desc->flags;
- }
+ pats[j] = ZnUnspecifiedImage;
}
- break;
}
- case ZN_CONFIG_TAG_LIST:
- {
- int num_tags, j;
- Tcl_Obj **elems;
-
- if (Tcl_ListObjGetElements(wi->interp, args[i+1],
- &num_tags, &elems) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp,
- " tag list expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (*((ZnList *) valp)) {
- ZnITEM.FreeTags(item);
- *flags |= desc->flags;
- }
- if (num_tags) {
- for (j = 0; j < num_tags; j++) {
- ZnITEM.AddTag(item, Tk_GetUid(Tcl_GetString(elems[j])));
- }
- *flags |= desc->flags;
+ }
+ if (*((ZnList *) valp)) {
+ num_pats = ZnListSize(*((ZnList *) valp));
+ pats = ZnListArray(*((ZnList *) valp));
+ for (j = 0; j < num_pats; j++) {
+ if (pats[j] != ZnUnspecifiedImage) {
+ ZnFreeImage(pats[j], NULL, NULL);
}
- break;
}
- case ZN_CONFIG_STRING:
- case ZN_CONFIG_MAP_INFO:
- {
- char *text = NULL;
- str = Tcl_GetString(args[i+1]);
- if (!*((char **) valp) || strcmp(str, *((char **) valp)) != 0) {
- if (strlen(str)) {
- text = (char *) ZnMalloc(strlen(str)+1);
- strcpy(text, str);
- }
- if (*((char **) valp)) {
- ZnFree(*((char **) valp));
- }
- *((char **) valp) = text;
- *flags |= desc->flags;
- }
- break;
+ ZnListFree(*((ZnList *) valp));
+ *((ZnList *) valp) = new_pat_list;
+ *flags |= desc->flags;
+ }
+ else {
+ if (new_pat_list) {
+ *((ZnList *) valp) = new_pat_list;
+ *flags |= desc->flags;
}
- case ZN_CONFIG_FONT:
- {
- Tk_Font font;
- Tk_Uid name = "";
- if (*((Tk_Font *) valp)) {
- name = Tk_NameOfFont(*((Tk_Font *) valp));
- }
- str = Tcl_GetString(args[i+1]);
- if (strcmp(name, str) != 0) {
- font = Tk_GetFont(wi->interp, wi->win, str);
- if (!font) {
- Tcl_AppendResult(wi->interp, " font expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (*((Tk_Font *) valp)) {
- Tk_FreeFont(*((Tk_Font *) valp));
- }
- *((Tk_Font *) valp) = font;
- *flags |= desc->flags;
- }
- break;
+ }
+ break;
+ }
+ case ZN_CONFIG_TAG_LIST:
+ {
+ int num_tags, j;
+ Tcl_Obj **elems;
+
+ if (Tcl_ListObjGetElements(wi->interp, args[i+1],
+ &num_tags, &elems) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp,
+ " tag list expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (*((ZnList *) valp)) {
+ ZnITEM.FreeTags(item);
+ *flags |= desc->flags;
+ }
+ if (num_tags) {
+ for (j = 0; j < num_tags; j++) {
+ ZnITEM.AddTag(item, Tk_GetUid(Tcl_GetString(elems[j])));
}
- case ZN_CONFIG_EDGE_LIST:
- {
- ZnBorder border;
-
- if (ZnGetBorder(wi, args[i+1], &border) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " edge list expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (border != *((ZnBorder *) valp)) {
- *((ZnBorder *) valp) = border;
- *flags |= desc->flags;
- }
- break;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_STRING:
+ case ZN_CONFIG_MAP_INFO:
+ {
+ char *text = NULL;
+ str = Tcl_GetString(args[i+1]);
+ if (!*((char **) valp) || strcmp(str, *((char **) valp)) != 0) {
+ if (strlen(str)) {
+ text = (char *) ZnMalloc(strlen(str)+1);
+ strcpy(text, str);
+ }
+ if (*((char **) valp)) {
+ ZnFree(*((char **) valp));
+ }
+ *((char **) valp) = text;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_FONT:
+ {
+ Tk_Font font;
+ Tk_Uid name = "";
+ if (*((Tk_Font *) valp)) {
+ name = Tk_NameOfFont(*((Tk_Font *) valp));
+ }
+ str = Tcl_GetString(args[i+1]);
+ if (strcmp(name, str) != 0) {
+ font = Tk_GetFont(wi->interp, wi->win, str);
+ if (!font) {
+ Tcl_AppendResult(wi->interp, " font expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (*((Tk_Font *) valp)) {
+ Tk_FreeFont(*((Tk_Font *) valp));
}
- case ZN_CONFIG_LINE_SHAPE:
- {
- ZnLineShape line_shape;
+ *((Tk_Font *) valp) = font;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_EDGE_LIST:
+ {
+ ZnBorder border;
- if (ZnGetLineShape(wi, Tcl_GetString(args[i+1]), &line_shape) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " line shape expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (line_shape != *((ZnLineShape *) valp)) {
- *((ZnLineShape *) valp) = line_shape;
- *flags |= desc->flags;
- }
- break;
+ if (ZnGetBorder(wi, args[i+1], &border) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " edge list expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (border != *((ZnBorder *) valp)) {
+ *((ZnBorder *) valp) = border;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_LINE_SHAPE:
+ {
+ ZnLineShape line_shape;
+
+ if (ZnGetLineShape(wi, Tcl_GetString(args[i+1]), &line_shape) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " line shape expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (line_shape != *((ZnLineShape *) valp)) {
+ *((ZnLineShape *) valp) = line_shape;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_LINE_STYLE:
+ {
+ ZnLineStyle line_style;
+
+ if (ZnGetLineStyle(wi, Tcl_GetString(args[i+1]), &line_style) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " line style expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (line_style != *((ZnLineStyle *) valp)) {
+ *((ZnLineStyle *) valp) = line_style;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_LINE_END:
+ {
+ ZnLineEnd line_end = NULL;
+ str = Tcl_GetString(args[i+1]);
+ if (strlen(str) != 0) {
+ line_end = ZnLineEndCreate(wi->interp, str);
+ if (line_end == NULL) {
+ return TCL_ERROR;
+ }
+ }
+ if (*((ZnLineEnd *) valp) != NULL) {
+ ZnLineEndDelete(*((ZnLineEnd *) valp));
+ *((ZnLineEnd *) valp) = line_end;
+ *flags |= desc->flags;
+ }
+ else {
+ if (line_end != NULL) {
+ *((ZnLineEnd *) valp) = line_end;
+ *flags |= desc->flags;
}
- case ZN_CONFIG_LINE_STYLE:
- {
- ZnLineStyle line_style;
+ }
+ break;
+ }
+ case ZN_CONFIG_RELIEF:
+ {
+ ZnReliefStyle relief;
+ if (ZnGetRelief(wi, Tcl_GetString(args[i+1]), &relief) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " relief expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (relief != *((ZnReliefStyle *) valp)) {
+ /*printf("valp <0x%X>, flags <0x%X>, relief %d\n", valp, flags, relief);*/
+ *((ZnReliefStyle *) valp) = relief;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_JOIN_STYLE:
+ {
+ int join;
+ if (Tk_GetJoinStyle(wi->interp, Tcl_GetString(args[i+1]), &join) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " join expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (join != *((int *) valp)) {
+ *((int *) valp) = join;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_CAP_STYLE:
+ {
+ int cap;
+ if (Tk_GetCapStyle(wi->interp, Tcl_GetString(args[i+1]), &cap) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " cap expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (cap != *((int *) valp)) {
+ *((int *) valp) = cap;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_POINT:
+ {
+ ZnPoint point;
+ int largc;
+ Tcl_Obj **largv;
+ double d;
+
+ if ((Tcl_ListObjGetElements(wi->interp, args[i+1],
+ &largc, &largv) == TCL_ERROR) ||
+ (largc != 2)) {
+ point_error:
+ Tcl_AppendResult(wi->interp, " position expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (Tcl_GetDoubleFromObj(wi->interp, largv[0], &d) == TCL_ERROR) {
+ goto point_error;
+ }
+ point.x = d;
+ if (Tcl_GetDoubleFromObj(wi->interp, largv[1], &d) == TCL_ERROR) {
+ goto point_error;
+ }
+ point.y = d;
+ if ((point.x != ((ZnPoint *) valp)->x) ||
+ (point.y != ((ZnPoint *) valp)->y)) {
+ *((ZnPoint *) valp) = point;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_DIM:
+ {
+ ZnDim dim;
+ if (Tcl_GetDoubleFromObj(wi->interp, args[i+1], &dim) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " dimension expected for attribute \"",
+ Tcl_GetString(args[i+1]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (dim != *((ZnDim *) valp)) {
+ *((ZnDim *) valp) = dim;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_PRI:
+ {
+ int pri;
+ if (Tcl_GetIntFromObj(wi->interp, args[i+1], &pri) == TCL_ERROR) {
+ return TCL_ERROR;
+ }
+ if (pri < 0) {
+ Tcl_AppendResult(wi->interp, " priority must be a positive integer \"",
+ Tcl_GetString(args[i+1]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (pri != *((unsigned short *) valp)) {
+ *((unsigned short *) valp) = pri;
+ ZnITEM.UpdateItemPriority(item, ZN_NO_ITEM, True);
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_ITEM:
+ /*
+ * Can be an item id or a tag. In this last case
+ * consider only the first item (unspecified order)
+ * associated with the tag.
+ */
+ {
+ ZnItem item2;
+ int result;
+ ZnTagSearch *search_var = NULL;
- if (ZnGetLineStyle(wi, Tcl_GetString(args[i+1]), &line_style) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " line style expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (line_style != *((ZnLineStyle *) valp)) {
- *((ZnLineStyle *) valp) = line_style;
- *flags |= desc->flags;
- }
- break;
+ if (strlen(Tcl_GetString(args[i+1])) == 0) {
+ item2 = ZN_NO_ITEM;
+ }
+ else {
+ result = ZnItemWithTagOrId(wi, args[i+1], &item2, &search_var);
+ ZnTagSearchDestroy(search_var);
+ if ((result == TCL_ERROR) || (item2 == ZN_NO_ITEM)) {
+ Tcl_AppendResult(wi->interp, " unknown item \"",
+ Tcl_GetString(args[i+1]), "\"", NULL);
+ return TCL_ERROR;
}
- case ZN_CONFIG_LINE_END:
- {
- ZnLineEnd line_end = NULL;
- str = Tcl_GetString(args[i+1]);
- if (strlen(str) != 0) {
- line_end = ZnLineEndCreate(wi->interp, str);
- if (line_end == NULL) {
+ }
+ if (item2 != *((ZnItem *) valp)) {
+ *((ZnItem *) valp) = item2;
+ *flags |= desc->flags;
+ }
+ }
+ break;
+ case ZN_CONFIG_WINDOW:
+ {
+ Tk_Window win, ancestor, parent;
+ str = Tcl_GetString(args[i+1]);
+ if (strlen(str) == 0) {
+ win = NULL;
+ }
+ else {
+ win = Tk_NameToWindow(wi->interp, str, wi->win);
+ if (win == NULL) {
+ return TCL_ERROR;
+ }
+ else {
+ /*
+ * Make sure that the zinc widget is either the parent of the
+ * window associated with the item or a descendant of that
+ * parent. Also, don't allow a toplevel window or the widget
+ * itself to be managed.
+ */
+ parent = Tk_Parent(win);
+ for (ancestor = wi->win; ; ancestor = Tk_Parent(ancestor)) {
+ if (ancestor == parent) {
+ break;
+ }
+ if (((Tk_FakeWin *) (ancestor))->flags & TK_TOP_LEVEL) {
+ badWindow:
+ Tcl_AppendResult(wi->interp, "can't use ",
+ Tk_PathName(win),
+ " in a window item of this zinc widget",
+ (char *) NULL);
+ win = NULL;
return TCL_ERROR;
}
}
- if (*((ZnLineEnd *) valp) != NULL) {
- ZnLineEndDelete(*((ZnLineEnd *) valp));
- *((ZnLineEnd *) valp) = line_end;
- *flags |= desc->flags;
- }
- else {
- if (line_end != NULL) {
- *((ZnLineEnd *) valp) = line_end;
- *flags |= desc->flags;
- }
+ if (((Tk_FakeWin *) (win))->flags & TK_TOP_LEVEL) {
+ goto badWindow;
}
- break;
- }
- case ZN_CONFIG_RELIEF:
- {
- ZnReliefStyle relief;
- if (ZnGetRelief(wi, Tcl_GetString(args[i+1]), &relief) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " relief expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
+ if (win == wi->win) {
+ goto badWindow;
}
- if (relief != *((ZnReliefStyle *) valp)) {
- /*printf("valp <0x%X>, flags <0x%X>, relief %d\n", valp, flags, relief);*/
- *((ZnReliefStyle *) valp) = relief;
+ if (win != *((Tk_Window *) valp)) {
+ *((Tk_Window *) valp) = win;
*flags |= desc->flags;
}
- break;
}
- case ZN_CONFIG_JOIN_STYLE:
- {
- int join;
- if (Tk_GetJoinStyle(wi->interp, Tcl_GetString(args[i+1]), &join) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " join expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (join != *((int *) valp)) {
- *((int *) valp) = join;
- *flags |= desc->flags;
- }
- break;
+ }
+ }
+ break;
+ case ZN_CONFIG_CHAR:
+ case ZN_CONFIG_UCHAR:
+ case ZN_CONFIG_ALPHA:
+ {
+ int integer;
+ if (Tcl_GetIntFromObj(wi->interp, args[i+1], &integer) == TCL_ERROR) {
+ return TCL_ERROR;
+ }
+ switch (desc->type) {
+ case ZN_CONFIG_UCHAR:
+ if (integer < 0) {
+ integer = 0;
}
- case ZN_CONFIG_CAP_STYLE:
- {
- int cap;
- if (Tk_GetCapStyle(wi->interp, Tcl_GetString(args[i+1]), &cap) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " cap expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (cap != *((int *) valp)) {
- *((int *) valp) = cap;
- *flags |= desc->flags;
- }
- break;
+ case ZN_CONFIG_ALPHA:
+ if (integer < 0) {
+ integer = 0;
}
- case ZN_CONFIG_POINT:
- {
- ZnPoint point;
- int largc;
- Tcl_Obj **largv;
- double d;
-
- if ((Tcl_ListObjGetElements(wi->interp, args[i+1],
- &largc, &largv) == TCL_ERROR) ||
- (largc != 2)) {
- point_error:
- Tcl_AppendResult(wi->interp, " position expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (Tcl_GetDoubleFromObj(wi->interp, largv[0], &d) == TCL_ERROR) {
- goto point_error;
- }
- point.x = d;
- if (Tcl_GetDoubleFromObj(wi->interp, largv[1], &d) == TCL_ERROR) {
- goto point_error;
- }
- point.y = d;
- if ((point.x != ((ZnPoint *) valp)->x) ||
- (point.y != ((ZnPoint *) valp)->y)) {
- *((ZnPoint *) valp) = point;
- *flags |= desc->flags;
- }
- break;
+ if (integer > 100) {
+ integer = 100;
}
- case ZN_CONFIG_DIM:
- {
- ZnDim dim;
- if (Tcl_GetDoubleFromObj(wi->interp, args[i+1], &dim) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " dimension expected for attribute \"",
- Tcl_GetString(args[i+1]), "\"", NULL);
- return TCL_ERROR;
- }
- if (dim != *((ZnDim *) valp)) {
- *((ZnDim *) valp) = dim;
- *flags |= desc->flags;
- }
- break;
+ break;
+ }
+ if (integer != *((char *) valp)) {
+ *((char *) valp) = integer;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_SHORT:
+ case ZN_CONFIG_USHORT:
+ {
+ int integer;
+ if (Tcl_GetIntFromObj(wi->interp, args[i+1], &integer) == TCL_ERROR) {
+ return TCL_ERROR;
+ }
+ if (desc->type == ZN_CONFIG_SHORT) {
+ if (integer < SHRT_MIN) {
+ integer = SHRT_MIN;
}
- case ZN_CONFIG_PRI:
- {
- int pri;
- if (Tcl_GetIntFromObj(wi->interp, args[i+1], &pri) == TCL_ERROR) {
- return TCL_ERROR;
- }
- if (pri < 0) {
- Tcl_AppendResult(wi->interp, " priority must be a positive integer \"",
- Tcl_GetString(args[i+1]), "\"", NULL);
- return TCL_ERROR;
- }
- if (pri != *((unsigned short *) valp)) {
- *((unsigned short *) valp) = pri;
- ZnITEM.UpdateItemPriority(item, ZN_NO_ITEM, True);
- *flags |= desc->flags;
- }
- break;
+ else if (integer > SHRT_MAX) {
+ integer = SHRT_MAX;
}
- case ZN_CONFIG_ITEM:
- /*
- * Can be an item id or a tag. In this last case
- * consider only the first item (unspecified order)
- * associated with the tag.
- */
- {
- ZnItem item2;
- int result;
- ZnTagSearch *search_var = NULL;
-
- if (strlen(Tcl_GetString(args[i+1])) == 0) {
- item2 = ZN_NO_ITEM;
- }
- else {
- result = ZnItemWithTagOrId(wi, args[i+1], &item2, &search_var);
- ZnTagSearchDestroy(search_var);
- if ((result == TCL_ERROR) || (item2 == ZN_NO_ITEM)) {
- Tcl_AppendResult(wi->interp, " unknown item \"",
- Tcl_GetString(args[i+1]), "\"", NULL);
- return TCL_ERROR;
- }
- }
- if (item2 != *((ZnItem *) valp)) {
- *((ZnItem *) valp) = item2;
- *flags |= desc->flags;
- }
+ if (integer != *((short *) valp)) {
+ *((short *) valp) = integer;
+ *flags |= desc->flags;
}
- break;
- case ZN_CONFIG_WINDOW:
- {
- Tk_Window win, ancestor, parent;
- str = Tcl_GetString(args[i+1]);
- if (strlen(str) == 0) {
- win = NULL;
- }
- else {
- win = Tk_NameToWindow(wi->interp, str, wi->win);
- if (win == NULL) {
- return TCL_ERROR;
- }
- else {
- /*
- * Make sure that the zinc widget is either the parent of the
- * window associated with the item or a descendant of that
- * parent. Also, don't allow a toplevel window or the widget
- * itself to be managed.
- */
- parent = Tk_Parent(win);
- for (ancestor = wi->win; ; ancestor = Tk_Parent(ancestor)) {
- if (ancestor == parent) {
- break;
- }
- if (((Tk_FakeWin *) (ancestor))->flags & TK_TOP_LEVEL) {
- badWindow:
- Tcl_AppendResult(wi->interp, "can't use ",
- Tk_PathName(win),
- " in a window item of this zinc widget",
- (char *) NULL);
- win = NULL;
- return TCL_ERROR;
- }
- }
- if (((Tk_FakeWin *) (win))->flags & TK_TOP_LEVEL) {
- goto badWindow;
- }
- if (win == wi->win) {
- goto badWindow;
- }
- if (win != *((Tk_Window *) valp)) {
- *((Tk_Window *) valp) = win;
- *flags |= desc->flags;
- }
- }
- }
+ }
+ else {
+ if (integer < 0) {
+ integer = 0;
}
- break;
- case ZN_CONFIG_CHAR:
- case ZN_CONFIG_UCHAR:
- case ZN_CONFIG_ALPHA:
- {
- int integer;
- if (Tcl_GetIntFromObj(wi->interp, args[i+1], &integer) == TCL_ERROR) {
- return TCL_ERROR;
- }
- switch (desc->type) {
- case ZN_CONFIG_UCHAR:
- if (integer < 0) {
- integer = 0;
- }
- case ZN_CONFIG_ALPHA:
- if (integer < 0) {
- integer = 0;
- }
- if (integer > 100) {
- integer = 100;
- }
- break;
- }
- if (integer != *((char *) valp)) {
- *((char *) valp) = integer;
- *flags |= desc->flags;
- }
- break;
+ else if (integer > USHRT_MAX) {
+ integer = USHRT_MAX;
}
- case ZN_CONFIG_SHORT:
- case ZN_CONFIG_USHORT:
- {
- int integer;
- if (Tcl_GetIntFromObj(wi->interp, args[i+1], &integer) == TCL_ERROR) {
- return TCL_ERROR;
- }
- if (desc->type == ZN_CONFIG_SHORT) {
- if (integer < SHRT_MIN) {
- integer = SHRT_MIN;
- }
- else if (integer > SHRT_MAX) {
- integer = SHRT_MAX;
- }
- if (integer != *((short *) valp)) {
- *((short *) valp) = integer;
- *flags |= desc->flags;
- }
- }
- else {
- if (integer < 0) {
- integer = 0;
- }
- else if (integer > USHRT_MAX) {
- integer = USHRT_MAX;
- }
- if (integer != *((unsigned short *) valp)) {
- *((unsigned short *) valp) = integer;
- *flags |= desc->flags;
- }
- }
- break;
+ if (integer != *((unsigned short *) valp)) {
+ *((unsigned short *) valp) = integer;
+ *flags |= desc->flags;
}
- case ZN_CONFIG_INT:
- case ZN_CONFIG_UINT:
+ }
+ break;
+ }
+ case ZN_CONFIG_INT:
+ case ZN_CONFIG_UINT:
+ case ZN_CONFIG_ANGLE:
+ {
+ int integer;
+ if (Tcl_GetIntFromObj(wi->interp, args[i+1], &integer) == TCL_ERROR) {
+ return TCL_ERROR;
+ }
+ switch (desc->type) {
case ZN_CONFIG_ANGLE:
- {
- int integer;
- if (Tcl_GetIntFromObj(wi->interp, args[i+1], &integer) == TCL_ERROR) {
- return TCL_ERROR;
- }
- switch (desc->type) {
- case ZN_CONFIG_ANGLE:
- if ((integer > 360) || (integer < -360)) {
- integer = integer % 360;
- }
- break;
- case ZN_CONFIG_UINT:
- if (integer < 0) {
- integer = 0;
- }
- break;
- }
- if (integer != *((int *) valp)) {
- *((int *) valp) = integer;
- *flags |= desc->flags;
- }
- break;
- }
- case ZN_CONFIG_FILL_RULE:
- {
- ZnFillRule fill_rule;
-
- if (ZnGetFillRule(wi, Tcl_GetString(args[i+1]), &fill_rule) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " fill rule expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (fill_rule != *((ZnFillRule *) valp)) {
- *((ZnFillRule *) valp) = fill_rule;
- *flags |= desc->flags;
- }
- break;
+ if ((integer > 360) || (integer < -360)) {
+ integer = integer % 360;
}
- case ZN_CONFIG_ALIGNMENT:
- {
- Tk_Justify justify;
- if (Tk_GetJustify(wi->interp, Tcl_GetString(args[i+1]), &justify) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " justify expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (justify != *((Tk_Justify *) valp)) {
- *((Tk_Justify *) valp) = justify;
- *flags |= desc->flags;
- }
- break;
- }
- case ZN_CONFIG_ANCHOR:
- {
- Tk_Anchor anchor;
- if (Tk_GetAnchor(wi->interp, Tcl_GetString(args[i+1]), &anchor) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " anchor expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (anchor != *((Tk_Anchor *) valp)) {
- *((Tk_Anchor *) valp) = anchor;
- *flags |= desc->flags;
- }
- break;
+ break;
+ case ZN_CONFIG_UINT:
+ if (integer < 0) {
+ integer = 0;
}
- case ZN_CONFIG_LABEL_FORMAT:
- {
- ZnLabelFormat frmt = NULL;
+ break;
+ }
+ if (integer != *((int *) valp)) {
+ *((int *) valp) = integer;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_FILL_RULE:
+ {
+ ZnFillRule fill_rule;
- str = Tcl_GetString(args[i+1]);
- while (*str && (*str == ' ')) {
- str++;
- }
- if (strlen(str) != 0) {
- frmt = ZnLFCreate(wi->interp, str,
- ZnFIELD.NumFields(item->class->GetFieldSet(item)));
- if (frmt == NULL) {
- return TCL_ERROR;
- }
- }
+ if (ZnGetFillRule(wi, Tcl_GetString(args[i+1]), &fill_rule) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " fill rule expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (fill_rule != *((ZnFillRule *) valp)) {
+ *((ZnFillRule *) valp) = fill_rule;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_ALIGNMENT:
+ {
+ Tk_Justify justify;
+ if (Tk_GetJustify(wi->interp, Tcl_GetString(args[i+1]), &justify) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " justify expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (justify != *((Tk_Justify *) valp)) {
+ *((Tk_Justify *) valp) = justify;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_ANCHOR:
+ {
+ Tk_Anchor anchor;
+ if (Tk_GetAnchor(wi->interp, Tcl_GetString(args[i+1]), &anchor) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " anchor expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (anchor != *((Tk_Anchor *) valp)) {
+ *((Tk_Anchor *) valp) = anchor;
+ *flags |= desc->flags;
+ }
+ break;
+ }
+ case ZN_CONFIG_LABEL_FORMAT:
+ {
+ ZnLabelFormat frmt = NULL;
- if (*((ZnLabelFormat *) valp) != NULL) {
- ZnLFDelete(*((ZnLabelFormat *) valp));
- *((ZnLabelFormat *) valp) = frmt;
- *flags |= desc->flags;
- }
- else {
- if (frmt != NULL) {
- *((ZnLabelFormat *) valp) = frmt;
- *flags |= desc->flags;
- }
- }
- break;
+ str = Tcl_GetString(args[i+1]);
+ while (*str && (*str == ' ')) {
+ str++;
+ }
+ if (strlen(str) != 0) {
+ frmt = ZnLFCreate(wi->interp, str,
+ ZnFIELD.NumFields(item->class->GetFieldSet(item)));
+ if (frmt == NULL) {
+ return TCL_ERROR;
}
+ }
- case ZN_CONFIG_AUTO_ALIGNMENT:
- {
- ZnAutoAlign aa;
-
- if (ZnGetAutoAlign(wi, Tcl_GetString(args[i+1]), &aa) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " auto alignment expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if ((aa.automatic != ((ZnAutoAlign *) valp)->automatic) ||
- (aa.align[0] != ((ZnAutoAlign *) valp)->align[0]) ||
- (aa.align[1] != ((ZnAutoAlign *) valp)->align[1]) ||
- (aa.align[2] != ((ZnAutoAlign *) valp)->align[2])) {
- *((ZnAutoAlign *) valp) = aa;
- *flags |= desc->flags;
- }
- break;
+ if (*((ZnLabelFormat *) valp) != NULL) {
+ ZnLFDelete(*((ZnLabelFormat *) valp));
+ *((ZnLabelFormat *) valp) = frmt;
+ *flags |= desc->flags;
+ }
+ else {
+ if (frmt != NULL) {
+ *((ZnLabelFormat *) valp) = frmt;
+ *flags |= desc->flags;
}
+ }
+ break;
+ }
- case ZN_CONFIG_LEADER_ANCHORS:
- {
- ZnLeaderAnchors lanch = NULL;
- if (ZnGetLeaderAnchors(wi, Tcl_GetString(args[i+1]), &lanch) == TCL_ERROR) {
- Tcl_AppendResult(wi->interp, " leader anchors expected for attribute \"",
- Tcl_GetString(args[i]), "\"", NULL);
- return TCL_ERROR;
- }
- if (*((ZnLeaderAnchors *) valp) != NULL) {
- ZnFree(*((ZnLeaderAnchors *) valp));
- *((ZnLeaderAnchors *) valp) = lanch;
- *flags |= desc->flags;
- }
- else {
- if (lanch != NULL) {
- *((ZnLeaderAnchors *) valp) = lanch;
- *flags |= desc->flags;
- }
- }
- break;
- }
+ case ZN_CONFIG_AUTO_ALIGNMENT:
+ {
+ ZnAutoAlign aa;
+
+ if (ZnGetAutoAlign(wi, Tcl_GetString(args[i+1]), &aa) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " auto alignment expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if ((aa.automatic != ((ZnAutoAlign *) valp)->automatic) ||
+ (aa.align[0] != ((ZnAutoAlign *) valp)->align[0]) ||
+ (aa.align[1] != ((ZnAutoAlign *) valp)->align[1]) ||
+ (aa.align[2] != ((ZnAutoAlign *) valp)->align[2])) {
+ *((ZnAutoAlign *) valp) = aa;
+ *flags |= desc->flags;
}
break;
}
- else {
- desc++;
+
+ case ZN_CONFIG_LEADER_ANCHORS:
+ {
+ ZnLeaderAnchors lanch = NULL;
+ if (ZnGetLeaderAnchors(wi, Tcl_GetString(args[i+1]), &lanch) == TCL_ERROR) {
+ Tcl_AppendResult(wi->interp, " leader anchors expected for attribute \"",
+ Tcl_GetString(args[i]), "\"", NULL);
+ return TCL_ERROR;
+ }
+ if (*((ZnLeaderAnchors *) valp) != NULL) {
+ ZnFree(*((ZnLeaderAnchors *) valp));
+ *((ZnLeaderAnchors *) valp) = lanch;
+ *flags |= desc->flags;
+ }
+ else {
+ if (lanch != NULL) {
+ *((ZnLeaderAnchors *) valp) = lanch;
+ *flags |= desc->flags;
+ }
+ }
+ break;
}
}
}
+
return TCL_OK;
}
@@ -991,22 +1062,21 @@ ZnConfigureAttributes(ZnWInfo *wi,
*
* Returns the obj representation of the attribute pointed
* by 'valp'. The attribute type is given by 'type'. The function
- * never fail. The buffer parameter should be able to
- * contain 256 characters at least.
+ * never fail.
*
**********************************************************************************
*/
static void
-AttributeToObj(ZnWInfo *wi,
+AttributeToObj(Tcl_Interp *interp,
void *record,
ZnAttrConfig *desc,
- char *buffer,
Tcl_Obj *result)
{
char *valp = ((char *) record) + desc->offset;
char *str = "";
Tcl_Obj *o;
unsigned int i;
+ char buffer[256];
switch (desc->type) {
case ZN_CONFIG_GRADIENT:
@@ -1025,7 +1095,7 @@ AttributeToObj(ZnWInfo *wi,
for (i = 0; i < num_grads; i++) {
o = Tcl_NewStringObj(ZnNameOfGradient(grads[i]), -1);
- Tcl_ListObjAppendElement(wi->interp, result, o);
+ Tcl_ListObjAppendElement(interp, result, o);
}
return;
}
@@ -1056,7 +1126,7 @@ AttributeToObj(ZnWInfo *wi,
else {
o = Tcl_NewStringObj("", -1);
}
- Tcl_ListObjAppendElement(wi->interp, result, o);
+ Tcl_ListObjAppendElement(interp, result, o);
}
return;
}
@@ -1071,7 +1141,7 @@ AttributeToObj(ZnWInfo *wi,
tags = (Tk_Uid *) ZnListArray(*((ZnList *) valp));
num_tags = ZnListSize(*((ZnList *) valp));
for (i = 0; i < num_tags; i++) {
- Tcl_ListObjAppendElement(wi->interp, result,
+ Tcl_ListObjAppendElement(interp, result,
Tcl_NewStringObj(tags[i], -1));
}
return;
@@ -1117,8 +1187,8 @@ AttributeToObj(ZnWInfo *wi,
str = (char *) Tk_NameOfCapStyle(*((int *) valp));
break;
case ZN_CONFIG_POINT:
- Tcl_ListObjAppendElement(wi->interp, result, Tcl_NewDoubleObj(((ZnPoint *) valp)->x));
- Tcl_ListObjAppendElement(wi->interp, result, Tcl_NewDoubleObj(((ZnPoint *) valp)->y));
+ Tcl_ListObjAppendElement(interp, result, Tcl_NewDoubleObj(((ZnPoint *) valp)->x));
+ Tcl_ListObjAppendElement(interp, result, Tcl_NewDoubleObj(((ZnPoint *) valp)->y));
return;
case ZN_CONFIG_ITEM:
if (*((ZnItem *) valp) != ZN_NO_ITEM) {
@@ -1187,29 +1257,18 @@ AttributeToObj(ZnWInfo *wi,
**********************************************************************************
*/
int
-ZnQueryAttribute(ZnWInfo *wi,
+ZnQueryAttribute(Tcl_Interp *interp,
void *record,
- ZnAttrConfig *desc,
+ ZnAttrConfig *desc_table,
Tcl_Obj *attr_name)
{
- Tk_Uid attr_uid = Tk_GetUid(Tcl_GetString(attr_name));
- Tcl_Obj *result = NULL;
- char buffer[256];
+ ZnAttrConfig *desc = GetAttrDesc(interp, attr_name, desc_table);
- while (True) {
- if (desc->type == ZN_CONFIG_END) {
- Tcl_AppendResult(wi->interp, "unknown attribute \"", attr_uid, "\"", NULL);
- return TCL_ERROR;
- }
- else if (attr_uid == desc->uid) {
- result = Tcl_GetObjResult(wi->interp);
- AttributeToObj(wi, record, desc, buffer, result);
- break;
- }
- else {
- desc++;
- }
+ if (!desc) {
+ return TCL_ERROR;
}
+ AttributeToObj(interp, record, desc, Tcl_GetObjResult(interp));
+
return TCL_OK;
}