diff options
Diffstat (limited to 'generic/tkCanvas.c')
| -rw-r--r-- | generic/tkCanvas.c | 772 |
1 files changed, 419 insertions, 353 deletions
diff --git a/generic/tkCanvas.c b/generic/tkCanvas.c index 6796ddd..3cb66fe 100644 --- a/generic/tkCanvas.c +++ b/generic/tkCanvas.c @@ -101,7 +101,7 @@ static const Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_SYNONYM, "-bd", "borderWidth", NULL, NULL, 0, 0, NULL}, {TK_CONFIG_SYNONYM, "-bg", "background", NULL, NULL, 0, 0, NULL}, {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth", - DEF_CANVAS_BORDER_WIDTH, offsetof(TkCanvas, borderWidth), 0, NULL}, + DEF_CANVAS_BORDER_WIDTH, offsetof(TkCanvas, borderWidthObj), TK_CONFIG_OBJS, NULL}, {TK_CONFIG_DOUBLE, "-closeenough", "closeEnough", "CloseEnough", DEF_CANVAS_CLOSE_ENOUGH, offsetof(TkCanvas, closeEnough), 0, NULL}, {TK_CONFIG_BOOLEAN, "-confine", "confine", "Confine", @@ -109,7 +109,7 @@ static const Tk_ConfigSpec configSpecs[] = { {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor", DEF_CANVAS_CURSOR, offsetof(TkCanvas, cursor), TK_CONFIG_NULL_OK, NULL}, {TK_CONFIG_PIXELS, "-height", "height", "Height", - DEF_CANVAS_HEIGHT, offsetof(TkCanvas, height), 0, NULL}, + DEF_CANVAS_HEIGHT, offsetof(TkCanvas, heightObj), TK_CONFIG_OBJS, NULL}, {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground", "HighlightBackground", DEF_CANVAS_HIGHLIGHT_BG, offsetof(TkCanvas, highlightBgColorPtr), 0, NULL}, @@ -117,29 +117,29 @@ static const Tk_ConfigSpec configSpecs[] = { DEF_CANVAS_HIGHLIGHT, offsetof(TkCanvas, highlightColorPtr), 0, NULL}, {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness", "HighlightThickness", - DEF_CANVAS_HIGHLIGHT_WIDTH, offsetof(TkCanvas, highlightWidth), 0, NULL}, + DEF_CANVAS_HIGHLIGHT_WIDTH, offsetof(TkCanvas, highlightWidthObj), TK_CONFIG_OBJS, NULL}, {TK_CONFIG_BORDER, "-insertbackground", "insertBackground", "Foreground", DEF_CANVAS_INSERT_BG, offsetof(TkCanvas, textInfo.insertBorder), 0, NULL}, {TK_CONFIG_PIXELS, "-insertborderwidth", "insertBorderWidth", "BorderWidth", - DEF_CANVAS_INSERT_BD_COLOR, - offsetof(TkCanvas, textInfo.insertBorderWidth), TK_CONFIG_COLOR_ONLY, NULL}, + DEF_CANVAS_INSERT_BD_COLOR, offsetof(TkCanvas, textInfo.reserved1), + TK_CONFIG_OBJS|TK_CONFIG_COLOR_ONLY, NULL}, {TK_CONFIG_PIXELS, "-insertborderwidth", "insertBorderWidth", "BorderWidth", - DEF_CANVAS_INSERT_BD_MONO, - offsetof(TkCanvas, textInfo.insertBorderWidth), TK_CONFIG_MONO_ONLY, NULL}, + DEF_CANVAS_INSERT_BD_MONO, offsetof(TkCanvas, textInfo.reserved1), + TK_CONFIG_OBJS|TK_CONFIG_MONO_ONLY, NULL}, {TK_CONFIG_INT, "-insertofftime", "insertOffTime", "OffTime", DEF_CANVAS_INSERT_OFF_TIME, offsetof(TkCanvas, insertOffTime), 0, NULL}, {TK_CONFIG_INT, "-insertontime", "insertOnTime", "OnTime", DEF_CANVAS_INSERT_ON_TIME, offsetof(TkCanvas, insertOnTime), 0, NULL}, {TK_CONFIG_PIXELS, "-insertwidth", "insertWidth", "InsertWidth", - DEF_CANVAS_INSERT_WIDTH, offsetof(TkCanvas, textInfo.insertWidth), 0, NULL}, + DEF_CANVAS_INSERT_WIDTH, offsetof(TkCanvas, textInfo.reserved2), TK_CONFIG_OBJS, NULL}, {TK_CONFIG_CUSTOM, "-offset", "offset", "Offset", "0,0", offsetof(TkCanvas, tsoffset),TK_CONFIG_DONT_SET_DEFAULT, &offsetOption}, {TK_CONFIG_RELIEF, "-relief", "relief", "Relief", DEF_CANVAS_RELIEF, offsetof(TkCanvas, relief), 0, NULL}, {TK_CONFIG_STRING, "-scrollregion", "scrollRegion", "ScrollRegion", - DEF_CANVAS_SCROLL_REGION, offsetof(TkCanvas, regionString), - TK_CONFIG_NULL_OK, NULL}, + DEF_CANVAS_SCROLL_REGION, offsetof(TkCanvas, regionObj), + TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL}, {TK_CONFIG_BORDER, "-selectbackground", "selectBackground", "Foreground", DEF_CANVAS_SELECT_COLOR, offsetof(TkCanvas, textInfo.selBorder), TK_CONFIG_COLOR_ONLY, NULL}, @@ -147,11 +147,11 @@ static const Tk_ConfigSpec configSpecs[] = { DEF_CANVAS_SELECT_MONO, offsetof(TkCanvas, textInfo.selBorder), TK_CONFIG_MONO_ONLY, NULL}, {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth", - DEF_CANVAS_SELECT_BD_COLOR, - offsetof(TkCanvas, textInfo.selBorderWidth), TK_CONFIG_COLOR_ONLY, NULL}, + DEF_CANVAS_SELECT_BD_COLOR, offsetof(TkCanvas, textInfo.reserved3), + TK_CONFIG_OBJS|TK_CONFIG_COLOR_ONLY, NULL}, {TK_CONFIG_PIXELS, "-selectborderwidth", "selectBorderWidth", "BorderWidth", - DEF_CANVAS_SELECT_BD_MONO, offsetof(TkCanvas, textInfo.selBorderWidth), - TK_CONFIG_MONO_ONLY, NULL}, + DEF_CANVAS_SELECT_BD_MONO, offsetof(TkCanvas, textInfo.reserved3), + TK_CONFIG_OBJS|TK_CONFIG_MONO_ONLY, NULL}, {TK_CONFIG_COLOR, "-selectforeground", "selectForeground", "Background", DEF_CANVAS_SELECT_FG_COLOR, offsetof(TkCanvas, textInfo.selFgColorPtr), TK_CONFIG_COLOR_ONLY|TK_CONFIG_NULL_OK, NULL}, @@ -162,24 +162,24 @@ static const Tk_ConfigSpec configSpecs[] = { "normal", offsetof(TkCanvas, canvas_state), TK_CONFIG_DONT_SET_DEFAULT, &stateOption}, {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus", - DEF_CANVAS_TAKE_FOCUS, offsetof(TkCanvas, takeFocus), - TK_CONFIG_NULL_OK, NULL}, + DEF_CANVAS_TAKE_FOCUS, offsetof(TkCanvas, takeFocusObj), + TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL}, {TK_CONFIG_PIXELS, "-width", "width", "Width", - DEF_CANVAS_WIDTH, offsetof(TkCanvas, width), 0, NULL}, + DEF_CANVAS_WIDTH, offsetof(TkCanvas, widthObj), TK_CONFIG_OBJS, NULL}, {TK_CONFIG_STRING, "-xscrollcommand", "xScrollCommand", "ScrollCommand", - DEF_CANVAS_X_SCROLL_CMD, offsetof(TkCanvas, xScrollCmd), - TK_CONFIG_NULL_OK, NULL}, + DEF_CANVAS_X_SCROLL_CMD, offsetof(TkCanvas, xScrollCmdObj), + TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL}, {TK_CONFIG_PIXELS, "-xscrollincrement", "xScrollIncrement", "ScrollIncrement", - DEF_CANVAS_X_SCROLL_INCREMENT, offsetof(TkCanvas, xScrollIncrement), - 0, NULL}, + DEF_CANVAS_X_SCROLL_INCREMENT, offsetof(TkCanvas, xScrollIncrementObj), + TK_CONFIG_OBJS, NULL}, {TK_CONFIG_STRING, "-yscrollcommand", "yScrollCommand", "ScrollCommand", - DEF_CANVAS_Y_SCROLL_CMD, offsetof(TkCanvas, yScrollCmd), - TK_CONFIG_NULL_OK, NULL}, + DEF_CANVAS_Y_SCROLL_CMD, offsetof(TkCanvas, yScrollCmdObj), + TK_CONFIG_OBJS|TK_CONFIG_NULL_OK, NULL}, {TK_CONFIG_PIXELS, "-yscrollincrement", "yScrollIncrement", "ScrollIncrement", - DEF_CANVAS_Y_SCROLL_INCREMENT, offsetof(TkCanvas, yScrollIncrement), - 0, NULL}, + DEF_CANVAS_Y_SCROLL_INCREMENT, offsetof(TkCanvas, yScrollIncrementObj), + TK_CONFIG_OBJS, NULL}, {TK_CONFIG_END, NULL, NULL, NULL, NULL, 0, 0, NULL} }; @@ -266,7 +266,7 @@ static Tcl_Obj * ScrollFractions(int screen1, int screen2, int object1, int object2); static int RelinkItems(TkCanvas *canvasPtr, Tcl_Obj *tag, Tk_Item *prevPtr, TagSearch **searchPtrPtr); -static void TagSearchExprInit(TagSearchExpr **exprPtrPtr); +static void TagSearchExprInit(TagSearchExpr **exprPtrPtr); static void TagSearchExprDestroy(TagSearchExpr *expr); static void TagSearchDestroy(TagSearch *searchPtr); static int TagSearchScan(TkCanvas *canvasPtr, @@ -678,19 +678,20 @@ Tk_CanvasObjCmd( CanvasCmdDeletedProc); canvasPtr->firstItemPtr = NULL; canvasPtr->lastItemPtr = NULL; - canvasPtr->borderWidth = 0; + canvasPtr->borderWidthObj = NULL; canvasPtr->bgBorder = NULL; canvasPtr->relief = TK_RELIEF_FLAT; - canvasPtr->highlightWidth = 0; + canvasPtr->highlightWidthObj = NULL; canvasPtr->highlightBgColorPtr = NULL; canvasPtr->highlightColorPtr = NULL; canvasPtr->inset = 0; canvasPtr->pixmapGC = NULL; - canvasPtr->width = None; - canvasPtr->height = None; + canvasPtr->widthObj = NULL; + canvasPtr->heightObj = NULL; canvasPtr->confine = 0; canvasPtr->textInfo.selBorder = NULL; canvasPtr->textInfo.selBorderWidth = 0; + canvasPtr->textInfo.reserved3 = NULL; canvasPtr->textInfo.selFgColorPtr = NULL; canvasPtr->textInfo.selItemPtr = NULL; canvasPtr->textInfo.selectFirst = TCL_INDEX_NONE; @@ -699,7 +700,9 @@ Tk_CanvasObjCmd( canvasPtr->textInfo.selectAnchor = 0; canvasPtr->textInfo.insertBorder = NULL; canvasPtr->textInfo.insertWidth = 0; + canvasPtr->textInfo.reserved2 = NULL; canvasPtr->textInfo.insertBorderWidth = 0; + canvasPtr->textInfo.reserved1 = NULL; canvasPtr->textInfo.focusItemPtr = NULL; canvasPtr->textInfo.gotFocus = 0; canvasPtr->textInfo.cursorOn = 0; @@ -716,15 +719,15 @@ Tk_CanvasObjCmd( canvasPtr->pickEvent.xcrossing.x = 0; canvasPtr->pickEvent.xcrossing.y = 0; canvasPtr->state = 0; - canvasPtr->xScrollCmd = NULL; - canvasPtr->yScrollCmd = NULL; + canvasPtr->xScrollCmdObj = NULL; + canvasPtr->yScrollCmdObj = NULL; canvasPtr->scrollX1 = 0; canvasPtr->scrollY1 = 0; canvasPtr->scrollX2 = 0; canvasPtr->scrollY2 = 0; - canvasPtr->regionString = NULL; - canvasPtr->xScrollIncrement = 0; - canvasPtr->yScrollIncrement = 0; + canvasPtr->regionObj = NULL; + canvasPtr->xScrollIncrementObj = NULL; + canvasPtr->yScrollIncrementObj = NULL; canvasPtr->scanX = 0; canvasPtr->scanXOrigin = 0; canvasPtr->scanY = 0; @@ -732,7 +735,7 @@ Tk_CanvasObjCmd( canvasPtr->hotPtr = NULL; canvasPtr->hotPrevPtr = NULL; canvasPtr->cursor = NULL; - canvasPtr->takeFocus = NULL; + canvasPtr->takeFocusObj = NULL; canvasPtr->pixelsPerMM = WidthOfScreen(Tk_Screen(newWin)); canvasPtr->pixelsPerMM /= WidthMMOfScreen(Tk_Screen(newWin)); canvasPtr->flags = 0; @@ -806,7 +809,7 @@ CanvasWidgetCmd( "canvasy", "cget", "configure", "coords", "create", "dchars", "delete", "dtag", "find", "focus", "gettags", "icursor", - "image", "imove", "index", "insert", + "image", "imove", "index", "insert", "itemcget", "itemconfigure", "lower", "move", "moveto", "postscript", "raise", "rchars", "rotate", "scale", @@ -818,7 +821,7 @@ CanvasWidgetCmd( CANV_CANVASY, CANV_CGET, CANV_CONFIGURE, CANV_COORDS, CANV_CREATE, CANV_DCHARS, CANV_DELETE, CANV_DTAG, CANV_FIND, CANV_FOCUS, CANV_GETTAGS, CANV_ICURSOR, - CANV_IMAGE, CANV_IMOVE, CANV_INDEX, CANV_INSERT, + CANV_IMAGE, CANV_IMOVE, CANV_INDEX, CANV_INSERT, CANV_ITEMCGET, CANV_ITEMCONFIGURE, CANV_LOWER, CANV_MOVE, CANV_MOVETO, CANV_POSTSCRIPT, CANV_RAISE, CANV_RCHARS, CANV_ROTATE, CANV_SCALE, @@ -963,7 +966,7 @@ CanvasWidgetCmd( * If new tag expression, then insert in linked list. */ - TagSearchExpr *expr, **lastPtr; + TagSearchExpr *expr, **lastPtr; lastPtr = &(canvasPtr->bindTagExprs); while ((expr = *lastPtr) != NULL) { @@ -1420,21 +1423,21 @@ CanvasWidgetCmd( for (i = itemPtr->numTags-1; i != TCL_INDEX_NONE; i--) { if (itemPtr->tagPtr[i] == tag) { - /* - * Don't shuffle the tags sequence: memmove the tags. - */ + /* + * Don't shuffle the tags sequence: memmove the tags. + */ - memmove((void *)(itemPtr->tagPtr + i), - itemPtr->tagPtr + i + 1, - (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid)); + memmove((void *)(itemPtr->tagPtr + i), + itemPtr->tagPtr + i + 1, + (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid)); itemPtr->numTags--; - /* - * There must be no break here: all tags with the same name must - * be deleted. - */ + /* + * There must be no break here: all tags with the same name must + * be deleted. + */ - } + } } } break; @@ -1798,15 +1801,15 @@ CanvasWidgetCmd( x1 = itemPtr->x1; y1 = itemPtr->y1; x2 = itemPtr->x2; y2 = itemPtr->y2; - itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW; + itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW; ItemDelChars(canvasPtr, itemPtr, first, last); dontRedraw1 = itemPtr->redraw_flags & TK_ITEM_DONT_REDRAW; - itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW; + itemPtr->redraw_flags &= ~TK_ITEM_DONT_REDRAW; ItemInsert(canvasPtr, itemPtr, first, objv[5]); dontRedraw2 = itemPtr->redraw_flags & TK_ITEM_DONT_REDRAW; - if (!(dontRedraw1 && dontRedraw2)) { + if (!(dontRedraw1 && dontRedraw2)) { Tk_CanvasEventuallyRedraw((Tk_Canvas) canvasPtr, x1, y1, x2, y2); EventuallyRedrawItem(canvasPtr, itemPtr); @@ -2054,16 +2057,19 @@ CanvasWidgetCmd( break; case TK_SCROLL_PAGES: newX = (int) (canvasPtr->xOrigin + count * .9 - * (Tk_Width(canvasPtr->tkwin) - 2*canvasPtr->inset)); + * (Tk_Width(canvasPtr->tkwin) - 2 * canvasPtr->inset)); break; - case TK_SCROLL_UNITS: - if (canvasPtr->xScrollIncrement > 0) { - newX = canvasPtr->xOrigin + count*canvasPtr->xScrollIncrement; + case TK_SCROLL_UNITS: { + int xScrollIncrement; + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->xScrollIncrementObj, &xScrollIncrement); + if (xScrollIncrement > 0) { + newX = canvasPtr->xOrigin + count * xScrollIncrement; } else { newX = (int) (canvasPtr->xOrigin + count * .1 - * (Tk_Width(canvasPtr->tkwin) - 2*canvasPtr->inset)); + * (Tk_Width(canvasPtr->tkwin) - 2 * canvasPtr->inset)); } break; + } default: result = TCL_ERROR; goto done; @@ -2094,16 +2100,19 @@ CanvasWidgetCmd( break; case TK_SCROLL_PAGES: newY = (int) (canvasPtr->yOrigin + count * .9 - * (Tk_Height(canvasPtr->tkwin) - 2*canvasPtr->inset)); + * (Tk_Height(canvasPtr->tkwin) - 2 * canvasPtr->inset)); break; - case TK_SCROLL_UNITS: - if (canvasPtr->yScrollIncrement > 0) { - newY = canvasPtr->yOrigin + count*canvasPtr->yScrollIncrement; + case TK_SCROLL_UNITS: { + int yScrollIncrement; + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->yScrollIncrementObj, &yScrollIncrement); + if (yScrollIncrement > 0) { + newY = canvasPtr->yOrigin + count * yScrollIncrement; } else { newY = (int) (canvasPtr->yOrigin + count * .1 - * (Tk_Height(canvasPtr->tkwin) - 2*canvasPtr->inset)); + * (Tk_Height(canvasPtr->tkwin) - 2 * canvasPtr->inset)); } break; + } default: result = TCL_ERROR; goto done; @@ -2112,44 +2121,44 @@ CanvasWidgetCmd( break; } case CANV_IMAGE: { - Tk_PhotoHandle photohandle; - int subsample = 1, zoom = 1; + Tk_PhotoHandle photohandle; + int subsample = 1, zoom = 1; - if (objc < 3 || objc > 5) { - Tcl_WrongNumArgs(interp, 2, objv, "imagename ?subsample? ?zoom?"); - result = TCL_ERROR; - goto done; - } + if (objc < 3 || objc > 5) { + Tcl_WrongNumArgs(interp, 2, objv, "imagename ?subsample? ?zoom?"); + result = TCL_ERROR; + goto done; + } - if ((photohandle = Tk_FindPhoto(interp, Tcl_GetString(objv[2]) )) == 0) { - result = TCL_ERROR; - goto done; - } + if ((photohandle = Tk_FindPhoto(interp, Tcl_GetString(objv[2]) )) == 0) { + result = TCL_ERROR; + goto done; + } - /* - * If we are given a subsample or a zoom then grab them. - */ + /* + * If we are given a subsample or a zoom then grab them. + */ - if (objc >= 4 && Tcl_GetIntFromObj(interp, objv[3], &subsample) != TCL_OK) { - result = TCL_ERROR; - goto done; - } - if (objc >= 5 && Tcl_GetIntFromObj(interp, objv[4], &zoom) != TCL_OK) { - result = TCL_ERROR; - goto done; - } + if (objc >= 4 && Tcl_GetIntFromObj(interp, objv[3], &subsample) != TCL_OK) { + result = TCL_ERROR; + goto done; + } + if (objc >= 5 && Tcl_GetIntFromObj(interp, objv[4], &zoom) != TCL_OK) { + result = TCL_ERROR; + goto done; + } - /* - * Set the image size to zero, which allows the DrawCanvas() function - * to expand the image automatically when it copies the pixmap into it. - */ + /* + * Set the image size to zero, which allows the DrawCanvas() function + * to expand the image automatically when it copies the pixmap into it. + */ - if (Tk_PhotoSetSize(interp, photohandle, 0, 0) != TCL_OK) { - result = TCL_ERROR; - goto done; - } + if (Tk_PhotoSetSize(interp, photohandle, 0, 0) != TCL_OK) { + result = TCL_ERROR; + goto done; + } - result = DrawCanvas(interp, clientData, photohandle, subsample, zoom); + result = DrawCanvas(interp, clientData, photohandle, subsample, zoom); } } @@ -2259,6 +2268,8 @@ ConfigureCanvas( XGCValues gcValues; GC newGC; Tk_State old_canvas_state=canvasPtr->canvas_state; + int width, height, borderWidth, highlightWidth; + int xScrollIncrement, yScrollIncrement; if (Tk_ConfigureWidget(interp, canvasPtr->tkwin, configSpecs, objc, objv, canvasPtr, @@ -2273,10 +2284,70 @@ ConfigureCanvas( Tk_SetBackgroundFromBorder(canvasPtr->tkwin, canvasPtr->bgBorder); - if (canvasPtr->highlightWidth < 0) { - canvasPtr->highlightWidth = 0; + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->borderWidthObj, &borderWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->heightObj, &height); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->highlightWidthObj, &highlightWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved1, &canvasPtr->textInfo.insertBorderWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved2, &canvasPtr->textInfo.insertWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved3, &canvasPtr->textInfo.selBorderWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->widthObj, &width); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->xScrollIncrementObj, &xScrollIncrement); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->yScrollIncrementObj, &yScrollIncrement); + if (borderWidth < 0) { + borderWidth = 0; + Tcl_DecrRefCount(canvasPtr->borderWidthObj); + canvasPtr->borderWidthObj = Tcl_NewIntObj(0); + Tcl_IncrRefCount(canvasPtr->borderWidthObj); + } + if (height < 0) { + height = 0; + Tcl_DecrRefCount(canvasPtr->heightObj); + canvasPtr->heightObj = Tcl_NewIntObj(0); + Tcl_IncrRefCount(canvasPtr->heightObj); + } + if (highlightWidth < 0) { + highlightWidth = 0; + Tcl_DecrRefCount(canvasPtr->highlightWidthObj); + canvasPtr->highlightWidthObj = Tcl_NewIntObj(0); + Tcl_IncrRefCount(canvasPtr->highlightWidthObj); + } + if (width < 0) { + width = 0; + Tcl_DecrRefCount(canvasPtr->widthObj); + canvasPtr->widthObj = Tcl_NewIntObj(0); + Tcl_IncrRefCount(canvasPtr->widthObj); + } + if (xScrollIncrement < 0) { + xScrollIncrement = 0; + Tcl_DecrRefCount(canvasPtr->xScrollIncrementObj); + canvasPtr->xScrollIncrementObj = Tcl_NewIntObj(0); + Tcl_IncrRefCount(canvasPtr->xScrollIncrementObj); + } + if (yScrollIncrement < 0) { + yScrollIncrement = 0; + Tcl_DecrRefCount(canvasPtr->yScrollIncrementObj); + canvasPtr->yScrollIncrementObj = Tcl_NewIntObj(0); + Tcl_IncrRefCount(canvasPtr->yScrollIncrementObj); + } + canvasPtr->inset = borderWidth + highlightWidth; + if (canvasPtr->textInfo.insertBorderWidth < 0) { + canvasPtr->textInfo.insertBorderWidth = 0; + Tcl_DecrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved1); + canvasPtr->textInfo.reserved1 = Tcl_NewIntObj(0); + Tcl_IncrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved1); + } + if (canvasPtr->textInfo.insertWidth < 0) { + canvasPtr->textInfo.insertWidth = 0; + Tcl_DecrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved2); + canvasPtr->textInfo.reserved2 = Tcl_NewIntObj(0); + Tcl_IncrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved2); + } + if (canvasPtr->textInfo.selBorderWidth < 0) { + canvasPtr->textInfo.selBorderWidth = 0; + Tcl_DecrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved3); + canvasPtr->textInfo.reserved3 = Tcl_NewIntObj(0); + Tcl_IncrRefCount((Tcl_Obj *)canvasPtr->textInfo.reserved3); } - canvasPtr->inset = canvasPtr->borderWidth + canvasPtr->highlightWidth; gcValues.function = GXcopy; gcValues.graphics_exposures = False; @@ -2297,7 +2368,7 @@ ConfigureCanvas( int result; for ( itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL; - itemPtr = itemPtr->nextPtr) { + itemPtr = itemPtr->nextPtr) { if ( itemPtr->state == TK_STATE_NULL ) { result = (*itemPtr->typePtr->configProc)(canvasPtr->interp, (Tk_Canvas) canvasPtr, itemPtr, 0, NULL, @@ -2313,8 +2384,8 @@ ConfigureCanvas( * Reset the desired dimensions for the window. */ - Tk_GeometryRequest(canvasPtr->tkwin, canvasPtr->width + 2*canvasPtr->inset, - canvasPtr->height + 2*canvasPtr->inset); + Tk_GeometryRequest(canvasPtr->tkwin, width + 2 * canvasPtr->inset, + height + 2 * canvasPtr->inset); /* * Restart the cursor timing sequence in case the on-time or off-time just @@ -2333,22 +2404,22 @@ ConfigureCanvas( canvasPtr->scrollY1 = 0; canvasPtr->scrollX2 = 0; canvasPtr->scrollY2 = 0; - if (canvasPtr->regionString != NULL) { + if (canvasPtr->regionObj != NULL) { Tcl_Size argc2; const char **argv2; - if (Tcl_SplitList(canvasPtr->interp, canvasPtr->regionString, + if (Tcl_SplitList(canvasPtr->interp, Tcl_GetString(canvasPtr->regionObj), &argc2, &argv2) != TCL_OK) { return TCL_ERROR; } if (argc2 != 4) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( - "bad scrollRegion \"%s\"", canvasPtr->regionString)); + "bad scrollRegion \"%s\"", Tcl_GetString(canvasPtr->regionObj))); Tcl_SetErrorCode(interp, "TK", "CANVAS", "SCROLL_REGION", (char *)NULL); badRegion: - ckfree(canvasPtr->regionString); + Tcl_DecrRefCount(canvasPtr->regionObj); ckfree(argv2); - canvasPtr->regionString = NULL; + canvasPtr->regionObj = NULL; return TCL_ERROR; } if ((Tk_GetPixels(canvasPtr->interp, canvasPtr->tkwin, @@ -2368,16 +2439,16 @@ ConfigureCanvas( if (flags & TK_OFFSET_LEFT) { canvasPtr->tsoffset.xoffset = 0; } else if (flags & TK_OFFSET_CENTER) { - canvasPtr->tsoffset.xoffset = canvasPtr->width/2; + canvasPtr->tsoffset.xoffset = width / 2; } else if (flags & TK_OFFSET_RIGHT) { - canvasPtr->tsoffset.xoffset = canvasPtr->width; + canvasPtr->tsoffset.xoffset = width; } if (flags & TK_OFFSET_TOP) { canvasPtr->tsoffset.yoffset = 0; } else if (flags & TK_OFFSET_MIDDLE) { - canvasPtr->tsoffset.yoffset = canvasPtr->height/2; + canvasPtr->tsoffset.yoffset = height / 2; } else if (flags & TK_OFFSET_BOTTOM) { - canvasPtr->tsoffset.yoffset = canvasPtr->height; + canvasPtr->tsoffset.yoffset = height; } /* @@ -2421,6 +2492,10 @@ CanvasWorldChanged( TkCanvas *canvasPtr = (TkCanvas *)instanceData; Tk_Item *itemPtr; + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved1, &canvasPtr->textInfo.insertBorderWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved2, &canvasPtr->textInfo.insertWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, (Tcl_Obj *)canvasPtr->textInfo.reserved3, &canvasPtr->textInfo.selBorderWidth); + itemPtr = canvasPtr->firstItemPtr; for ( ; itemPtr != NULL; itemPtr = itemPtr->nextPtr) { if (ItemConfigure(canvasPtr, itemPtr, 0, NULL) != TCL_OK) { @@ -2466,31 +2541,31 @@ DecomposeMaskToShiftAndBits( */ for (i = 0; i < 32; ++i) { - if (mask & 1 << i) - break; + if (mask & 1 << i) + break; } if (i < 32) { - *shift = i; + *shift = i; - /* - * Now find the next '0' bit and the width of the mask. - */ + /* + * Now find the next '0' bit and the width of the mask. + */ - for ( ; i < 32; ++i) { - if ((mask & 1 << i) == 0) - break; - else - ++*bits; - } + for ( ; i < 32; ++i) { + if ((mask & 1 << i) == 0) + break; + else + ++*bits; + } - /* - * Limit to the top 8 bits if the mask was wider than 8. - */ + /* + * Limit to the top 8 bits if the mask was wider than 8. + */ - if (*bits > 8) { - *shift += *bits - 8; - *bits = 8; - } + if (*bits > 8) { + *shift += *bits - 8; + *bits = 8; + } } } @@ -2515,7 +2590,7 @@ DecomposeMaskToShiftAndBits( */ #define OVERDRAW_PIXELS 32 /* How much larger we make the pixmap - * that the canvas objects are drawn into */ + * that the canvas objects are drawn into */ #ifdef WORDS_BIGENDIAN #define IS_BIG_ENDIAN 1 @@ -2546,18 +2621,18 @@ DrawCanvas( GC xgc = 0; XGCValues xgcValues; int canvasX1, canvasY1, canvasX2, canvasY2, cWidth, cHeight, - pixmapX1, pixmapY1, pixmapX2, pixmapY2, pmWidth, pmHeight, - bitsPerPixel, bytesPerPixel, x, y, result = TCL_OK, - rshift, gshift, bshift, rbits, gbits, bbits; + pixmapX1, pixmapY1, pixmapX2, pixmapY2, pmWidth, pmHeight, + bitsPerPixel, bytesPerPixel, x, y, result = TCL_OK, + rshift, gshift, bshift, rbits, gbits, bbits; #ifdef DEBUG_DRAWCANVAS char buffer[128]; #endif if ((tkwin = canvasPtr->tkwin) == NULL) { - Tcl_AppendResult(interp, "canvas tkwin is NULL!", (char *)NULL); - result = TCL_ERROR; - goto done; + Tcl_AppendResult(interp, "canvas tkwin is NULL!", (char *)NULL); + result = TCL_ERROR; + goto done; } /* @@ -2568,21 +2643,21 @@ DrawCanvas( do { - if ((displayPtr = Tk_Display(tkwin)) == NULL) { - Tcl_AppendResult(interp, "canvas (or parent) display is NULL!", (char *)NULL); - result = TCL_ERROR; - goto done; - } + if ((displayPtr = Tk_Display(tkwin)) == NULL) { + Tcl_AppendResult(interp, "canvas (or parent) display is NULL!", (char *)NULL); + result = TCL_ERROR; + goto done; + } - if ((wid = Tk_WindowId(tkwin)) != 0) { - continue; - } + if ((wid = Tk_WindowId(tkwin)) != 0) { + continue; + } - if ((tkwin = Tk_Parent(tkwin)) == NULL) { - Tcl_AppendResult(interp, "canvas has no parent with a valid window id! Is the toplevel window mapped?", (char *)NULL); - result = TCL_ERROR; - goto done; - } + if ((tkwin = Tk_Parent(tkwin)) == NULL) { + Tcl_AppendResult(interp, "canvas has no parent with a valid window id! Is the toplevel window mapped?", (char *)NULL); + result = TCL_ERROR; + goto done; + } } while (wid == 0); @@ -2590,9 +2665,9 @@ DrawCanvas( visualPtr = Tk_Visual(tkwin); if (subsample == 0) { - Tcl_AppendResult(interp, "subsample cannot be zero", (char *)NULL); - result = TCL_ERROR; - goto done; + Tcl_AppendResult(interp, "subsample cannot be zero", (char *)NULL); + result = TCL_ERROR; + goto done; } /* @@ -2602,12 +2677,12 @@ DrawCanvas( */ for (itemPtr = canvasPtr -> firstItemPtr; itemPtr != NULL; - itemPtr = itemPtr -> nextPtr) { - if (itemPtr -> redraw_flags & FORCE_REDRAW) { - itemPtr -> redraw_flags &= ~FORCE_REDRAW; - EventuallyRedrawItem(canvasPtr, itemPtr); - itemPtr -> redraw_flags &= ~FORCE_REDRAW; - } + itemPtr = itemPtr -> nextPtr) { + if (itemPtr -> redraw_flags & FORCE_REDRAW) { + itemPtr -> redraw_flags &= ~FORCE_REDRAW; + EventuallyRedrawItem(canvasPtr, itemPtr); + itemPtr -> redraw_flags &= ~FORCE_REDRAW; + } } /* @@ -2618,23 +2693,23 @@ DrawCanvas( * of 0,0. */ if (canvasPtr->scrollX1 != 0 || canvasPtr->scrollY1 != 0 || - canvasPtr->scrollX2 != 0 || canvasPtr->scrollY2 != 0) { + canvasPtr->scrollX2 != 0 || canvasPtr->scrollY2 != 0) { - canvasX1 = canvasPtr->scrollX1; - canvasY1 = canvasPtr->scrollY1; - canvasX2 = canvasPtr->scrollX2; - canvasY2 = canvasPtr->scrollY2; - cWidth = canvasX2 - canvasX1 + 1; - cHeight = canvasY2 - canvasY1 + 1; + canvasX1 = canvasPtr->scrollX1; + canvasY1 = canvasPtr->scrollY1; + canvasX2 = canvasPtr->scrollX2; + canvasY2 = canvasPtr->scrollY2; + cWidth = canvasX2 - canvasX1 + 1; + cHeight = canvasY2 - canvasY1 + 1; } else { - cWidth = Tk_Width(tkwin); - cHeight = Tk_Height(tkwin); - canvasX1 = 0; - canvasY1 = 0; - canvasX2 = canvasX1 + cWidth - 1; - canvasY2 = canvasY1 + cHeight - 1; + cWidth = Tk_Width(tkwin); + cHeight = Tk_Height(tkwin); + canvasX1 = 0; + canvasY1 = 0; + canvasX2 = canvasX1 + cWidth - 1; + canvasY2 = canvasY1 + cHeight - 1; } /* @@ -2650,10 +2725,10 @@ DrawCanvas( pmWidth = pixmapX2 - pixmapX1 + 1; pmHeight = pixmapY2 - pixmapY1 + 1; if ((pixmap = Tk_GetPixmap(displayPtr, Tk_WindowId(tkwin), pmWidth, pmHeight, - bitsPerPixel)) == 0) { - Tcl_AppendResult(interp, "failed to create drawing Pixmap", (char *)NULL); - result = TCL_ERROR; - goto done; + bitsPerPixel)) == 0) { + Tcl_AppendResult(interp, "failed to create drawing Pixmap", (char *)NULL); + result = TCL_ERROR; + goto done; } /* @@ -2673,20 +2748,20 @@ DrawCanvas( canvasPtr->drawableXOrigin = pixmapX1; canvasPtr->drawableYOrigin = pixmapY1; for (itemPtr = canvasPtr->firstItemPtr; itemPtr != NULL; - itemPtr = itemPtr->nextPtr) { - if ((itemPtr->x1 >= pixmapX2) || (itemPtr->y1 >= pixmapY2) || - (itemPtr->x2 < pixmapX1) || (itemPtr->y2 < pixmapY1)) { - if (!AlwaysRedraw(itemPtr)) { - continue; - } - } - if (itemPtr->state == TK_STATE_HIDDEN || - (itemPtr->state == TK_STATE_NULL && canvasPtr->canvas_state - == TK_STATE_HIDDEN)) { - continue; - } - ItemDisplay(canvasPtr, itemPtr, pixmap, pixmapX1, pixmapY1, pmWidth, - pmHeight); + itemPtr = itemPtr->nextPtr) { + if ((itemPtr->x1 >= pixmapX2) || (itemPtr->y1 >= pixmapY2) || + (itemPtr->x2 < pixmapX1) || (itemPtr->y2 < pixmapY1)) { + if (!AlwaysRedraw(itemPtr)) { + continue; + } + } + if (itemPtr->state == TK_STATE_HIDDEN || + (itemPtr->state == TK_STATE_NULL && canvasPtr->canvas_state + == TK_STATE_HIDDEN)) { + continue; + } + ItemDisplay(canvasPtr, itemPtr, pixmap, pixmapX1, pixmapY1, pmWidth, + pmHeight); } /* @@ -2697,10 +2772,10 @@ DrawCanvas( */ if ((ximagePtr = XGetImage(displayPtr, pixmap, -pixmapX1, -pixmapY1, cWidth, - cHeight, AllPlanes, ZPixmap)) == NULL) { - Tcl_AppendResult(interp, "failed to copy Pixmap to XImage", (char *)NULL); - result = TCL_ERROR; - goto done; + cHeight, AllPlanes, ZPixmap)) == NULL) { + Tcl_AppendResult(interp, "failed to copy Pixmap to XImage", (char *)NULL); + result = TCL_ERROR; + goto done; } #ifdef DEBUG_DRAWCANVAS @@ -2713,18 +2788,18 @@ DrawCanvas( if (ximagePtr->data != NULL) { int ix, iy; - Tcl_AppendResult(interp, " {", (char *)NULL); + Tcl_AppendResult(interp, " {", (char *)NULL); for (iy = 0; iy < ximagePtr->height; ++ iy) { Tcl_AppendResult(interp, " {", (char *)NULL); for (ix = 0; ix < ximagePtr->bytes_per_line; ++ ix) { - if (ix > 0) { - if (ix % 4 == 0) - Tcl_AppendResult(interp, "-", (char *)NULL); - else - Tcl_AppendResult(interp, " ", (char *)NULL); - } - snprintf(buffer,sizeof(buffer),"%2.2x",ximagePtr->data[ximagePtr->bytes_per_line * iy + ix]&0xFF); - Tcl_AppendResult(interp, buffer, (char *)NULL); + if (ix > 0) { + if (ix % 4 == 0) + Tcl_AppendResult(interp, "-", (char *)NULL); + else + Tcl_AppendResult(interp, " ", (char *)NULL); + } + snprintf(buffer,sizeof(buffer),"%2.2x",ximagePtr->data[ximagePtr->bytes_per_line * iy + ix]&0xFF); + Tcl_AppendResult(interp, buffer, (char *)NULL); } Tcl_AppendResult(interp, " }", (char *)NULL); } @@ -2806,62 +2881,62 @@ DrawCanvas( for (y = 0; y < blockPtr.height; ++y) { #ifdef DEBUG_DRAWCANVAS - Tcl_AppendResult(interp, " {", (char *)NULL); + Tcl_AppendResult(interp, " {", (char *)NULL); #endif - for(x = 0; x < blockPtr.width; ++x) { - unsigned int pixel = 0; + for(x = 0; x < blockPtr.width; ++x) { + unsigned int pixel = 0; int pixel_offset = blockPtr.pitch * y + blockPtr.pixelSize * x; - switch (ximagePtr->bits_per_pixel) { - - /* - * Get an 8 bit pixel from the XImage. - */ - - case 8 : - pixel = *((unsigned char *)(ximagePtr->data + bytesPerPixel * x - + ximagePtr->bytes_per_line * y)); - break; - - /* - * Get a 16 bit pixel from the XImage, and correct the - * byte order as necessary. - */ - - case 16 : - pixel = *((unsigned short *)(ximagePtr->data + bytesPerPixel * x - + ximagePtr->bytes_per_line * y)); - if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst) - || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst)) - pixel = BYTE_SWAP16(pixel); - break; - - /* - * Grab a 32 bit pixel from the XImage, and correct the - * byte order as necessary. - */ - - case 32 : - pixel = *((unsigned int *)(ximagePtr->data + bytesPerPixel * x - + ximagePtr->bytes_per_line * y)); - if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst) - || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst)) - pixel = BYTE_SWAP32(pixel); - break; - } - - /* - * We have a pixel with the correct byte order, so pull out the - * colours and place them in the photo block. Perhaps we could - * just not bother with the alpha byte because we are using - * TK_PHOTO_COMPOSITE_SET later? - * ***Windows: We have to swap the red and blue values. The - * XImage storage is B - G - R - A which becomes a 32bit ARGB - * quad. However the visual mask is a 32bit ABGR quad. And - * Tk_PhotoPutBlock() wants R-G-B-A which is a 32bit ABGR quad. - * If the visual mask was correct there would be no need to - * swap anything here. - */ + switch (ximagePtr->bits_per_pixel) { + + /* + * Get an 8 bit pixel from the XImage. + */ + + case 8 : + pixel = *((unsigned char *)(ximagePtr->data + bytesPerPixel * x + + ximagePtr->bytes_per_line * y)); + break; + + /* + * Get a 16 bit pixel from the XImage, and correct the + * byte order as necessary. + */ + + case 16 : + pixel = *((unsigned short *)(ximagePtr->data + bytesPerPixel * x + + ximagePtr->bytes_per_line * y)); + if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst) + || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst)) + pixel = BYTE_SWAP16(pixel); + break; + + /* + * Grab a 32 bit pixel from the XImage, and correct the + * byte order as necessary. + */ + + case 32 : + pixel = *((unsigned int *)(ximagePtr->data + bytesPerPixel * x + + ximagePtr->bytes_per_line * y)); + if ((IS_BIG_ENDIAN && ximagePtr->byte_order == LSBFirst) + || (!IS_BIG_ENDIAN && ximagePtr->byte_order == MSBFirst)) + pixel = BYTE_SWAP32(pixel); + break; + } + + /* + * We have a pixel with the correct byte order, so pull out the + * colours and place them in the photo block. Perhaps we could + * just not bother with the alpha byte because we are using + * TK_PHOTO_COMPOSITE_SET later? + * ***Windows: We have to swap the red and blue values. The + * XImage storage is B - G - R - A which becomes a 32bit ARGB + * quad. However the visual mask is a 32bit ABGR quad. And + * Tk_PhotoPutBlock() wants R-G-B-A which is a 32bit ABGR quad. + * If the visual mask was correct there would be no need to + * swap anything here. + */ #ifdef _WIN32 #define R_OFFSET blockPtr.offset[2] @@ -2888,11 +2963,11 @@ DrawCanvas( *((unsigned int *) (blockPtr.pixelPtr + pixel_offset)) = pixel; } else { blockPtr.pixelPtr[pixel_offset + R_OFFSET] = - (unsigned char)((pixel & visualPtr->red_mask) >> rshift); + (unsigned char)((pixel & visualPtr->red_mask) >> rshift); blockPtr.pixelPtr[pixel_offset + G_OFFSET] = - (unsigned char)((pixel & visualPtr->green_mask) >> gshift); + (unsigned char)((pixel & visualPtr->green_mask) >> gshift); blockPtr.pixelPtr[pixel_offset + B_OFFSET] = - (unsigned char)((pixel & visualPtr->blue_mask) >> bshift); + (unsigned char)((pixel & visualPtr->blue_mask) >> bshift); blockPtr.pixelPtr[pixel_offset + A_OFFSET] = 0xFF; } @@ -2903,25 +2978,25 @@ DrawCanvas( blockPtr.pixelPtr[pixel_offset + 1], blockPtr.pixelPtr[pixel_offset + 2], blockPtr.pixelPtr[pixel_offset + 3]); - { + { int ix; - if (x > 0) - Tcl_AppendResult(interp, "-", (char *)NULL); - for (ix = 0; ix < 4; ++ix) { - if (ix > 0) - Tcl_AppendResult(interp, " ", (char *)NULL); + if (x > 0) + Tcl_AppendResult(interp, "-", (char *)NULL); + for (ix = 0; ix < 4; ++ix) { + if (ix > 0) + Tcl_AppendResult(interp, " ", (char *)NULL); snprintf(buffer,sizeof(buffer),"%2.2x", - blockPtr.pixelPtr[blockPtr.pitch * y - + blockPtr.pixelSize * x + ix]&0xFF); - Tcl_AppendResult(interp, buffer, (char *)NULL); - } - } + blockPtr.pixelPtr[blockPtr.pitch * y + + blockPtr.pixelSize * x + ix]&0xFF); + Tcl_AppendResult(interp, buffer, (char *)NULL); + } + } #endif - } + } #ifdef DEBUG_DRAWCANVAS - Tcl_AppendResult(interp, " }", (char *)NULL); + Tcl_AppendResult(interp, " }", (char *)NULL); #endif } @@ -2936,17 +3011,17 @@ DrawCanvas( */ if (subsample != 1 || zoom != 1) { - if ((result = Tk_PhotoPutZoomedBlock(interp, photohandle, &blockPtr, - 0, 0, cWidth * zoom / subsample, cHeight * zoom / subsample, - zoom, zoom, subsample, subsample, TK_PHOTO_COMPOSITE_SET)) - != TCL_OK) { - goto done; - } + if ((result = Tk_PhotoPutZoomedBlock(interp, photohandle, &blockPtr, + 0, 0, cWidth * zoom / subsample, cHeight * zoom / subsample, + zoom, zoom, subsample, subsample, TK_PHOTO_COMPOSITE_SET)) + != TCL_OK) { + goto done; + } } else { - if ((result = Tk_PhotoPutBlock(interp, photohandle, &blockPtr, 0, 0, - cWidth, cHeight, TK_PHOTO_COMPOSITE_SET)) != TCL_OK) { - goto done; - } + if ((result = Tk_PhotoPutBlock(interp, photohandle, &blockPtr, 0, 0, + cWidth, cHeight, TK_PHOTO_COMPOSITE_SET)) != TCL_OK) { + goto done; + } } /* @@ -2955,13 +3030,13 @@ DrawCanvas( done: if (blockPtr.pixelPtr) - ckfree(blockPtr.pixelPtr); + ckfree(blockPtr.pixelPtr); if (pixmap) - Tk_FreePixmap(Tk_Display(tkwin), pixmap); + Tk_FreePixmap(Tk_Display(tkwin), pixmap); if (ximagePtr) - XDestroyImage(ximagePtr); + XDestroyImage(ximagePtr); if (xgc) - XFreeGC(displayPtr,xgc); + XFreeGC(displayPtr,xgc); return result; } @@ -2992,10 +3067,7 @@ DisplayCanvas( Tk_Item *itemPtr; Pixmap pixmap; int screenX1, screenX2, screenY1, screenY2, width, height; -#ifdef MAC_OSX_TK - TkWindow *winPtr; - MacDrawable *macWin; -#endif + int borderWidth, highlightWidth; if (canvasPtr->tkwin == NULL) { return; @@ -3005,19 +3077,6 @@ DisplayCanvas( goto done; } -#ifdef MAC_OSX_TK - /* - * If drawing is disabled, all we need to do is - * clear the REDRAW_PENDING flag. - */ - winPtr = (TkWindow *)(canvasPtr->tkwin); - macWin = winPtr->privatePtr; - if (macWin && (macWin->flags & TK_DO_NOT_DRAW)){ - canvasPtr->flags &= ~REDRAW_PENDING; - return; - } -#endif - /* * Choose a new current item if that is needed (this could cause event * handlers to be invoked). @@ -3186,17 +3245,18 @@ DisplayCanvas( */ borders: + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->borderWidthObj, &borderWidth); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->highlightWidthObj, &highlightWidth); if (canvasPtr->flags & REDRAW_BORDERS) { canvasPtr->flags &= ~REDRAW_BORDERS; - if (canvasPtr->borderWidth > 0) { + if (borderWidth > 0) { Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin), - canvasPtr->bgBorder, canvasPtr->highlightWidth, - canvasPtr->highlightWidth, - Tk_Width(tkwin) - 2*canvasPtr->highlightWidth, - Tk_Height(tkwin) - 2*canvasPtr->highlightWidth, - canvasPtr->borderWidth, canvasPtr->relief); + canvasPtr->bgBorder, highlightWidth, highlightWidth, + Tk_Width(tkwin) - 2 * highlightWidth, + Tk_Height(tkwin) - 2 * highlightWidth, + borderWidth, canvasPtr->relief); } - if (canvasPtr->highlightWidth > 0) { + if (highlightWidth > 0) { GC fgGC, bgGC; bgGC = Tk_GCForColor(canvasPtr->highlightBgColorPtr, @@ -3204,11 +3264,11 @@ DisplayCanvas( if (canvasPtr->textInfo.gotFocus) { fgGC = Tk_GCForColor(canvasPtr->highlightColorPtr, Tk_WindowId(tkwin)); - Tk_DrawHighlightBorder(tkwin, fgGC, bgGC, - canvasPtr->highlightWidth, Tk_WindowId(tkwin)); + Tk_DrawHighlightBorder(tkwin, fgGC, bgGC, + highlightWidth, Tk_WindowId(tkwin)); } else { - Tk_DrawHighlightBorder(tkwin, bgGC, bgGC, - canvasPtr->highlightWidth, Tk_WindowId(tkwin)); + Tk_DrawHighlightBorder(tkwin, bgGC, bgGC, + highlightWidth, Tk_WindowId(tkwin)); } } } @@ -3388,7 +3448,7 @@ Tk_CanvasEventuallyRedraw( } if ((x1 >= x2) || (y1 >= y2) || - (x2 < canvasPtr->xOrigin) || (y2 < canvasPtr->yOrigin) || + (x2 < canvasPtr->xOrigin) || (y2 < canvasPtr->yOrigin) || (x1 >= canvasPtr->xOrigin + Tk_Width(canvasPtr->tkwin)) || (y1 >= canvasPtr->yOrigin + Tk_Height(canvasPtr->tkwin))) { return; @@ -3446,7 +3506,7 @@ EventuallyRedrawItem( return; } if ((itemPtr->x1 >= itemPtr->x2) || (itemPtr->y1 >= itemPtr->y2) || - (itemPtr->x2 < canvasPtr->xOrigin) || + (itemPtr->x2 < canvasPtr->xOrigin) || (itemPtr->y2 < canvasPtr->yOrigin) || (itemPtr->x1 >= canvasPtr->xOrigin+Tk_Width(canvasPtr->tkwin)) || (itemPtr->y1 >= canvasPtr->yOrigin+Tk_Height(canvasPtr->tkwin))) { @@ -3694,7 +3754,7 @@ TagSearchExprDestroy( TagSearchExpr *expr) { if (expr != NULL) { - if (expr->uids) { + if (expr->uids) { ckfree(expr->uids); } ckfree(expr); @@ -5302,9 +5362,9 @@ PickCurrentItem( for (i = itemPtr->numTags-1; i != TCL_INDEX_NONE; i--) { if (itemPtr->tagPtr[i] == searchUids->currentUid) /* then */ { - memmove((void *)(itemPtr->tagPtr + i), - itemPtr->tagPtr + i + 1, - (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid)); + memmove((void *)(itemPtr->tagPtr + i), + itemPtr->tagPtr + i + 1, + (itemPtr->numTags - (i+1)) * sizeof(Tk_Uid)); itemPtr->numTags--; break; } @@ -5473,7 +5533,7 @@ CanvasDoEvent( expr = canvasPtr->bindTagExprs; while (expr) { expr->index = 0; - expr->match = TagSearchEvalExpr(expr, itemPtr); + expr->match = TagSearchEvalExpr(expr, itemPtr); if (expr->match) { numExprs++; } @@ -5499,7 +5559,7 @@ CanvasDoEvent( i = itemPtr->numTags+2; expr = canvasPtr->bindTagExprs; while (expr) { - if (expr->match) { + if (expr->match) { objectPtr[i++] = (int *) expr->uid; } expr = expr->next; @@ -5582,6 +5642,8 @@ CanvasFocusProc( int gotFocus) /* 1 means window is getting focus, 0 means * it's losing it. */ { + int highlightWidth; + Tcl_DeleteTimerHandler(canvasPtr->insertBlinkHandler); if (gotFocus) { canvasPtr->textInfo.gotFocus = 1; @@ -5596,7 +5658,8 @@ CanvasFocusProc( canvasPtr->insertBlinkHandler = NULL; } EventuallyRedrawItem(canvasPtr, canvasPtr->textInfo.focusItemPtr); - if (canvasPtr->highlightWidth > 0) { + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->highlightWidthObj, &highlightWidth); + if (highlightWidth > 0) { canvasPtr->flags |= REDRAW_BORDERS; if (!(canvasPtr->flags & REDRAW_PENDING)) { Tcl_DoWhenIdle(DisplayCanvas, canvasPtr); @@ -5843,7 +5906,7 @@ CanvasUpdateScrollbars( Tcl_Interp *interp; int xOrigin, yOrigin, inset, width, height; int scrollX1, scrollX2, scrollY1, scrollY2; - char *xScrollCmd, *yScrollCmd; + Tcl_Obj *xScrollCmdObj, *yScrollCmdObj; Tcl_DString buf; /* @@ -5853,13 +5916,13 @@ CanvasUpdateScrollbars( interp = canvasPtr->interp; Tcl_Preserve(interp); - xScrollCmd = canvasPtr->xScrollCmd; - if (xScrollCmd != NULL) { - Tcl_Preserve(xScrollCmd); + xScrollCmdObj = canvasPtr->xScrollCmdObj; + if (xScrollCmdObj != NULL) { + Tcl_IncrRefCount(xScrollCmdObj); } - yScrollCmd = canvasPtr->yScrollCmd; - if (yScrollCmd != NULL) { - Tcl_Preserve(yScrollCmd); + yScrollCmdObj = canvasPtr->yScrollCmdObj; + if (yScrollCmdObj != NULL) { + Tcl_IncrRefCount(yScrollCmdObj); } xOrigin = canvasPtr->xOrigin; yOrigin = canvasPtr->yOrigin; @@ -5871,12 +5934,12 @@ CanvasUpdateScrollbars( scrollY1 = canvasPtr->scrollY1; scrollY2 = canvasPtr->scrollY2; canvasPtr->flags &= ~UPDATE_SCROLLBARS; - if (canvasPtr->xScrollCmd != NULL) { + if (canvasPtr->xScrollCmdObj != NULL) { Tcl_Obj *fractions = ScrollFractions(xOrigin + inset, xOrigin + width - inset, scrollX1, scrollX2); Tcl_DStringInit(&buf); - Tcl_DStringAppend(&buf, xScrollCmd, TCL_INDEX_NONE); + Tcl_DStringAppend(&buf, Tcl_GetString(xScrollCmdObj), TCL_INDEX_NONE); Tcl_DStringAppend(&buf, " ", TCL_INDEX_NONE); Tcl_DStringAppend(&buf, Tcl_GetString(fractions), TCL_INDEX_NONE); result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), TCL_INDEX_NONE, TCL_EVAL_GLOBAL); @@ -5886,15 +5949,15 @@ CanvasUpdateScrollbars( Tcl_BackgroundException(interp, result); } Tcl_ResetResult(interp); - Tcl_Release(xScrollCmd); + Tcl_DecrRefCount(xScrollCmdObj); } - if (yScrollCmd != NULL) { + if (yScrollCmdObj != NULL) { Tcl_Obj *fractions = ScrollFractions(yOrigin + inset, yOrigin + height - inset, scrollY1, scrollY2); Tcl_DStringInit(&buf); - Tcl_DStringAppend(&buf, yScrollCmd, TCL_INDEX_NONE); + Tcl_DStringAppend(&buf, Tcl_GetString(yScrollCmdObj), TCL_INDEX_NONE); Tcl_DStringAppend(&buf, " ", TCL_INDEX_NONE); Tcl_DStringAppend(&buf, Tcl_GetString(fractions), TCL_INDEX_NONE); result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), TCL_INDEX_NONE, TCL_EVAL_GLOBAL); @@ -5904,7 +5967,7 @@ CanvasUpdateScrollbars( Tcl_BackgroundException(interp, result); } Tcl_ResetResult(interp); - Tcl_Release(yScrollCmd); + Tcl_DecrRefCount(yScrollCmdObj); } Tcl_Release(interp); } @@ -5938,6 +6001,7 @@ CanvasSetOrigin( * window). */ { int left, right, top, bottom, delta; + int xScrollIncrement, yScrollIncrement; /* * If scroll increments have been set, round the window origin to the @@ -5945,26 +6009,28 @@ CanvasSetOrigin( * just inside the borders, not the upper left corner. */ - if (canvasPtr->xScrollIncrement > 0) { + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->xScrollIncrementObj, &xScrollIncrement); + Tk_GetPixelsFromObj(NULL, canvasPtr->tkwin, canvasPtr->yScrollIncrementObj, &yScrollIncrement); + if (xScrollIncrement > 0) { if (xOrigin >= 0) { - xOrigin += canvasPtr->xScrollIncrement/2; + xOrigin += xScrollIncrement/2; xOrigin -= (xOrigin + canvasPtr->inset) - % canvasPtr->xScrollIncrement; + % xScrollIncrement; } else { - xOrigin = (-xOrigin) + canvasPtr->xScrollIncrement/2; + xOrigin = (-xOrigin) + xScrollIncrement/2; xOrigin = -(xOrigin - (xOrigin - canvasPtr->inset) - % canvasPtr->xScrollIncrement); + % xScrollIncrement); } } - if (canvasPtr->yScrollIncrement > 0) { + if (yScrollIncrement > 0) { if (yOrigin >= 0) { - yOrigin += canvasPtr->yScrollIncrement/2; + yOrigin += yScrollIncrement/2; yOrigin -= (yOrigin + canvasPtr->inset) - % canvasPtr->yScrollIncrement; + % yScrollIncrement; } else { - yOrigin = (-yOrigin) + canvasPtr->yScrollIncrement/2; + yOrigin = (-yOrigin) + yScrollIncrement/2; yOrigin = -(yOrigin - (yOrigin - canvasPtr->inset) - % canvasPtr->yScrollIncrement); + % yScrollIncrement); } } @@ -5979,7 +6045,7 @@ CanvasSetOrigin( * full increments. */ - if ((canvasPtr->confine) && (canvasPtr->regionString != NULL)) { + if ((canvasPtr->confine) && (canvasPtr->regionObj != NULL)) { left = xOrigin + canvasPtr->inset - canvasPtr->scrollX1; right = canvasPtr->scrollX2 - (xOrigin + Tk_Width(canvasPtr->tkwin) - canvasPtr->inset); @@ -5988,27 +6054,27 @@ CanvasSetOrigin( - (yOrigin + Tk_Height(canvasPtr->tkwin) - canvasPtr->inset); if ((left < 0) && (right > 0)) { delta = (right > -left) ? -left : right; - if (canvasPtr->xScrollIncrement > 0) { - delta -= delta % canvasPtr->xScrollIncrement; + if (xScrollIncrement > 0) { + delta -= delta % xScrollIncrement; } xOrigin += delta; } else if ((right < 0) && (left > 0)) { delta = (left > -right) ? -right : left; - if (canvasPtr->xScrollIncrement > 0) { - delta -= delta % canvasPtr->xScrollIncrement; + if (xScrollIncrement > 0) { + delta -= delta % xScrollIncrement; } xOrigin -= delta; } if ((top < 0) && (bottom > 0)) { delta = (bottom > -top) ? -top : bottom; - if (canvasPtr->yScrollIncrement > 0) { - delta -= delta % canvasPtr->yScrollIncrement; + if (yScrollIncrement > 0) { + delta -= delta % yScrollIncrement; } yOrigin += delta; } else if ((bottom < 0) && (top > 0)) { delta = (top > -bottom) ? -bottom : top; - if (canvasPtr->yScrollIncrement > 0) { - delta -= delta % canvasPtr->yScrollIncrement; + if (yScrollIncrement > 0) { + delta -= delta % yScrollIncrement; } yOrigin -= delta; } |
