Index: generic/tkTextDisp.c ================================================================== --- generic/tkTextDisp.c +++ generic/tkTextDisp.c @@ -7739,15 +7739,15 @@ TkrTextIndexBackBytes(textPtr, indexPtr, info.byteOffset, indexPtr); if (displayLineOffset > 0) { ComputeMissingMetric(textPtr, &info, THRESHOLD_LINE_OFFSET, displayLineOffset); - info.numDispLines -= info.displayLineNo; while (1) { const TkTextDispLineEntry *last; + info.numDispLines -= info.displayLineNo; if ((int) info.numDispLines >= displayLineOffset) { last = info.entry + displayLineOffset; byteOffset = last->byteOffset; break; } Index: generic/tkTextIndex.c ================================================================== --- generic/tkTextIndex.c +++ generic/tkTextIndex.c @@ -2943,11 +2943,23 @@ forward = (count < 0) == (*string == '-'); count = abs(count); if (forward) { + TkTextIndex indexPtr2 = *indexPtr; + + /* + * Check crossing of the end of text boundary. If crossed, adjust + * xOffset so that the returned index will refer to the end of line. + */ + + TkTextFindDisplayIndex(textPtr, &indexPtr2, count - 1, NULL); TkTextFindDisplayIndex(textPtr, indexPtr, count, &xOffset); + if (!TkTextIndexCompare(&indexPtr2, indexPtr)) { + TkTextIndexSetupToEndOfText(indexPtr, textPtr, textPtr->sharedTextPtr->tree); + TkTextFindDisplayIndex(textPtr, indexPtr, 0, &xOffset); + } } else { TkTextIndex indexPtr2 = *indexPtr; /* * Check crossing of the start of text boundary. If crossed, adjust Index: tests/textMark.test ================================================================== --- tests/textMark.test +++ tests/textMark.test @@ -202,11 +202,11 @@ focus -force .p event generate .p <> ; # shall not error out set res [.p index insert] } -cleanup { destroy .p -} -result {1.2} +} -result {1.9} test textMark-7.1 {MarkFindNext - invalid mark name} -body { .t mark next bogus } -returnCodes error -result {bad text index "bogus"} test textMark-7.2 {MarkFindNext - marks at same location} -body {