diff options
author | vincentdarley <vincentdarley> | 2005-01-11 16:00:11 (GMT) |
---|---|---|
committer | vincentdarley <vincentdarley> | 2005-01-11 16:00:11 (GMT) |
commit | 0f4f913e32a089880dbff47ad17a44e1f6671180 (patch) | |
tree | df2f266c1610a8a80212720eb1ed9bbcd869229d | |
parent | 11138a690fd306e375dd4e50ca15cb0380a04686 (diff) | |
download | tk-0f4f913e32a089880dbff47ad17a44e1f6671180.zip tk-0f4f913e32a089880dbff47ad17a44e1f6671180.tar.gz tk-0f4f913e32a089880dbff47ad17a44e1f6671180.tar.bz2 |
fix to text widget bug
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | generic/tkTextDisp.c | 30 |
2 files changed, 32 insertions, 4 deletions
@@ -1,3 +1,9 @@ +2005-01-11 Vince Darley <vincentdarley@users.sourceforge.net> + + * generic/tkTextDisp.c: fix to scrollbar height calculations + of text widgets containing a single very long (wrapped) line. + This fixes at least part of [Bug 1093631]. + 2005-01-11 Donal K. Fellows <donal.k.fellows@man.ac.uk> * generic/tkObj.c (TkParsePadAmount): diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c index 3248d04..b585534 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.45 2004/10/26 12:51:45 dkf Exp $ + * RCS: @(#) $Id: tkTextDisp.c,v 1.46 2005/01/11 16:00:14 vincentdarley Exp $ */ #include "tkPort.h" @@ -347,7 +347,12 @@ typedef struct TextDInfo { * calculation so far...*/ int metricEpoch; /* ...and this for the epoch of the * partial calculation so it can be - * cancelled if things change once more. */ + * cancelled if things change once more. + * This field will be -1 if there is no + * long-line calculation in progress, + * and take a non-negative value if + * there is such a calculation in + * progress. */ int lastMetricUpdateLine; /* When the current update line reaches * this line, we are done and should * stop the asychronous callback @@ -2670,7 +2675,13 @@ AsyncUpdateLineMetrics(clientData) buffer, TCL_GLOBAL_ONLY|TCL_APPEND_VALUE|TCL_LIST_ELEMENT); } - if (lineNum == dInfoPtr->lastMetricUpdateLine) { + /* + * If we're not in the middle of a long-line calculation + * (metricEpoch == -1) and we've reached the last line, then + * we're done. + */ + if (dInfoPtr->metricEpoch == -1 + && lineNum == dInfoPtr->lastMetricUpdateLine) { /* * We have looped over all lines, so we're done. We must * release our refCount on the widget (the timer token @@ -2757,7 +2768,11 @@ TkTextUpdateLineMetrics(textPtr, lineNum, endLine, doThisMuch) lineNum++; linePtr = TkBTreeNextLine(textPtr, linePtr); } - if (lineNum == endLine) { + /* + * If we're in the middle of a partial-line height calculation, + * then we can't be done. + */ + if (textPtr->dInfoPtr->metricEpoch == -1 && lineNum == endLine) { /* * We have looped over all lines, so we're done. */ @@ -2829,6 +2844,10 @@ TkTextUpdateLineMetrics(textPtr, lineNum, endLine, doThisMuch) * cache as far as we got for next time around. */ if (pixelHeight == 0) { + /* + * These have already been stored, unless + * we just started the new line + */ textPtr->dInfoPtr->metricIndex = index; textPtr->dInfoPtr->metricEpoch = textPtr->sharedTextPtr->stateEpoch; @@ -2836,6 +2855,9 @@ TkTextUpdateLineMetrics(textPtr, lineNum, endLine, doThisMuch) textPtr->dInfoPtr->metricPixelHeight = TkBTreeLinePixelCount(textPtr, linePtr); break; + } else { + /* We're done with this long line */ + textPtr->dInfoPtr->metricEpoch = -1; } } } else { |