summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorfvogel <fvogel@noemail.net>2012-02-18 21:55:28 (GMT)
committerfvogel <fvogel@noemail.net>2012-02-18 21:55:28 (GMT)
commit6a8b5a6e404ac38a6839f5c8292683d6689300d2 (patch)
treeb3a7813f9f7a65cfa210096ad03d36a777bc56e0 /generic
parentce9f69895909f2221be23566d478dc61e51150d7 (diff)
downloadtk-6a8b5a6e404ac38a6839f5c8292683d6689300d2.zip
tk-6a8b5a6e404ac38a6839f5c8292683d6689300d2.tar.gz
tk-6a8b5a6e404ac38a6839f5c8292683d6689300d2.tar.bz2
Bug-3487407: Weird text indices
FossilOrigin-Name: f39a80017a4c56e5f854a0096ebb26359aef3ef4
Diffstat (limited to 'generic')
-rw-r--r--generic/tkText.c4
-rw-r--r--generic/tkTextDisp.c2
-rw-r--r--generic/tkTextMark.c26
3 files changed, 26 insertions, 6 deletions
diff --git a/generic/tkText.c b/generic/tkText.c
index 18cbcf4..6652f3d 100644
--- a/generic/tkText.c
+++ b/generic/tkText.c
@@ -2107,6 +2107,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++;
diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c
index 61fb76e..d0cd4d2 100644
--- a/generic/tkTextDisp.c
+++ b/generic/tkTextDisp.c
@@ -1971,7 +1971,7 @@ UpdateDisplayInfo(
if (spaceLeft <= dInfoPtr->newTopPixelOffset) {
/*
- * We can full up all the needed space just by showing more of the
+ * We can fill up all the needed space just by showing more of the
* current top line.
*/
diff --git a/generic/tkTextMark.c b/generic/tkTextMark.c
index a9d709c..71a7949 100644
--- a/generic/tkTextMark.c
+++ b/generic/tkTextMark.c
@@ -285,6 +285,7 @@ TkTextSetMark(
if (markPtr == textPtr->insertMarkPtr) {
TkTextIndex index, index2;
+ int nblines;
TkTextMarkSegToIndex(textPtr, textPtr->insertMarkPtr, &index);
TkTextIndexForwChars(NULL,&index, 1, &index2, COUNT_INDICES);
@@ -295,8 +296,17 @@ TkTextSetMark(
*/
TkTextChanged(NULL, textPtr, &index, &index2);
- if (TkBTreeLinesTo(textPtr, indexPtr->linePtr) ==
- TkBTreeNumLines(textPtr->sharedTextPtr->tree, textPtr)) {
+
+ /*
+ * The number of lines in the widget is zero if and only if it is
+ * a partial peer with -startline == -endline, i.e. an empty
+ * peer. In this case the mark shall be set exactly at the given
+ * index, and not one character backwards (bug 3487407).
+ */
+
+ nblines = TkBTreeNumLines(textPtr->sharedTextPtr->tree, textPtr);
+ if ((TkBTreeLinesTo(textPtr, indexPtr->linePtr) == nblines)
+ && (nblines > 0)) {
TkTextIndexBackChars(NULL,indexPtr, 1, &insertIndex,
COUNT_INDICES);
indexPtr = &insertIndex;
@@ -385,9 +395,15 @@ TkTextMarkSegToIndex(
*
* Results:
* The return value is TCL_OK if "name" exists as a mark in the text
- * widget. In this case *indexPtr is filled in with the next segment
- * whose after the mark whose size is non-zero. TCL_ERROR is returned if
- * the mark doesn't exist in the text widget.
+ * widget and is located within its -starline/-endline range. In this
+ * case *indexPtr is filled in with the next segment who is after the
+ * mark whose size is non-zero. TCL_ERROR is returned if the mark
+ * doesn't exist in the text widget, or if it is out of its -starline/
+ * -endline range. In this latter case *indexPtr still contains valid
+ * information, in particular TkTextMarkNameToIndex called with the
+ * "insert" or "current" mark name may return TCL_ERROR, but *indexPtr
+ * contains the correct index of this mark before -startline or after
+ * -endline.
*
* Side effects:
* None.