summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2016-02-08 21:40:56 (GMT)
committerfvogel <fvogelnew1@free.fr>2016-02-08 21:40:56 (GMT)
commit6ca191e0c126168c21b4c207ee70e0e4a24cef36 (patch)
tree48c25fcf359c3b409ea31c5726b3d72e30556ee6 /generic
parentafd2fa759f72c2936c5fcec0449acbaaaa93f989 (diff)
parent961c4a400fecbd654b8b744a5de3f006ceb22d58 (diff)
downloadtk-6ca191e0c126168c21b4c207ee70e0e4a24cef36.zip
tk-6ca191e0c126168c21b4c207ee70e0e4a24cef36.tar.gz
tk-6ca191e0c126168c21b4c207ee70e0e4a24cef36.tar.bz2
Merged finddline branch.bug_06c1433906
Diffstat (limited to 'generic')
-rw-r--r--generic/tkTextDisp.c36
1 files changed, 30 insertions, 6 deletions
diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c
index d45ac73..44d451a 100644
--- a/generic/tkTextDisp.c
+++ b/generic/tkTextDisp.c
@@ -4683,9 +4683,6 @@ TextChanged(
*/
lastPtr = FindDLine(textPtr, dInfoPtr->dLinePtr, &rounded);
- while ((lastPtr != NULL) && (TkTextIndexCmp(&lastPtr->index, &rounded) < 0)) {
- lastPtr = lastPtr->nextPtr;
- }
/*
* At least one display line is supposed to change. This makes the
@@ -6590,6 +6587,7 @@ FindDLine(
CONST TkTextIndex *indexPtr)/* Index of desired character. */
{
DLine *dlPtrPrev;
+ TkTextIndex indexPtr2;
if (dlPtr == NULL) {
return NULL;
@@ -6614,7 +6612,6 @@ FindDLine(
dlPtrPrev = dlPtr;
dlPtr = dlPtr->nextPtr;
if (dlPtr == NULL) {
- TkTextIndex indexPtr2;
/*
* We're past the last display line, either because the desired
* index lies past the visible text, or because the desired index
@@ -6632,14 +6629,41 @@ FindDLine(
} else {
/*
* The desired index is past the visible text. There is no
- * display line displaying something at the desired index
+ * display line displaying something at the desired index.
* --> return NULL.
*/
}
break;
}
if (TkTextIndexCmp(&dlPtr->index,indexPtr) > 0) {
- dlPtr = dlPtrPrev;
+ /*
+ * If we're here then we would normally expect that:
+ * dlPtrPrev->index <= indexPtr < dlPtr->index
+ * i.e. we have found the searched display line being dlPtr.
+ * However it is possible that some DLines were unlinked
+ * previously, leading to a situation where going through
+ * the list of display lines skips display lines that did
+ * exist just a moment ago.
+ */
+ indexPtr2 = dlPtrPrev->index;
+ TkTextIndexForwBytes(textPtr, &indexPtr2, dlPtrPrev->byteCount,
+ &indexPtr2);
+ if (TkTextIndexCmp(&indexPtr2,indexPtr) > 0) {
+ /*
+ * Confirmed:
+ * dlPtrPrev->index <= indexPtr < dlPtr->index
+ * --> return dlPtrPrev.
+ */
+ dlPtr = dlPtrPrev;
+ } else {
+ /*
+ * The last (rightmost) index shown by dlPtrPrev is still
+ * before the desired index. This may be because there was
+ * previously a display line between dlPtrPrev and dlPtr
+ * and this display line has been unlinked.
+ * --> return dlPtr.
+ */
+ }
break;
}
}