summaryrefslogtreecommitdiffstats
path: root/graphics/tclblt/patches/04-fedora-tk8.5.6.patch
blob: 537c1fb3b9e5d95d98feb2635430acdaf10e8b3b (plain)
   * Apply 3 changes based on revisions developed by the fedora linux team.
     + 03-fedora-patch-2.diff
 --> + 04-fedora-tk8.5.6.patch.diff
     + 05-tk8.5-zoomstack.diff
    * Those patches are required to solve segmentation faults that are observed
     when blt is used with tcltk 8.5. We have a substantial amount of
     experience using this patched version of blt in the Swarm
     Simulation System (www.swarm.org) and have observed no ill-effects.
Author: Paul E. Johnson (Debian Packaging) <pauljohn32@freefaculty.org>

--- a/generic/bltTreeViewEdit.c
+++ b/generic/bltTreeViewEdit.c
@@ -1177,9 +1177,15 @@
 	rightPos = count;
 	if ((rightPos < tbPtr->selFirst) || (leftPos > tbPtr->selLast)) {
 	    /* No part of the text fragment is selected. */
+#ifdef TK_DRAWCHARS_ANGLE
+	    Tk_DrawChars(tbPtr->display, drawable, tbPtr->gc, 
+			 tbPtr->font, fragPtr->text, fragPtr->count, 
+			 x + fragPtr->x, y + fragPtr->y, 0.);
+#else
 	    Tk_DrawChars(tbPtr->display, drawable, tbPtr->gc, 
 			 tbPtr->font, fragPtr->text, fragPtr->count, 
 			 x + fragPtr->x, y + fragPtr->y);
+#endif
 	    continue;
 	}
 
@@ -1221,9 +1227,15 @@
 	        width, fontMetrics.linespace,
 		tbPtr->selBorderWidth, tbPtr->selRelief);
 	}
+#ifdef TK_DRAWCHARS_ANGLE
+	Tk_DrawChars(Tk_Display(tbPtr->tkwin), drawable, tbPtr->gc, 
+	     tbPtr->font, fragPtr->text, fragPtr->count, 
+		     fragPtr->x + x, fragPtr->y + y, 0.);
+#else
 	Tk_DrawChars(Tk_Display(tbPtr->tkwin), drawable, tbPtr->gc, 
 	     tbPtr->font, fragPtr->text, fragPtr->count, 
 	     fragPtr->x + x, fragPtr->y + y);
+#endif
     }
     if ((tbPtr->flags & TEXTBOX_FOCUS) && (tbPtr->cursorOn)) {
 	int left, top, right, bottom;
--- a/generic/bltGrPs.c
+++ b/generic/bltGrPs.c
@@ -418,7 +418,7 @@
 	return Tk_ConfigureInfo(interp, graphPtr->tkwin, configSpecs,
 		(char *)psPtr, argv[3], flags);
     }
