diff options
author | fvogel <fvogelnew1@free.fr> | 2012-02-28 20:44:34 (GMT) |
---|---|---|
committer | fvogel <fvogelnew1@free.fr> | 2012-02-28 20:44:34 (GMT) |
commit | 5f980e90395c85af59bb9286b197a620d8ba911f (patch) | |
tree | d62de6938569517afd6274d9096c99eadec78078 /generic/tkText.c | |
parent | 9893c7fae421e1414f8e19acd5059350093c49c3 (diff) | |
parent | 220b6aecbb178564d3ee630cf19c6aa8ae93a67d (diff) | |
download | tk-5f980e90395c85af59bb9286b197a620d8ba911f.zip tk-5f980e90395c85af59bb9286b197a620d8ba911f.tar.gz tk-5f980e90395c85af59bb9286b197a620d8ba911f.tar.bz2 |
[Bug-1630262], [Bug-1615425]: segfault when deleting lines or tagging outside of the -startline/-endline range with peer text widgets. [Bug-3487407]: Weird text indices.
Diffstat (limited to 'generic/tkText.c')
-rw-r--r-- | generic/tkText.c | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/generic/tkText.c b/generic/tkText.c index 98720d3..d1f489d 100644 --- a/generic/tkText.c +++ b/generic/tkText.c @@ -2119,6 +2119,10 @@ ConfigureText( * Also, clamp the insert and current (unshared) marks to the new * -startline/-endline range limits of the widget. All other (shared) * marks are unchanged. + * The return value of TkTextMarkNameToIndex does not need to be + * checked: "insert" and "current" marks always exist, and the + * purpose of the code below precisely is to move them inside the + * -startline/-endline range. */ textPtr->sharedTextPtr->stateEpoch++; @@ -3105,6 +3109,11 @@ DeleteIndexRange( resetView = 1; line = line1; byteIndex = tPtr->topIndex.byteIndex; + } else { + /* + * Deletion range starts after the top line. This peers's view + * will not need to be reset. Nothing to do. + */ } } else if (index2.linePtr == tPtr->topIndex.linePtr) { /* @@ -3121,6 +3130,11 @@ DeleteIndexRange( } else { byteIndex -= (index2.byteIndex - index1.byteIndex); } + } else { + /* + * Deletion range ends before the top line. This peers's view + * will not need to be reset. Nothing to do. + */ } if (resetView) { lineAndByteIndex[resetViewCount] = line; @@ -3165,14 +3179,43 @@ DeleteIndexRange( TkTextIndex indexTmp; if (tPtr == textPtr) { - if (viewUpdate) { + if (viewUpdate) { + /* + * line cannot be before -startline of textPtr because + * this line corresponds to an index which is necessarily + * between "1.0" and "end" relative to textPtr. + * Therefore no need to clamp line to the -start/-end + * range. + */ + TkTextMakeByteIndex(sharedTextPtr->tree, textPtr, line, byteIndex, &indexTmp); TkTextSetYView(tPtr, &indexTmp, 0); } } else { - TkTextMakeByteIndex(sharedTextPtr->tree, NULL, line, + TkTextMakeByteIndex(sharedTextPtr->tree, tPtr, line, byteIndex, &indexTmp); + /* + * line may be before -startline of tPtr and must be + * clamped to -startline before providing it to + * TkTextSetYView otherwise lines before -startline + * would be displayed. + * There is no need to worry about -endline however, + * because the view will only be reset if the deletion + * involves the TOP line of the screen + */ + + if (tPtr->start != NULL) { + int start; + TkTextIndex indexStart; + + start = TkBTreeLinesTo(NULL, tPtr->start); + TkTextMakeByteIndex(sharedTextPtr->tree, NULL, start, + 0, &indexStart); + if (TkTextIndexCmp(&indexTmp, &indexStart) < 0) { + indexTmp = indexStart; + } + } TkTextSetYView(tPtr, &indexTmp, 0); } } |