summaryrefslogtreecommitdiffstats
path: root/generic/tkTextMark.c
diff options
context:
space:
mode:
authornijtmans@users.sourceforge.net <jan.nijtmans>2012-01-22 16:02:26 (GMT)
committernijtmans@users.sourceforge.net <jan.nijtmans>2012-01-22 16:02:26 (GMT)
commite92b2272247eef29862d35f851bf1c51402918f6 (patch)
tree033cad856ad1e2af38ca02748bc6b81478bd3c7c /generic/tkTextMark.c
parenteacdd4e4e3be28f0d20ac2937992fc9c3cfb34e2 (diff)
parent65f20b1c0c23591b84356504826054395445bcc8 (diff)
downloadtk-e92b2272247eef29862d35f851bf1c51402918f6.zip
tk-e92b2272247eef29862d35f851bf1c51402918f6.tar.gz
tk-e92b2272247eef29862d35f851bf1c51402918f6.tar.bz2
patch 3471873: mark next/prev with peer text widgets
Diffstat (limited to 'generic/tkTextMark.c')
-rw-r--r--generic/tkTextMark.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/generic/tkTextMark.c b/generic/tkTextMark.c
index 281baf1..55edb46 100644
--- a/generic/tkTextMark.c
+++ b/generic/tkTextMark.c
@@ -781,11 +781,17 @@ MarkFindNext(
Tcl_SetResult(interp, "current", TCL_STATIC);
} else if (segPtr == textPtr->insertMarkPtr) {
Tcl_SetResult(interp, "insert", TCL_STATIC);
- } else if (segPtr->body.mark.textPtr != textPtr) {
+ } else if (segPtr->body.mark.hPtr == NULL) {
/*
* Ignore widget-specific marks for the other widgets.
- */
-
+ * This is either an insert or a current mark
+ * (markPtr->body.mark.hPtr actually receives NULL
+ * for these marks in TkTextSetMark).
+ * The insert and current marks for textPtr having
+ * already been tested above, the current segment is
+ * an insert or current mark from a peer of textPtr,
+ * which we don't want to return.
+ */
continue;
} else {
Tcl_SetResult(interp,
@@ -868,7 +874,7 @@ MarkFindPrev(
while (1) {
/*
* segPtr points just past the first possible candidate, or at the
- * begining of the line.
+ * beginning of the line.
*/
for (prevPtr = NULL, seg2Ptr = index.linePtr->segPtr;
@@ -876,26 +882,43 @@ MarkFindPrev(
seg2Ptr = seg2Ptr->nextPtr) {
if (seg2Ptr->typePtr == &tkTextRightMarkType ||
seg2Ptr->typePtr == &tkTextLeftMarkType) {
+ if (seg2Ptr->body.mark.hPtr == NULL) {
+ if (seg2Ptr != textPtr->currentMarkPtr &&
+ seg2Ptr != textPtr->insertMarkPtr) {
+ /*
+ * This is an insert or current mark from a
+ * peer of textPtr.
+ */
+ continue;
+ }
+ }
prevPtr = seg2Ptr;
}
}
if (prevPtr != NULL) {
if (prevPtr == textPtr->currentMarkPtr) {
Tcl_SetResult(interp, "current", TCL_STATIC);
+ return TCL_OK;
} else if (prevPtr == textPtr->insertMarkPtr) {
Tcl_SetResult(interp, "insert", TCL_STATIC);
- } else if (prevPtr->body.mark.textPtr != textPtr) {
+ return TCL_OK;
+ } else if (prevPtr->body.mark.hPtr == NULL) {
/*
* Ignore widget-specific marks for the other widgets.
- */
-
- continue;
+ * This is either an insert or a current mark
+ * (markPtr->body.mark.hPtr actually receives NULL
+ * for these marks in TkTextSetMark).
+ * The insert and current marks for textPtr having
+ * already been tested above, the current segment is
+ * an insert or current mark from a peer of textPtr,
+ * which we don't want to return.
+ */
} else {
Tcl_SetResult(interp,
Tcl_GetHashKey(&textPtr->sharedTextPtr->markTable,
prevPtr->body.mark.hPtr), TCL_STATIC);
+ return TCL_OK;
}
- return TCL_OK;
}
index.linePtr = TkBTreePreviousLine(textPtr, index.linePtr);
if (index.linePtr == NULL) {