-    if (Tk_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
+    if (Blt_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
 	    argv + 3, (char *)psPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -1124,7 +1124,7 @@
 	    fileName = argv[3];	/* First argument is the file name. */
 	    argv++, argc--;
 	}
-	if (Tk_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
+	if (Blt_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
 		argv + 3, (char *)psPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	    return TCL_ERROR;
 	}
--- a/generic/bltGrPen.c
+++ b/generic/bltGrPen.c
@@ -215,7 +215,7 @@
     Tcl_FreeProc **freeProcPtr;	/* Not used. */
 {
     Pen *penPtr = *(Pen **)(widgRec + offset);
-
+    if ( ! penPtr ) return NULL;
     return penPtr->name;
 }
 
@@ -510,7 +510,7 @@
 	    return Tk_ConfigureInfo(interp, graphPtr->tkwin, 
 		    penPtr->configSpecs, (char *)penPtr, options[0], flags);
 	}
-	if (Tk_ConfigureWidget(interp, graphPtr->tkwin, penPtr->configSpecs,
+	if (Blt_ConfigureWidget(interp, graphPtr->tkwin, penPtr->configSpecs,
 		nOpts, options, (char *)penPtr, flags) != TCL_OK) {
 	    break;
 	}
--- a/generic/bltGrHairs.c
+++ b/generic/bltGrHairs.c
@@ -390,7 +390,7 @@
 	return Tk_ConfigureInfo(interp, graphPtr->tkwin, configSpecs,
 		(char *)chPtr, argv[3], 0);
     }
-    if (Tk_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
+    if (Blt_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
 	    argv + 3, (char *)chPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltGraph.c
+++ b/generic/bltGraph.c
@@ -944,7 +944,7 @@
     if (InitPens(graphPtr) != TCL_OK) {
 	goto error;
     }
-    if (Tk_ConfigureWidget(interp, tkwin, configSpecs, argc - 2, argv + 2,
+    if (Blt_ConfigureWidget(interp, tkwin, configSpecs, argc - 2, argv + 2,
 	    (char *)graphPtr, 0) != TCL_OK) {
 	goto error;
     }
@@ -1094,7 +1094,7 @@
 	return Tk_ConfigureInfo(interp, graphPtr->tkwin, configSpecs,
 	    (char *)graphPtr, argv[2], flags);
     } else {
-	if (Tk_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 2,
+	if (Blt_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 2,
 		argv + 2, (char *)graphPtr, flags) != TCL_OK) {
 	    return TCL_ERROR;
 	}
--- a/generic/bltUnixDnd.c
+++ b/generic/bltUnixDnd.c
@@ -1834,7 +1834,7 @@
     unsigned long gcMask;
 
     Tk_MakeWindowExist(tokenPtr->tkwin);
-    if (Tk_ConfigureWidget(interp, tokenPtr->tkwin, tokenConfigSpecs, argc, 
+    if (Blt_ConfigureWidget(interp, tokenPtr->tkwin, tokenConfigSpecs, argc, 
 		argv, (char *)tokenPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -3777,7 +3777,7 @@
 	return Tk_ConfigureInfo(interp, dndPtr->tkwin, configSpecs,
 	    (char *)dndPtr, argv[3], flags);
     } 
-    if (Tk_ConfigureWidget(interp, dndPtr->tkwin, configSpecs, argc - 3,
+    if (Blt_ConfigureWidget(interp, dndPtr->tkwin, configSpecs, argc - 3,
 		   argv + 3, (char *)dndPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -4440,7 +4440,7 @@
     dndPtr->hashPtr = hPtr;
     dndPtr->dataPtr = dataPtr;
     Blt_SetHashValue(hPtr, dndPtr);
-    if (Tk_ConfigureWidget(interp, dndPtr->tkwin, configSpecs, argc - 3,
+    if (Blt_ConfigureWidget(interp, dndPtr->tkwin, configSpecs, argc - 3,
 	   argv + 3, (char *)dndPtr, 0) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltCanvEps.c
+++ b/generic/bltCanvEps.c
@@ -1147,7 +1147,7 @@
     int width, height;
 
     tkwin = Tk_CanvasTkwin(canvas);
-    if (Tk_ConfigureWidget(interp, tkwin, configSpecs, argc,
+    if (Blt_ConfigureWidget(interp, tkwin, configSpecs, argc,
 	    argv, (char *)epsPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -1974,10 +1974,10 @@
 {
     "eps",			/* name */
     sizeof(EpsItem),		/* itemSize */
-    CreateEps,			/* createProc */
+    (Tk_ItemCreateProc *)CreateEps,			/* createProc */
     configSpecs,		/* configSpecs */
-    ConfigureEps,		/* configureProc */
-    EpsCoords,			/* coordProc */
+    (Tk_ItemConfigureProc *)ConfigureEps,		/* configureProc */
+    (Tk_ItemCoordProc *)EpsCoords,			/* coordProc */
     DeleteEps,			/* deleteProc */
     DisplayEps,			/* displayProc */
 #ifdef USE_OLD_CANVAS
@@ -2005,6 +2005,6 @@
 {
     Tk_CreateItemType(&epsItemType);
     /* Initialize custom canvas option routines. */
-    tagsOption.parseProc = Tk_CanvasTagsParseProc;
-    tagsOption.printProc = Tk_CanvasTagsPrintProc;
+    tagsOption.parseProc = (Tk_OptionParseProc *)Tk_CanvasTagsParseProc;
+    tagsOption.printProc = (Tk_OptionPrintProc *)Tk_CanvasTagsPrintProc;
 }
--- a/generic/bltScrollbar.c
+++ b/generic/bltScrollbar.c
@@ -913,7 +913,7 @@
     GC new;
     Tk_Image image;
 
-    if (Tk_ConfigureWidget(interp, scrollPtr->tkwin, configSpecs,
+    if (Blt_ConfigureWidget(interp, scrollPtr->tkwin, configSpecs,
 	    argc, argv, (char *)scrollPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltTreeViewStyle.c
+++ b/generic/bltTreeViewStyle.c
@@ -560,6 +560,11 @@
 }
 
 /*ARGSUSED*/
+
+int
+Blt_TreeViewTextbox(TreeView *tvPtr,
+		    TreeViewEntry *entryPtr,
+		    TreeViewColumn *columnPtr);
 static int
 FreeIcon(clientData, display, widgRec, offset, oldPtr)
     ClientData clientData;
--- a/generic/bltDragdrop.c
+++ b/generic/bltDragdrop.c
@@ -1065,7 +1065,7 @@
     Token *tokenPtr;
 
     tokenPtr = &(srcPtr->token);
-    if (Tk_ConfigureWidget(interp, srcPtr->tkwin, tokenConfigSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, srcPtr->tkwin, tokenConfigSpecs, argc, argv,
 	    (char *)tokenPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -1293,7 +1293,7 @@
     /*
      *  Handle the bulk of the options...
      */
-    if (Tk_ConfigureWidget(interp, srcPtr->tkwin, configSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, srcPtr->tkwin, configSpecs, argc, argv,
 	    (char *)srcPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltAlloc.c
+++ b/generic/bltAlloc.c
@@ -40,14 +40,23 @@
  * Tcl_Alloc/Tcl_Free routines because they don't automatically cause
  * a panic when not enough memory is available. There are cases (such 
  * as allocating a very large vector) where it's recoverable.
+ *
+ * Using private is dangerous.
+ * Tcl changes mem functions for debug which will conflict then with BLT
+ * stick to public API
  */
-EXTERN Blt_MallocProc TclpAlloc;
-EXTERN Blt_FreeProc TclpFree;
-EXTERN Blt_ReallocProc TclpRealloc;
+//EXTERN Blt_MallocProc TclpAlloc;
+//EXTERN Blt_FreeProc TclpFree;
+//EXTERN Blt_ReallocProc TclpRealloc;
+
+//Blt_MallocProc *Blt_MallocProcPtr = TclpAlloc;
+//Blt_FreeProc *Blt_FreeProcPtr = TclpFree; 
+//Blt_ReallocProc *Blt_ReallocProcPtr = TclpRealloc;
+
+Blt_MallocProc *Blt_MallocProcPtr = (Blt_MallocProc *)Tcl_Alloc;
+Blt_FreeProc *Blt_FreeProcPtr = (Blt_FreeProc *)Tcl_Free; 
+Blt_ReallocProc *Blt_ReallocProcPtr = (Blt_ReallocProc *)Tcl_Realloc; 
 
-Blt_MallocProc *Blt_MallocProcPtr = TclpAlloc;
-Blt_FreeProc *Blt_FreeProcPtr = TclpFree; 
-Blt_ReallocProc *Blt_ReallocProcPtr = TclpRealloc; 
 #else
 
 Blt_MallocProc *Blt_MallocProcPtr = malloc;
--- a/generic/bltGrLegd.c
+++ b/generic/bltGrLegd.c
@@ -1406,7 +1406,7 @@
 	return Tk_ConfigureInfo(interp, graphPtr->tkwin, configSpecs,
 		(char *)legendPtr, argv[3], flags);
     }
-    if (Tk_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
+    if (Blt_ConfigureWidget(interp, graphPtr->tkwin, configSpecs, argc - 3,
 	    argv + 3, (char *)legendPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltHierbox.c
+++ b/generic/bltHierbox.c
@@ -3321,7 +3321,7 @@
     XColor *colorPtr;
 
     hierBox = hboxPtr;
-    if (Tk_ConfigureWidget(hboxPtr->interp, hboxPtr->tkwin, entryConfigSpecs,
+    if (Blt_ConfigureWidget(hboxPtr->interp, hboxPtr->tkwin, entryConfigSpecs,
 	    argc, argv, (char *)entryPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -3935,7 +3935,7 @@
     Tk_Uid nameId;
     Pixmap bitmap;
     hierBox = hboxPtr;
-    if (Tk_ConfigureWidget(interp, hboxPtr->tkwin, configSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, hboxPtr->tkwin, configSpecs, argc, argv,
 	    (char *)hboxPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -4443,7 +4443,7 @@
     Drawable drawable;		/* Pixmap or window to draw into. */
 {
     Entry *entryPtr;		/* Entry to be drawn. */
-    int x1, y1, x2, y2;
+    int x1, y1i, x2, y2;
     int height;
     int x, y;
 
@@ -4463,22 +4463,22 @@
 	y += (height - hboxPtr->button.height) / 2;
 	x1 = x2 = x + LEVELWIDTH(treePtr->level) +
 	    LEVELWIDTH(treePtr->level + 1) / 2;
-	y1 = y + hboxPtr->button.height / 2;
-	y2 = y1 + entryPtr->lineHeight;
+	y1i = y + hboxPtr->button.height / 2;
+	y2 = y1i + entryPtr->lineHeight;
 	if ((treePtr == hboxPtr->rootPtr) && (hboxPtr->hideRoot)) {
-	    y1 += entryPtr->height;
+	    y1i += entryPtr->height;
 	}
 	/*
 	 * Clip the line's Y-coordinates at the window border.
 	 */
-	if (y1 < 0) {
-	    y1 = 0;
+	if (y1i < 0) {
+	    y1i = 0;
 	}
 	if (y2 > Tk_Height(hboxPtr->tkwin)) {
 	    y2 = Tk_Height(hboxPtr->tkwin);
 	}
-	if ((y1 < Tk_Height(hboxPtr->tkwin)) && (y2 > 0)) {
-	    XDrawLine(hboxPtr->display, drawable, hboxPtr->lineGC, x1, y1, 
+	if ((y1i < Tk_Height(hboxPtr->tkwin)) && (y2 > 0)) {
+	    XDrawLine(hboxPtr->display, drawable, hboxPtr->lineGC, x1, y1i, 
 		      x2, y2);
 	}
     }
@@ -4788,17 +4788,17 @@
 	    x, y);
     }
     if ((isFocused) && (hboxPtr->focusEdit) && (editPtr->cursorOn)) {
-	int x1, y1, x2, y2;
+	int x1, y1i, x2, y2;
 
 	GetCursorLocation(hboxPtr, treePtr);
 	x1 = x + editPtr->x;
 	x2 = x1 + 3;
-	y1 = y + editPtr->y - 1;
-	y2 = y1 + editPtr->height - 1;
+	y1i = y + editPtr->y - 1;
+	y2 = y1i + editPtr->height - 1;
 	XDrawLine(hboxPtr->display, drawable, entryPtr->labelGC,
-	    x1, y1, x1, y2);
+	    x1, y1i, x1, y2);
 	XDrawLine(hboxPtr->display, drawable, entryPtr->labelGC,
-	    x1 - 2, y1, x2, y1);
+	    x1 - 2, y1i, x2, y1i);
 	XDrawLine(hboxPtr->display, drawable, entryPtr->labelGC,
 	    x1 - 2, y2, x2, y2);
     }
@@ -4859,7 +4859,7 @@
     int width, height;
     int entryHeight;
     int buttonY;
-    int x1, y1, x2, y2;
+    int x1, y1i, x2, y2;
     Entry *entryPtr;
 
     entryPtr = treePtr->entryPtr;
@@ -4875,7 +4875,7 @@
     buttonY = y + entryPtr->buttonY;
 
     x1 = x + (width / 2);
-    y1 = y2 = buttonY + (buttonPtr->height / 2);
+    y1i = y2 = buttonY + (buttonPtr->height / 2);
     x2 = x1 + (LEVELWIDTH(treePtr->level) + LEVELWIDTH(treePtr->level + 1)) / 2;
 
     if ((treePtr->parentPtr != NULL) && (hboxPtr->lineWidth > 0)) {
@@ -4883,17 +4883,17 @@
 	 * For every node except root, draw a horizontal line from
 	 * the vertical bar to the middle of the icon.
 	 */
-	XDrawLine(hboxPtr->display, drawable, hboxPtr->lineGC, x1, y1, x2, y2);
+	XDrawLine(hboxPtr->display, drawable, hboxPtr->lineGC, x1, y1i, x2, y2);
     }
     if ((entryPtr->flags & ENTRY_OPEN) && (hboxPtr->lineWidth > 0)) {
 	/*
 	 * Entry is open, draw vertical line.
 	 */
-	y2 = y1 + entryPtr->lineHeight;
+	y2 = y1i + entryPtr->lineHeight;
 	if (y2 > Tk_Height(hboxPtr->tkwin)) {
 	    y2 = Tk_Height(hboxPtr->tkwin);	/* Clip line at window border. */
 	}
-	XDrawLine(hboxPtr->display, drawable, hboxPtr->lineGC, x2, y1, x2, y2);
+	XDrawLine(hboxPtr->display, drawable, hboxPtr->lineGC, x2, y1i, x2, y2);
     }
     if ((entryPtr->flags & ENTRY_BUTTON) && (treePtr->parentPtr != NULL)) {
 	/*
@@ -5506,7 +5506,7 @@
 	return Tk_ConfigureInfo(interp, hboxPtr->tkwin, buttonConfigSpecs,
 	    (char *)hboxPtr, argv[0], 0);
     }
-    if (Tk_ConfigureWidget(hboxPtr->interp, hboxPtr->tkwin, buttonConfigSpecs,
+    if (Blt_ConfigureWidget(hboxPtr->interp, hboxPtr->tkwin, buttonConfigSpecs,
 	    argc, argv, (char *)hboxPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltBusy.c
+++ b/generic/bltBusy.c
@@ -418,7 +418,7 @@
     Tk_Cursor oldCursor;
 
     oldCursor = busyPtr->cursor;
-    if (Tk_ConfigureWidget(interp, busyPtr->tkRef, configSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, busyPtr->tkRef, configSpecs, argc, argv,
 	    (char *)busyPtr, 0) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltConfig.c
+++ b/generic/bltConfig.c
@@ -1573,7 +1573,7 @@
     Blt_Free(tempName);
 
     Tk_SetClass(tkwin, className);
-    result = Tk_ConfigureWidget(interp, tkwin, specsPtr, argc, argv, widgRec,
+    result = Blt_ConfigureWidget(interp, tkwin, specsPtr, argc, argv, widgRec,
 	flags);
     if (isTemporary) {
 	Tk_DestroyWindow(tkwin);
--- a/generic/bltTed.c
+++ b/generic/bltTed.c
@@ -826,7 +826,7 @@
     GC newGC;
     unsigned long gcMask;
 
-    if (Tk_ConfigureWidget(tedPtr->interp, tedPtr->tkwin, configSpecs,
+    if (Blt_ConfigureWidget(tedPtr->interp, tedPtr->tkwin, configSpecs,
 	    argc, argv, (char *)tedPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltGrAxis.c
+++ b/generic/bltGrAxis.c
@@ -3448,7 +3448,7 @@
 	return Tk_ConfigureInfo(graphPtr->interp, graphPtr->tkwin, configSpecs,
 	    (char *)axisPtr, argv[0], flags);
     }
-    if (Tk_ConfigureWidget(graphPtr->interp, graphPtr->tkwin, configSpecs,
+    if (Blt_ConfigureWidget(graphPtr->interp, graphPtr->tkwin, configSpecs,
 	    argc, argv, (char *)axisPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltHtext.c
+++ b/generic/bltHtext.c
@@ -40,6 +40,13 @@
  *    of the virtual text.
  */
 
+/*
+ * the htext widget is broken in tk8.5.6 as
+ * Tk_ConfigureWidget no longer supports
+ * queries of changed options. Need to migrate to Tk_SetOptions
+ * instead hack a wrapper Blt_ConfigureWidget
+ */
+
 #include "bltInt.h"
 
 #ifndef NO_HTEXT
@@ -338,7 +345,7 @@
 	TK_CONFIG_DONT_SET_DEFAULT, &heightOption},
     {TK_CONFIG_CUSTOM, "-linespacing", "lineSpacing", "LineSpacing",
 	DEF_HTEXT_LINE_SPACING, Tk_Offset(HText, leader),
-	TK_CONFIG_DONT_SET_DEFAULT, &bltDistanceOption},
+ 	TK_CONFIG_DONT_SET_DEFAULT, &bltDistanceOption},
     {TK_CONFIG_CUSTOM, "-maxheight", "maxHeight", "MaxHeight",
 	DEF_HTEXT_MAX_HEIGHT, Tk_Offset(HText, maxHeight),
 	TK_CONFIG_DONT_SET_DEFAULT, &bltDistanceOption},
@@ -2841,9 +2848,15 @@
     Tk_GetFontMetrics(htPtr->font, &fontMetrics);
     if ((segPtr->textEnd < htPtr->selFirst) ||
 	(segPtr->textStart > htPtr->selLast)) {	/* No selected text */
+#ifdef TK_DRAWCHARS_ANLGE
+	Tk_DrawChars(htPtr->display, draw, htPtr->drawGC, htPtr->font,
+	    htPtr->charArr + segPtr->textStart, textLength - 1,
+		     x, y + linePtr->baseline, 0.);
+#else
 	Tk_DrawChars(htPtr->display, draw, htPtr->drawGC, htPtr->font,
 	    htPtr->charArr + segPtr->textStart, textLength - 1,
 	    x, y + linePtr->baseline);
+#endif
 	return;
     }
     /*
@@ -2872,9 +2885,15 @@
 	Tk_MeasureChars(htPtr->font, htPtr->charArr + segPtr->textStart,
 	    nChars, 10000, DEF_TEXT_FLAGS, &lastX);
 	lastX += x;
+#ifdef TK_DRAWCHARS_ANGLE
+	Tk_DrawChars(htPtr->display, draw, htPtr->drawGC, htPtr->font,
+	    htPtr->charArr + segPtr->textStart, nChars, x,
+		     y + linePtr->baseline, 0.);
+#else
 	Tk_DrawChars(htPtr->display, draw, htPtr->drawGC, htPtr->font,
 	    htPtr->charArr + segPtr->textStart, nChars, x,
 	    y + linePtr->baseline);
+#endif
 	curPos = selStart;
     }
     if (selLength > 0) {	/* The selection itself */
@@ -2890,16 +2909,28 @@
 	    lastX, y + linePtr->baseline - fontMetrics.ascent,
 	    width, fontMetrics.linespace, htPtr->selBorderWidth,
 	    TK_RELIEF_RAISED);
+#ifdef TK_DRAWCHARS_ANGLE
+	Tk_DrawChars(htPtr->display, draw, htPtr->selectGC,
+	    htPtr->font, htPtr->charArr + selStart, selLength,
+		     lastX, y + linePtr->baseline, 0.);
+#else
 	Tk_DrawChars(htPtr->display, draw, htPtr->selectGC,
 	    htPtr->font, htPtr->charArr + selStart, selLength,
 	    lastX, y + linePtr->baseline);
+#endif
 	lastX = nextX;
 	curPos = selStart + selLength;
     }
     nChars = segPtr->textEnd - curPos;
     if (nChars > 0) {		/* Text following the selection */
+#ifdef TK_DRAWCHARS_ANGLE
+	Tk_DrawChars(htPtr->display, draw, htPtr->drawGC, htPtr->font,
+		     htPtr->charArr + curPos, nChars - 1,
+		     lastX, y + linePtr->baseline, 0.);
+#else
 	Tk_DrawChars(htPtr->display, draw, htPtr->drawGC, htPtr->font,
 	    htPtr->charArr + curPos, nChars - 1, lastX, y + linePtr->baseline);
+#endif
     }
 }
 
@@ -3055,18 +3086,21 @@
 	XFillRectangle(display, pixmap, htPtr->fillGC, 0, 0, width, height);
     }
 
-
-    if (! htPtr->lineArr) return;
-    if (deltaY >= 0) {
+    /* handle null lineArr */
+    if (htPtr->arraySize > 0 && htPtr->nLines > 0) {
+      if (deltaY >= 0) {
 	y += htPtr->lineArr[htPtr->first].offset;
 	lineNum = htPtr->first;
 	lastY = 0;
-    } else {
+      } else {
 	y += htPtr->lineArr[htPtr->last].offset;
 	lineNum = htPtr->last;
 	lastY = height;
+      }
+      forceCopy = 0;
+    } else {
+      htPtr->last = htPtr->first - 1;
     }
-    forceCopy = 0;
 
     /* Draw each line */
     for (i = htPtr->first; i <= htPtr->last; i++) {
@@ -3365,7 +3399,8 @@
      * The page is always draw at full width and the viewport will clip
      * the text.
      */
-    if ((htPtr->first != oldFirst) || (htPtr->last != oldLast)) {
+    if ((htPtr->first != oldFirst) || (htPtr->last != oldLast)
+	|| htPtr->flags & TEXT_DIRTY ) {
 	int offset;
 	int i;
 	int first, last;
@@ -3383,23 +3418,26 @@
 	}
         if (! htPtr->lineArr) return;
 
-	for (i = first; i <= last; i++) {
+
+	if (htPtr->arraySize > 0 && htPtr->nLines > 0) {
+	  for (i = first; i <= last; i++) {
 	    offset = htPtr->lineArr[i].offset;
 	    for (linkPtr = Blt_ChainFirstLink(htPtr->lineArr[i].chainPtr);
-		linkPtr != NULL; linkPtr = Blt_ChainNextLink(linkPtr)) {
-		winPtr = Blt_ChainGetValue(linkPtr);
-		if (winPtr->tkwin != NULL) {
-		    MoveEmbeddedWidget(winPtr, offset);
-		    winPtr->flags &= ~WIDGET_VISIBLE;
-		}
+		 linkPtr != NULL; linkPtr = Blt_ChainNextLink(linkPtr)) {
+	      winPtr = Blt_ChainGetValue(linkPtr);
+	      if (winPtr->tkwin != NULL) {
+		MoveEmbeddedWidget(winPtr, offset);
+		winPtr->flags &= ~WIDGET_VISIBLE;
+	      }
 	    }
+	  }
 	}
-    }
-    DrawPage(htPtr, deltaY);
-    SendBogusEvent(tkwin);
+	DrawPage(htPtr, deltaY);
+	SendBogusEvent(tkwin);
 
-    /* Reset flags */
-    htPtr->flags &= ~TEXT_DIRTY;
+	/* Reset flags */
+	htPtr->flags &= ~TEXT_DIRTY;
+    }
 }
 
 /* Selection Procedures */
@@ -3919,7 +3957,7 @@
     if (winPtr == NULL) {
 	return TCL_ERROR;
     }
-    if (Tk_ConfigureWidget(interp, htPtr->tkwin, widgetConfigSpecs,
+    if (Blt_ConfigureWidget(interp, htPtr->tkwin, widgetConfigSpecs,
 	    argc - 3, argv + 3, (char *)winPtr, 0) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -4089,8 +4127,13 @@
 	return Tk_ConfigureInfo(interp, htPtr->tkwin, specsPtr, itemPtr,
 		argv[2], 0);
     }
-    if (Tk_ConfigureWidget(interp, htPtr->tkwin, specsPtr, argc - 2,
-	    argv + 2, itemPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
+    if (Blt_ConfigureWidget(interp, htPtr->tkwin, specsPtr, argc - 2,
+    	    argv + 2, itemPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
+
+      /*
+       * in 8.5 cant tell if in option was modified
+       * supposed to convert to Tk_SetOptions
+       */
 	return TCL_ERROR;
     }
     if (itemPtr == (char *)htPtr) {
@@ -4487,7 +4530,7 @@
 #ifdef ITCL_NAMESPACES
     Itk_SetWidgetCommand(htPtr->tkwin, htPtr->cmdToken);
 #endif
-    if ((Tk_ConfigureWidget(interp, htPtr->tkwin, configSpecs, argc - 2,
+    if ((Blt_ConfigureWidget(interp, htPtr->tkwin, configSpecs, argc - 2,
 		argv + 2, (char *)htPtr, 0) != TCL_OK) ||
 	(ConfigureText(interp, htPtr) != TCL_OK)) {
 	Tk_DestroyWindow(htPtr->tkwin);
--- a/generic/bltWinDraw.c
+++ b/generic/bltWinDraw.c
@@ -1647,8 +1647,13 @@
     if (drawable == None) {
 	return;
     }
+#ifdef TK_DRAWCHARS_ANGLE
+    Tk_DrawChars(display, drawable, gc, (Tk_Font)gc->font, string, length, 
+		 x, y, 0.);
+#else
     Tk_DrawChars(display, drawable, gc, (Tk_Font)gc->font, string, length, 
 	x, y);
+#endif
 }
 
 static void
--- a/generic/bltGrMarker.c
+++ b/generic/bltGrMarker.c
@@ -4313,7 +4313,7 @@
 	/* Save the old marker. */
 	oldName = markerPtr->name;
 	under = markerPtr->drawUnder;
-	if (Tk_ConfigureWidget(interp, graphPtr->tkwin, 
+	if (Blt_ConfigureWidget(interp, graphPtr->tkwin, 
 		markerPtr->classPtr->configSpecs, nOpts, options, 
 		(char *)markerPtr, flags) != TCL_OK) {
 	    return TCL_ERROR;
--- a/generic/bltBitmap.c
+++ b/generic/bltBitmap.c
@@ -917,7 +917,7 @@
     info.padLeft = info.padRight = 0;
     info.padTop = info.padBottom = 0;
     info.font = (Tk_Font)NULL;	/* Initialized by Tk_ConfigureWidget */
-    if (Tk_ConfigureWidget(interp, tkwin, composeConfigSpecs,
+    if (Blt_ConfigureWidget(interp, tkwin, composeConfigSpecs,
 	    argc - 4, argv + 4, (char *)&info, 0) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -1027,7 +1027,7 @@
     /* Initialize info and then process flags */
     info.rotate = 0.0;		/* No rotation by default */
     info.scale = 1.0;		/* No scaling by default */
-    if (Tk_ConfigureWidget(interp, dataPtr->tkwin, defineConfigSpecs,
+    if (Blt_ConfigureWidget(interp, dataPtr->tkwin, defineConfigSpecs,
 	    argc - 4, argv + 4, (char *)&info, 0) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltTabnotebook.c
+++ b/generic/bltTabnotebook.c
@@ -2766,7 +2766,7 @@
     GC newGC;
 
     lastNotebookInstance = nbPtr;
-    if (Tk_ConfigureWidget(interp, nbPtr->tkwin, configSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, nbPtr->tkwin, configSpecs, argc, argv,
 	    (char *)nbPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -3691,7 +3691,7 @@
 	}
 	Tcl_Preserve(tabPtr);
 	lastNotebookInstance = nbPtr;
-	result = Tk_ConfigureWidget(interp, nbPtr->tkwin, tabConfigSpecs,
+	result = Blt_ConfigureWidget(interp, nbPtr->tkwin, tabConfigSpecs,
 	    nOpts, options, (char *)tabPtr, TK_CONFIG_ARGV_ONLY);
 	if (result == TCL_OK) {
 	    result = ConfigureTab(nbPtr, tabPtr);
--- a/generic/bltContainer.c
+++ b/generic/bltContainer.c
@@ -1193,7 +1193,7 @@
     GC newGC;
     int width, height;
 
-    if (Tk_ConfigureWidget(interp, cntrPtr->tkwin, configSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, cntrPtr->tkwin, configSpecs, argc, argv,
 	    (char *)cntrPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/bltTabset.c
+++ b/generic/bltTabset.c
@@ -3163,7 +3163,7 @@
     XColor *activeColor;	/* Active foreground. */
 
     tabSet = setPtr;
-    if (Tk_ConfigureWidget(interp, setPtr->tkwin, configSpecs, argc, argv,
+    if (Blt_ConfigureWidget(interp, setPtr->tkwin, configSpecs, argc, argv,
 	    (char *)setPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -4452,7 +4452,7 @@
 	}
 	tabSet = setPtr;
 	Tcl_Preserve(tabPtr);
-	result = Tk_ConfigureWidget(interp, setPtr->tkwin, tabConfigSpecs,
+	result = Blt_ConfigureWidget(interp, setPtr->tkwin, tabConfigSpecs,
 	    nOpts, options, (char *)tabPtr, TK_CONFIG_ARGV_ONLY);
 	if (result == TCL_OK || nOpts>=2) {
 	    result = ConfigureTab(setPtr, tabPtr);
--- a/generic/bltGrGrid.c
+++ b/generic/bltGrGrid.c
@@ -368,7 +368,7 @@
 	return Tk_ConfigureInfo(interp, graphPtr->tkwin, configSpecs,
 	    (char *)gridPtr, argv[3], flags);
     }
-    if (Tk_ConfigureWidget(graphPtr->interp, graphPtr->tkwin, configSpecs,
+    if (Blt_ConfigureWidget(graphPtr->interp, graphPtr->tkwin, configSpecs,
 	    argc - 3, argv + 3, (char *)gridPtr, flags) != TCL_OK) {
 	return TCL_ERROR;
     }
--- a/generic/tkButton.c
+++ b/generic/tkButton.c
@@ -1721,7 +1721,7 @@
         oldSelVar = (butPtr->selVarName?strdup(butPtr->selVarName):NULL);
     }
     
-    if (Tk_ConfigureWidget(interp, butPtr->tkwin, configSpecs,
+    if (Blt_ConfigureWidget(interp, butPtr->tkwin, configSpecs,
 	    argc, argv, (char *)butPtr, flags) != TCL_OK) {
         if (oldTextVar) ckfree(oldTextVar);
         if (oldTextVar) ckfree(oldSelVar);
--- a/generic/bltGrElem.c
+++ b/generic/bltGrElem.c
@@ -1699,7 +1699,7 @@
     search.x = x;
     search.y = y;
 
-    if (Tk_ConfigureWidget(interp, graphPtr->tkwin, closestSpecs, i - 6,
+    if (Blt_ConfigureWidget(interp, graphPtr->tkwin, closestSpecs, i - 6,
 	    argv + 6, (char *)&search, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	return TCL_ERROR;	/* Error occurred processing an option. */
     }
@@ -1854,7 +1854,7 @@
 	    return Tk_ConfigureInfo(interp, graphPtr->tkwin, 
 		elemPtr->specsPtr, (char *)elemPtr, options[0], flags);
 	}
-	if (Tk_ConfigureWidget(interp, graphPtr->tkwin, elemPtr->specsPtr, 
+	if (Blt_ConfigureWidget(interp, graphPtr->tkwin, elemPtr->specsPtr, 
 		numOpts, options, (char *)elemPtr, flags) != TCL_OK) {
 	    return TCL_ERROR;
 	}
--- a/generic/bltTable.c
+++ b/generic/bltTable.c
@@ -1201,7 +1201,7 @@
     oldRowSpan = entryPtr->row.span;
     oldColSpan = entryPtr->column.span;
 
-    if (Tk_ConfigureWidget(interp, entryPtr->tkwin, entryConfigSpecs,
+    if (Blt_ConfigureWidget(interp, entryPtr->tkwin, entryConfigSpecs,
 	    argc, argv, (char *)entryPtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -1553,7 +1553,7 @@
 		return Tk_ConfigureInfo(tablePtr->interp, tablePtr->tkwin,
 		    infoPtr->configSpecs, (char *)rcPtr, argv[0], 0);
 	    } else {
-		if (Tk_ConfigureWidget(tablePtr->interp, tablePtr->tkwin,
+		if (Blt_ConfigureWidget(tablePtr->interp, tablePtr->tkwin,
 			infoPtr->configSpecs, argc, argv, (char *)rcPtr,
 			TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 		    return TCL_ERROR;
@@ -1578,7 +1578,7 @@
 	}
 	rcPtr = GetRowColumn(infoPtr, n);
 	assert(rcPtr);
-	if (Tk_ConfigureWidget(tablePtr->interp, tablePtr->tkwin,
+	if (Blt_ConfigureWidget(tablePtr->interp, tablePtr->tkwin,
 	       infoPtr->configSpecs, argc, argv, (char *)rcPtr,
 	       TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	    return TCL_ERROR;
@@ -1861,7 +1861,7 @@
 	return Tk_ConfigureInfo(interp, tablePtr->tkwin, tableConfigSpecs,
 	    (char *)tablePtr, argv[0], 0);
     }
-    if (Tk_ConfigureWidget(interp, tablePtr->tkwin, tableConfigSpecs,
+    if (Blt_ConfigureWidget(interp, tablePtr->tkwin, tableConfigSpecs,
 	    argc, argv, (char *)tablePtr, TK_CONFIG_ARGV_ONLY) != TCL_OK) {
 	return TCL_ERROR;
     }
@@ -2198,7 +2198,7 @@
 	}
     }
     if (argc > 0) {
-	result = Tk_ConfigureWidget(tablePtr->interp, entryPtr->tkwin,
+	result = Blt_ConfigureWidget(tablePtr->interp, entryPtr->tkwin,
 	    entryConfigSpecs, argc, argv, (char *)entryPtr,
 	    TK_CONFIG_ARGV_ONLY);
     }