summaryrefslogtreecommitdiffstats
path: root/generic/tkTextDisp.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkTextDisp.c')
-rw-r--r--generic/tkTextDisp.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c
index 324b3ab..85a160d 100644
--- a/generic/tkTextDisp.c
+++ b/generic/tkTextDisp.c
@@ -13,7 +13,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkTextDisp.c,v 1.24 2003/11/07 15:36:26 vincentdarley Exp $
+ * RCS: @(#) $Id: tkTextDisp.c,v 1.25 2003/11/08 17:22:46 vincentdarley Exp $
*/
#include "tkPort.h"
@@ -957,9 +957,7 @@ LayoutDLine(textPtr, indexPtr)
elide = TkTextIsElided(textPtr, indexPtr, &info);
if (elide && indexPtr->byteIndex==0) {
maxBytes = 0;
- for (segPtr = indexPtr->linePtr->segPtr;
- segPtr != NULL;
- segPtr = segPtr->nextPtr) {
+ for (segPtr = info.segPtr; segPtr != NULL; segPtr = segPtr->nextPtr) {
if (segPtr->size > 0) {
if (elide == 0) {
/*
@@ -977,19 +975,45 @@ LayoutDLine(textPtr, indexPtr)
} else if ((segPtr->typePtr == &tkTextToggleOffType)
|| (segPtr->typePtr == &tkTextToggleOnType)) {
TkTextTag *tagPtr = segPtr->body.toggle.tagPtr;
- if (tagPtr->elideString != NULL
- && (tagPtr->priority >= info.elidePriority)) {
- elide = ((segPtr->typePtr == &tkTextToggleOffType)
- ^ tagPtr->elide);
- if (!elide && tagPtr->priority == info.elidePriority) {
- /* Find previous elide tag, if any */
- while (--info.elidePriority > 0) {
- if (info.tagCnts[info.elidePriority] & 1) {
- break;
+ /*
+ * The elide state only changes if this tag is
+ * either the current highest priority tag
+ * (and is therefore being toggled off), or it's
+ * a new tag with higher priority.
+ */
+ if (tagPtr->elideString != NULL) {
+ info.tagCnts[tagPtr->priority]++;
+ if (info.tagCnts[tagPtr->priority] & 1) {
+ info.tagPtrs[tagPtr->priority] = tagPtr;
+ }
+ if (tagPtr->priority >= info.elidePriority) {
+ if (segPtr->typePtr == &tkTextToggleOffType) {
+ /*
+ * If it is being toggled off, and it has
+ * an elide string, it must actually be the
+ * current highest priority tag, so this
+ * check is redundant:
+ */
+ if (tagPtr->priority != info.elidePriority) {
+ panic("Bad tag priority being toggled off");
+ }
+
+ /*
+ * Find previous elide tag, if any (if not
+ * then elide will be zero, of course).
+ */
+ elide = 0;
+ while (--info.elidePriority > 0) {
+ if (info.tagCnts[info.elidePriority] & 1) {
+ elide = info.tagPtrs[info.elidePriority]
+ ->elide;
+ break;
+ }
}
+ } else {
+ elide = tagPtr->elide;
+ info.elidePriority = tagPtr->priority;
}
- } else {
- info.elidePriority = tagPtr->priority;
}
}
}
@@ -5223,7 +5247,8 @@ GetXView(interp, textPtr, report)
dInfoPtr->xScrollLast = last;
if (textPtr->xScrollCmd != NULL) {
listObj = Tcl_NewStringObj(textPtr->xScrollCmd, -1);
- code = Tcl_ListObjAppendElement(interp, listObj, Tcl_NewDoubleObj(first));
+ code = Tcl_ListObjAppendElement(interp, listObj,
+ Tcl_NewDoubleObj(first));
if (code == TCL_OK) {
Tcl_ListObjAppendElement(interp, listObj, Tcl_NewDoubleObj(last));
code = Tcl_EvalObjEx(interp, listObj,