From 96295926362f1aa093d138ef25cef3505551e4fe Mon Sep 17 00:00:00 2001 From: lecoanet Date: Fri, 30 Mar 2001 12:18:07 +0000 Subject: Modification afin que itemconfigure et itemcget retournent des tableaux � la place des r�f�rences sur des tableaux. M�nage de la fonction AttributeToObj par la m�me occasion. --- generic/Item.c | 158 +++++++++++++++++++++------------------------------------ 1 file changed, 58 insertions(+), 100 deletions(-) (limited to 'generic') diff --git a/generic/Item.c b/generic/Item.c index 1a15218..2e8050a 100644 --- a/generic/Item.c +++ b/generic/Item.c @@ -197,8 +197,9 @@ static int ConfigureField(FieldSet field_set, unsigned int field, int argc, Tcl_Obj *CONST argv[], int *flags); static int QueryField(FieldSet field_set, unsigned int field, int argc, Tcl_Obj *CONST argv[]); -static Tcl_Obj *AttributeToObj(WidgetInfo *wi, char *record, - ZnAttrConfig *desc, char *buffer); +static void AttributeToObj(WidgetInfo *wi, char *record, + ZnAttrConfig *desc, char *buffer, + Tcl_Obj *result); static void FieldImageChange(ClientData client_data, int x, int y, int width, int height, int image_width, int image_height); static void FieldTileChange(ClientData client_data, int x, int y, int width, @@ -287,32 +288,20 @@ AttributesInfo(Item item, entries[1] = NewStringObj(attribute_type_strings[desc->type]); entries[2] = NewBooleanObj(desc->read_only ? 1 : 0); entries[3] = NewStringObj(""); - entries[4] = AttributeToObj(wi, record, desc, buffer); -#ifdef PTK0 - l = Tcl_Merge(5, entries); - Tcl_SetObjResult(wi->interp, l); -#else + entries[4] = NewStringObj(""); + AttributeToObj(wi, record, desc, buffer, entries[4]); Tcl_SetObjResult(wi->interp, Tcl_NewListObj(5, entries)); -#endif } else { -#ifdef PTK0 - Tcl_Obj *o; -#endif l = Tcl_GetObjResult(wi->interp); while (desc->type != ZN_CONFIG_END) { entries[0] = NewStringObj(desc->name); entries[1] = NewStringObj(attribute_type_strings[desc->type]); entries[2] = NewBooleanObj(desc->read_only ? 1 : 0); entries[3] = NewStringObj(""); - entries[4] = AttributeToObj(wi, record, desc, buffer); -#ifdef PTK0 - o = NULL; - LangSetArg(&o, Tcl_Merge(5, entries)); - Tcl_ListObjAppendElement(wi->interp, l, o); -#else + entries[4] = NewStringObj(""); + AttributeToObj(wi, record, desc, buffer, entries[4]); Tcl_ListObjAppendElement(wi->interp, l, Tcl_NewListObj(5, entries)); -#endif desc++; } } @@ -1202,33 +1191,32 @@ ConfigureAttributes(char *record, * ********************************************************************************** */ -static Tcl_Obj * +static void AttributeToObj(WidgetInfo *wi, char *record, ZnAttrConfig *desc, - char *buffer) + char *buffer, + Tcl_Obj *result) { - Tcl_Obj *result = NULL; char *valp = record + desc->offset; char *str = ""; - Tcl_Obj *o, *objs[4]; + Tcl_Obj *o; int i; -#ifdef PTK0 - Tcl_Obj **tmp=NULL; -#endif switch (desc->type) { case ZN_CONFIG_COLOR: if (*((XColor **) valp)) { - result = NewStringObj(ZnNameOfColor(*((XColor **) valp))); + str = ZnNameOfColor(*((XColor **) valp)); + Tcl_SetStringObj(result, str, strlen(str)); } break; case ZN_CONFIG_BOOL: - result = NewBooleanObj(ISSET(*((char *) valp), desc->bool_bit)?1:0); + Tcl_SetBooleanObj(result, ISSET(*((char *) valp), desc->bool_bit)?1:0); break; case ZN_CONFIG_PATTERN: if (*((Pixmap *) valp)) { - result = NewStringObj(Tk_NameOfBitmap(wi->dpy, *((Pixmap *) valp))); + str = Tk_NameOfBitmap(wi->dpy, *((Pixmap *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); } break; case ZN_CONFIG_PATTERNS: @@ -1236,15 +1224,10 @@ AttributeToObj(WidgetInfo *wi, int num_pats=0; Pixmap *pats; -#ifndef PTK0 - result = Tcl_NewListObj(0, NULL); -#endif if (*((ZnList *) valp)) { pats = (Pixmap *) ZnListArray(*((ZnList *) valp)); num_pats = ZnListSize(*((ZnList *) valp)); -#ifdef PTK0 - tmp = (Tcl_Obj **) ZnMalloc(num_pats * sizeof(Tcl_Obj *)); -#endif + for (i = 0; i < num_pats; i++) { if (pats[i] != ZnUnspecifiedPattern) { o = NewStringObj(Tk_NameOfBitmap(wi->dpy, pats[i])); @@ -1252,17 +1235,9 @@ AttributeToObj(WidgetInfo *wi, else { o = NewStringObj(""); } -#ifdef PTK0 - tmp[i] = o; -#else Tcl_ListObjAppendElement(wi->interp, result, o); -#endif } } -#ifdef PTK0 - result = Tcl_Merge(num_pats, tmp); - ZnFree(tmp); -#endif break; } case ZN_CONFIG_TAGS: @@ -1270,45 +1245,33 @@ AttributeToObj(WidgetInfo *wi, int num_tags=0; Tk_Uid *tags; -#ifndef PTK0 - result = Tcl_NewListObj(0, NULL); -#endif if (*((ZnList *) valp)) { tags = (Tk_Uid *) ZnListArray(*((ZnList *) valp)); num_tags = ZnListSize(*((ZnList *) valp)); -#ifdef PTK0 - tmp = (Tcl_Obj **) ZnMalloc(num_tags * sizeof(Tcl_Obj *)); -#endif for (i = 0; i < num_tags; i++) { -#ifdef PTK0 - tmp[i] = NewStringObj(tags[i]); -#else Tcl_ListObjAppendElement(wi->interp, result, NewStringObj(tags[i])); -#endif } } -#ifdef PTK0 - result = Tcl_Merge(num_tags, tmp); - ZnFree(tmp); -#endif break; } case ZN_CONFIG_TEXT: case ZN_CONFIG_MAP_INFO: case ZN_CONFIG_IMAGE: - result = NewStringObj(*((char **) valp)); + str = *((char **) valp); + Tcl_SetStringObj(result, str, strlen(str)); break; case ZN_CONFIG_FONT: if (*((Tk_Font *) valp)) { - result = NewStringObj(Tk_NameOfFont(*((Tk_Font *) valp))); + str = Tk_NameOfFont(*((Tk_Font *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); } break; case ZN_CONFIG_BORDER: { Border border = *((Border *) valp); if (border == NO_BORDER) { - result = NewStringObj(NO_BORDER_SPEC); + Tcl_SetStringObj(result, NO_BORDER_SPEC, strlen(NO_BORDER_SPEC)); break; } buffer[0] = 0; @@ -1350,7 +1313,7 @@ AttributeToObj(WidgetInfo *wi, } strcat(buffer, COUNTER_OBLIQUE_SPEC); } - result = NewStringObj(buffer); + Tcl_SetStringObj(result, buffer, strlen(buffer)); } break; case ZN_CONFIG_LINE_SHAPE: @@ -1379,7 +1342,7 @@ AttributeToObj(WidgetInfo *wi, str = DOUBLE_LEFT_CORNER_SPEC; break; } - result = NewStringObj(str); + Tcl_SetStringObj(result, str, strlen(str)); break; } case ZN_CONFIG_LINE_STYLE: @@ -1399,7 +1362,7 @@ AttributeToObj(WidgetInfo *wi, str = DOTTED_SPEC; break; } - result = NewStringObj(str); + Tcl_SetStringObj(result, str, strlen(str)); break; } case ZN_CONFIG_LINE_END: @@ -1407,7 +1370,8 @@ AttributeToObj(WidgetInfo *wi, ZnLineEnd line_end = *((ZnLineEnd *) valp); if (line_end) { - result = NewStringObj(LineEndGetString(line_end)); + str = LineEndGetString(line_end); + Tcl_SetStringObj(result, str, strlen(str)); } break; } @@ -1416,51 +1380,46 @@ AttributeToObj(WidgetInfo *wi, ZnGradientGeom gg = *((ZnGradientGeom *) valp); if (gg) { - result = NewStringObj(GradientGeomGetString(gg)); + str = GradientGeomGetString(gg); + Tcl_SetStringObj(result, str, strlen(str)); } break; } case ZN_CONFIG_RELIEF: - result = NewStringObj(Tk_NameOfRelief(*((ReliefStyle *) valp))); + str = Tk_NameOfRelief(*((ReliefStyle *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); break; case ZN_CONFIG_JOIN_STYLE: - result = NewStringObj(Tk_NameOfJoinStyle(*((int *) valp))); + str = Tk_NameOfJoinStyle(*((int *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); break; case ZN_CONFIG_CAP_STYLE: - result = NewStringObj(Tk_NameOfCapStyle(*((int *) valp))); + str = Tk_NameOfCapStyle(*((int *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); break; case ZN_CONFIG_POINT: { - objs[0] = NewDoubleObj(((ZnPoint *) valp)->x); - objs[1] = NewDoubleObj(((ZnPoint *) valp)->y); -#ifdef PTK0 - result = Tcl_Merge(2, objs); -#else - result = Tcl_NewListObj(2, objs); -#endif + Tcl_ListObjAppendElement(wi->interp, result, NewDoubleObj(((ZnPoint *) valp)->x)); + Tcl_ListObjAppendElement(wi->interp, result, NewDoubleObj(((ZnPoint *) valp)->y)); break; } case ZN_CONFIG_RECT: { - objs[0] = NewDoubleObj(((ZnRect *) valp)->x); - objs[1] = NewDoubleObj(((ZnRect *) valp)->y); - objs[2] = NewDoubleObj(((ZnRect *) valp)->w); - objs[3] = NewDoubleObj(((ZnRect *) valp)->h); -#ifdef PTK0 - result = Tcl_Merge(4, objs); -#else - result = Tcl_NewListObj(4, objs); -#endif + Tcl_ListObjAppendElement(wi->interp, result, NewDoubleObj(((ZnRect *) valp)->x)); + Tcl_ListObjAppendElement(wi->interp, result, NewDoubleObj(((ZnRect *) valp)->y)); + Tcl_ListObjAppendElement(wi->interp, result, NewDoubleObj(((ZnRect *) valp)->w)); + Tcl_ListObjAppendElement(wi->interp, result, NewDoubleObj(((ZnRect *) valp)->h)); break; } case ZN_CONFIG_ITEM: if (*((Item *) valp) != ZN_NO_ITEM) { - result = NewLongObj((*((Item *) valp))->id); + Tcl_SetLongObj(result, (*((Item *) valp))->id); } break; case ZN_CONFIG_WINDOW: if (*((ZnWindow *) valp) != NULL) { - result = NewStringObj(Tk_PathName(*((ZnWindow *) valp))); + str = Tk_PathName(*((ZnWindow *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); } break; case ZN_CONFIG_INT: @@ -1468,20 +1427,23 @@ AttributeToObj(WidgetInfo *wi, case ZN_CONFIG_DIM: case ZN_CONFIG_PRI: case ZN_CONFIG_ANGLE: - result = Tcl_NewIntObj(*((int *) valp)); + Tcl_SetIntObj(result, *((int *) valp)); break; case ZN_CONFIG_JUSTIFY: - result = NewStringObj(Tk_NameOfJustify(*((ZnJustify *) valp))); + str = Tk_NameOfJustify(*((ZnJustify *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); break; case ZN_CONFIG_ANCHOR: - result = NewStringObj(Tk_NameOfAnchor(*((Tk_Anchor *) valp))); + str = Tk_NameOfAnchor(*((Tk_Anchor *) valp)); + Tcl_SetStringObj(result, str, strlen(str)); break; case ZN_CONFIG_LABEL_FORMAT: { ZnLabelFormat frmt = *((ZnLabelFormat *) valp); if (frmt) { - result = NewStringObj(LabelFormatGetString(frmt)); + str = LabelFormatGetString(frmt); + Tcl_SetStringObj(result, str, strlen(str)); } break; } @@ -1490,7 +1452,8 @@ AttributeToObj(WidgetInfo *wi, AutoAlign *aa = (AutoAlign *) valp; int i; if (aa->automatic == False) { - result = NewStringObj("-"); + str = "-"; + Tcl_SetStringObj(result, str, strlen(str)); } else { buffer[0] = 0; @@ -1508,7 +1471,7 @@ AttributeToObj(WidgetInfo *wi, break; } } - result = NewStringObj(buffer); + Tcl_SetStringObj(result, buffer, strlen(buffer)); } } break; @@ -1538,14 +1501,9 @@ AttributeToObj(WidgetInfo *wi, } ptr = buffer; } - result = NewStringObj(ptr); + Tcl_SetStringObj(result, ptr, strlen(ptr)); } } - - if (result == NULL) { - result = NewStringObj(""); - } - return result; } @@ -1590,9 +1548,9 @@ QueryAttribute(char *record, return ZN_ERROR; } else if (attr_uid == desc->uid) { - result = AttributeToObj(wi, record, desc, buffer); - Tcl_SetObjResult(wi->interp, result); -#ifdef PTK + result = Tcl_GetObjResult(wi->interp); + AttributeToObj(wi, record, desc, buffer, result); +#ifdef PTK0 Tcl_DecrRefCount(result); #endif break; -- cgit v1.1