diff options
Diffstat (limited to 'generic')
-rw-r--r-- | generic/tkZinc.c | 249 |
1 files changed, 169 insertions, 80 deletions
diff --git a/generic/tkZinc.c b/generic/tkZinc.c index f64d131..6d20d36 100644 --- a/generic/tkZinc.c +++ b/generic/tkZinc.c @@ -139,6 +139,28 @@ static Tk_Uid neg_paren_uid; static Tk_Uid tag_val_uid; static Tk_Uid neg_tag_val_uid; +static int ZnReliefParse _ANSI_ARGS_((ClientData client_data, Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *ovalue, + char *widget_rec, int offset)); +static Tcl_Obj *ZnReliefPrint _ANSI_ARGS_((ClientData client_data, Tk_Window tkwin, + char *widget_rec, int offset, + Tcl_FreeProc **free_proc)); +static int ZnGradientParse _ANSI_ARGS_((ClientData client_data, Tcl_Interp *interp, + Tk_Window tkwin, Tcl_Obj *ovalue, + char *widget_rec, int offset)); +static Tcl_Obj *ZnGradientPrint _ANSI_ARGS_((ClientData client_data, Tk_Window tkwin, + char *widget_rec, int offset, + Tcl_FreeProc **free_proc)); +static Tk_CustomOption reliefOption = { + ZnReliefParse, + ZnReliefPrint, + NULL +}; +static Tk_CustomOption gradientOption = { + ZnGradientParse, + ZnGradientPrint, + NULL +}; /* * Information used for argv parsing. @@ -146,27 +168,27 @@ static Tk_Uid neg_tag_val_uid; static Tk_ConfigSpec config_specs[] = { {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", "2", Tk_Offset(WidgetInfo, border_width), 0}, - {TK_CONFIG_COLOR, "-backcolor", "backColor", "BackColor", - "#c3c3c3", Tk_Offset(WidgetInfo, back_color), 0}, + {TK_CONFIG_CUSTOM, "-backcolor", "backColor", "BackColor", + "#c3c3c3", Tk_Offset(WidgetInfo, back_color), 0, &gradientOption}, {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor", "", Tk_Offset(WidgetInfo, cursor), TK_CONFIG_NULL_OK}, {TK_CONFIG_FONT, "-font", "font", "Font", "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*", Tk_Offset(WidgetInfo, font), 0}, - {TK_CONFIG_COLOR, "-forecolor", "foreColor", "Foreground", - "Black", Tk_Offset(WidgetInfo, fore_color), 0}, + {TK_CONFIG_CUSTOM, "-forecolor", "foreColor", "Foreground", + "Black", Tk_Offset(WidgetInfo, fore_color), 0, &gradientOption}, {TK_CONFIG_BOOLEAN, "-fullreshape", "fullReshape", "FullReshape", "1", Tk_Offset(WidgetInfo, full_reshape), 0}, {TK_CONFIG_PIXELS, "-height", "height", "Height", "7c", Tk_Offset(WidgetInfo, opt_height), 0}, - {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground", "HighlightBackground", - "#c3c3c3", Tk_Offset(WidgetInfo, highlight_bg_color), 0}, - {TK_CONFIG_COLOR, "-highlightcolor", "highlightColor", "HighlightColor", - "Black", Tk_Offset(WidgetInfo, highlight_color), 0}, + {TK_CONFIG_CUSTOM, "-highlightbackground", "highlightBackground", "HighlightBackground", + "#c3c3c3", Tk_Offset(WidgetInfo, highlight_bg_color), 0, &gradientOption}, + {TK_CONFIG_CUSTOM, "-highlightcolor", "highlightColor", "HighlightColor", + "Black", Tk_Offset(WidgetInfo, highlight_color), 0, &gradientOption}, {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness", "HighlightThickness", "2", Tk_Offset(WidgetInfo, highlight_width), 0}, - {TK_CONFIG_COLOR, "-insertbackground", "insertBackground", "Foreground", - "Black", Tk_Offset(WidgetInfo, text_info.insert_color), 0}, + {TK_CONFIG_CUSTOM, "-insertbackground", "insertBackground", "Foreground", + "Black", Tk_Offset(WidgetInfo, text_info.insert_color), 0, &gradientOption}, {TK_CONFIG_INT, "-insertofftime", "insertOffTime", "OffTime", "300", Tk_Offset(WidgetInfo, insert_off_time), 0}, {TK_CONFIG_INT, "-insertontime", "insertOnTime", "OnTime", @@ -184,14 +206,14 @@ static Tk_ConfigSpec config_specs[] = { #endif {TK_CONFIG_INT, "-pickaperture", "pickAperture", "PickAperture", "1", Tk_Offset(WidgetInfo, pick_aperture), 0}, - {TK_CONFIG_RELIEF, "-relief", "relief", "Relief", - "flat", Tk_Offset(WidgetInfo, relief), 0}, + {TK_CONFIG_CUSTOM, "-relief", "relief", "Relief", + "flat", Tk_Offset(WidgetInfo, relief), 0, &reliefOption}, {TK_CONFIG_BOOLEAN, "-render", "render", "Render", "0", Tk_Offset(WidgetInfo, render), 0}, {TK_CONFIG_BOOLEAN, "-reshape", "reshape", "Reshape", "1", Tk_Offset(WidgetInfo, reshape), 0}, - {TK_CONFIG_COLOR, "-selectbackground", "selectBackground", "Foreground", - "#a0a0a0", Tk_Offset(WidgetInfo, text_info.sel_color), 0}, + {TK_CONFIG_CUSTOM, "-selectbackground", "selectBackground", "Foreground", + "#a0a0a0", Tk_Offset(WidgetInfo, text_info.sel_color), 0, &gradientOption}, {TK_CONFIG_DOUBLE, "-speedvectorlength", "speedVectorLength", "SpeedVectorLength", "3", Tk_Offset(WidgetInfo, speed_vector_length), 0}, {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus", @@ -209,8 +231,8 @@ static Tk_ConfigSpec config_specs[] = { */ {TK_CONFIG_BOOLEAN, "-drawbboxes", "drawBBoxes", "DrawBBoxes", "0", Tk_Offset(WidgetInfo, draw_bboxes), 0}, - {TK_CONFIG_COLOR, "-bboxcolor", "bboxColor", "BBoxColor", - "Pink", Tk_Offset(WidgetInfo, bbox_color), 0}, + {TK_CONFIG_CUSTOM, "-bboxcolor", "bboxColor", "BBoxColor", + "Pink", Tk_Offset(WidgetInfo, bbox_color), 0, &gradientOption}, {TK_CONFIG_INT, "-lightangle", "lightAngle", "LightAngle", "120", Tk_Offset(WidgetInfo, light_angle), 0}, @@ -290,6 +312,96 @@ Tcl_GetString(Tcl_Obj *obj) /* *---------------------------------------------------------------------- * + * ZnReliefParse + * ZnReliefPrint -- + * Converters for the -relief option. + * + *---------------------------------------------------------------------- + */ +static int +ZnReliefParse(ClientData client_data, + Tcl_Interp *interp, + Tk_Window tkwin, + Tcl_Obj *ovalue, + char *widget_rec, + int offset) +{ + ReliefStyle *relief_ptr = (ReliefStyle *) (widget_rec + offset); + ReliefStyle relief; + char *value = Tcl_GetString(ovalue); + int result = ZN_OK; + + if (value != NULL) { + result = ZnGetRelief((WidgetInfo *) widget_rec, value, &relief); + if (result == ZN_OK) { + *relief_ptr = relief; + } + } + return result; +} + +static Tcl_Obj * +ZnReliefPrint(ClientData client_data, + Tk_Window tkwin, + char *widget_rec, + int offset, + Tcl_FreeProc **free_proc) +{ + ReliefStyle relief = *(ReliefStyle *) (widget_rec + offset); + return NewStringObj(ZnNameOfRelief(relief)); +} + + +/* + *---------------------------------------------------------------------- + * + * ZnGradientParse + * ZnGradientPrint -- + * Converters for the -*color* options. + * + *---------------------------------------------------------------------- + */ +static int +ZnGradientParse(ClientData client_data, + Tcl_Interp *interp, + Tk_Window tkwin, + Tcl_Obj *ovalue, + char *widget_rec, + int offset) +{ + ZnGradient **grad_ptr = (ZnGradient **) (widget_rec + offset); + ZnGradient *grad, *last_grad; + char *value = Tcl_GetString(ovalue); + + last_grad = *grad_ptr; + if ((value != NULL) && (*value != '\0')) { + grad = ZnGetGradient(interp, tkwin, value); + if (grad == NULL) { + return ZN_ERROR; + } + if (last_grad != NULL) { + ZnFreeGradient(last_grad); + } + *grad_ptr = grad; + } + return ZN_OK; +} + +static Tcl_Obj * +ZnGradientPrint(ClientData client_data, + Tk_Window tkwin, + char *widget_rec, + int offset, + Tcl_FreeProc **free_proc) +{ + ZnGradient *gradient = *(ZnGradient **) (widget_rec + offset); + return NewStringObj(ZnNameOfGradient(gradient)); +} + + +/* + *---------------------------------------------------------------------- + * * ZnGetAlphaStipple -- * Need to be handled per screen/dpy toolkit wide, not on a * widget basis. @@ -298,7 +410,7 @@ Tcl_GetString(Tcl_Obj *obj) */ Pixmap ZnGetAlphaStipple(WidgetInfo *wi, - unsigned char val) + unsigned char val) { if (val >= 255) return None; @@ -428,7 +540,6 @@ ZincObjCmd(ClientData client_data, /* Main window associated with wi->realized = False; wi->update_pending = 0; wi->fore_color = NULL; - wi->fore_gradient = NULL; wi->back_color = NULL; wi->relief_grad = NULL; wi->bbox_color = NULL; @@ -1689,10 +1800,6 @@ FindArea(WidgetInfo *wi, } area.corner.x += 1; area.corner.y += 1; - area.orig.x -= wi->inset; - area.orig.y -= wi->inset; - area.corner.x -= wi->inset; - area.corner.y -= wi->inset; wi->top_group->class->ToArea(wi->top_group, &area, tag_uid, enclosed, False); @@ -1918,8 +2025,6 @@ FindItems(WidgetInfo *wi, if (Tcl_GetDoubleFromObj(wi->interp, args[first+2], &p.y) == ZN_ERROR) { return ZN_ERROR; } - p.x -= wi->inset; - p.y -= wi->inset; if (argc > first+3) { if (Tcl_GetIntFromObj(wi->interp, args[first+3], &halo) == ZN_ERROR) { return ZN_ERROR; @@ -2663,10 +2768,10 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ } if (!IsEmptyBBox(&bbox)) { l = Tcl_GetObjResult(interp); - Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.orig.x+wi->inset)); - Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.orig.y+wi->inset)); - Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.corner.x+wi->inset)); - Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.corner.y+wi->inset)); + Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.orig.x)); + Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.orig.y)); + Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.corner.x)); + Tcl_ListObjAppendElement(interp, l, NewDoubleObj(bbox.corner.y)); } } break; @@ -2846,7 +2951,14 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ } ITEM.RemoveItem(item); ITEM.InsertItem(item, grp, ZN_NO_ITEM, True); - ITEM.Invalidate(item, ZN_COORDS_FLAG); + /* + * The item can be a group in which case we must + * use the ZN_TRANSFO_FLAG to force an update of + * the children. In all other case ZN_COORDS_FLAG + * is enough. + */ + ITEM.Invalidate(item, + item->class==ZnGroup?ZN_TRANSFO_FLAG:ZN_COORDS_FLAG); if (adjust) { ITEM.SetTransfo(item, this_one); } @@ -3514,7 +3626,7 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ if ((result == ZN_ERROR) || (item == ZN_NO_ITEM)) { goto error; } - l = NewBooleanObj(item->class->num_parts!=0); + l = Tcl_NewIntObj(item->class->num_parts); Tcl_SetObjResult(interp, l); } break; @@ -3910,13 +4022,6 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ } l = Tcl_GetObjResult(interp); for (i = 0; i < num_points; i++, p++) { - /* - * Need to adjust for the border. - */ - if (argc != 5) { - p->x -= wi->inset; - p->y -= wi->inset; - } ZnTransformPoint(this_one, p, &xp); /*printf("p->x=%g, p->y=%g, xp.x=%g, xp.y=%g\n", p->x, p->y, xp.x, xp.y);*/ Tcl_ListObjAppendElement(interp, l, NewDoubleObj(xp.x)); @@ -4107,8 +4212,6 @@ WidgetObjCmd(ClientData client_data, /* Information about the widget. */ if (Tcl_GetDoubleFromObj(interp, args[4], &p.y) == ZN_ERROR) { goto error; } - p.x -= wi->inset; - p.y -= wi->inset; item->class->PickVertex(item, &p, &contour, &vertex, &o_vertex); l = Tcl_GetObjResult(interp); Tcl_ListObjAppendElement(interp, l, Tcl_NewIntObj(contour)); @@ -4205,11 +4308,11 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ #else (char **) args, (char *) wi, flags|TK_CONFIG_OBJS) != TCL_OK) { #endif - return ZN_ERROR; + return TCL_ERROR; } if (!init) { if (wi->render != render) { - ZnWarning("It is not possible to change the -render option after widget creation."); + ZnWarning("It is not possible to change the -render option after widget creation.\n"); } wi->render = render; } @@ -4220,22 +4323,16 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ if (wi->pick_aperture < 0) { wi->pick_aperture = 0; } - if (CONFIG_PROBE(FORE_COLOR_SPEC) || !wi->fore_gradient) { - /* - * Update the default gradient. - */ - if (wi->fore_gradient) { - ZnFreeGradient(wi->fore_gradient); - } - wi->fore_gradient = ZnGetGradient(wi->interp, wi->win, - ZnNameOfColor(wi->fore_color)); - } if (CONFIG_PROBE(BACK_COLOR_SPEC) || !wi->relief_grad) { - Tk_SetWindowBackground(wi->win, ZnPixel(wi->back_color)); + XColor *color; + int alpha; + color = ZnGetGradientColor(wi->back_color, 0, &alpha); + Tk_SetWindowBackground(wi->win, ZnPixel(color)); if (wi->relief_grad) { ZnFreeGradient(wi->relief_grad); } - wi->relief_grad = ZnGetReliefGradient(interp, wi->win, ZnNameOfColor(wi->back_color)); + wi->relief_grad = ZnGetReliefGradient(interp, wi->win, + ZnNameOfColor(color), alpha); } if (CONFIG_PROBE(BACK_COLOR_SPEC) || CONFIG_PROBE(LIGHT_ANGLE_SPEC)) { bbox.orig.x = bbox.orig.y = 0; @@ -4248,15 +4345,6 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ ZnNeedRedisplay(wi); } - /* - * Update the items in the case borderwidth changed. This change - * results in a change of the window size which might not be - * acknowledged by the geometry manager. In this case the actual - * area available to display items and the global transform are - * modified. - * If the changes in geometry are actually performed the code below - * might be a duplicate effort (done in Event). - */ wi->inset = wi->border_width + wi->highlight_width; if (CONFIG_PROBE(BORDER_WIDTH_SPEC) || CONFIG_PROBE(HIGHLIGHT_THICKNESS_SPEC)) { @@ -4264,8 +4352,6 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ bbox.corner.x = wi->width; bbox.corner.y = wi->height; ITEM_P.Damage(wi, &bbox); - ITEM_P.ResetTransformStack(wi); - ITEM.Invalidate(wi->top_group, ZN_TRANSFO_FLAG); } if (CONFIG_PROBE(SPEED_VECTOR_LENGTH_SPEC) || CONFIG_PROBE(MANAGE_HISTORY_SPEC) || @@ -4282,8 +4368,7 @@ Configure(Tcl_Interp *interp,/* Used for error reporting. */ if (CONFIG_PROBE(WIDTH_SPEC) || CONFIG_PROBE(HEIGHT_SPEC) || CONFIG_PROBE(BORDER_WIDTH_SPEC) || CONFIG_PROBE(HIGHLIGHT_THICKNESS_SPEC) || !wi->realized) { - Tk_GeometryRequest(wi->win, wi->opt_width + 2*wi->inset, - wi->opt_height + 2*wi->inset); + Tk_GeometryRequest(wi->win, wi->opt_width, wi->opt_height); } if (CONFIG_PROBE(TILE_SPEC)) { @@ -4463,6 +4548,8 @@ Event(ClientData client_data, /* Information about widget. */ printf(" Moteur de rendu : %s, ", (char *) glGetString(GL_RENDERER)); printf(" Fabriquant : %s\n", (char *) glGetString(GL_VENDOR)); printf(" Extensions présentes : %s\n", (char *) glGetString(GL_EXTENSIONS)); + printf("Max antialiased line width: %g\n", wi->max_line_width); + printf("Max antialiased point size: %g\n", wi->max_point_width); #endif #endif } @@ -4501,8 +4588,8 @@ Event(ClientData client_data, /* Information about widget. */ ZnBBox bbox; ZnDim width, height; - bbox.orig.x = (((XExposeEvent*) event)->x - wi->inset); - bbox.orig.y = (((XExposeEvent*) event)->y - wi->inset); + bbox.orig.x = (((XExposeEvent*) event)->x); + bbox.orig.y = (((XExposeEvent*) event)->y); width = ((XExposeEvent*) event)->width; height = ((XExposeEvent*) event)->height; if (bbox.orig.x < 0) { @@ -4540,10 +4627,8 @@ Event(ClientData client_data, /* Information about widget. */ ZnDim int_width, int_height; ZnBBox bbox; - /* w = ((XConfigureEvent*) event)->width-2*wi->inset; - h = ((XConfigureEvent*) event)->height-2*wi->inset;*/ - int_width = Tk_Width(wi->win)-2*wi->inset; - int_height = Tk_Height(wi->win)-2*wi->inset; + int_width = Tk_Width(wi->win); + int_height = Tk_Height(wi->win); if ((wi->width != int_width) || (wi->height != int_height)) { bbox.orig.x = bbox.orig.y = 0; @@ -4858,8 +4943,8 @@ PickCurrentItem(WidgetInfo *wi, ZnPoint p; ZnReal dist; - p.x = wi->pick_event.xcrossing.x-wi->inset; - p.y = wi->pick_event.xcrossing.y-wi->inset; + p.x = wi->pick_event.xcrossing.x; + p.y = wi->pick_event.xcrossing.y; dist = wi->top_group->class->Pick(wi->top_group, &p, NULL, wi->pick_aperture, &wi->new_item, &wi->new_part); if (dist != 0.0) { @@ -5352,7 +5437,7 @@ Destroy(char *mem_ptr) /* Info about the widget. */ Tk_FreeImage(wi->tile); wi->tile = ZnUnspecifiedImage; } - + /* Free the double buffer pixmap/image */ if (wi->draw_buffer) { XFreePixmap(wi->dpy, wi->draw_buffer); @@ -5366,8 +5451,14 @@ Destroy(char *mem_ptr) /* Info about the widget. */ } #endif - if (wi->fore_gradient) { - ZnFreeGradient(wi->fore_gradient); + if (wi->fore_color) { + ZnFreeGradient(wi->fore_color); + } + if (wi->back_color) { + ZnFreeGradient(wi->back_color); + } + if (wi->relief_grad) { + ZnFreeGradient(wi->relief_grad); } Tcl_DeleteTimerHandler(wi->blink_handler); @@ -5386,11 +5477,9 @@ Destroy(char *mem_ptr) /* Info about the widget. */ #endif ZnListFree(wi->work_xpts); - ZnFreeGradient(wi->relief_grad); - FreeChrono(wi->total_draw_chrono); FreeChrono(wi->this_draw_chrono); - + ZnFree(wi); /*printf("Destroy ending\n");*/ } |