Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | [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. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
5528cb094a83ae9ef719e4084d6b321a |
User & Date: | fvogel 2012-02-28 20:44:34 |
References
2021-04-17
| ||
13:11 | Fix old commit [5528cb094a]. This commit changed NULL into tPtr in the call to TkTextMakeByteIndex() and introduced a check against -startline. However from then on this check is always false since the index returned by TkTextMakeByteIndex() is relative to tPtr and can never be located before the -startline of this peer. The error in [5528cb094a] was to replace NULL by tPtr. The line in this call is relative to textPtr, not to a peer tPtr, and NULL must be kept (and then the check against -startline is useful and runs in several tests of the test suite). check-in: c3fdec3a user: fvogel tags: bug-ea876b3e8a | |
Context
2012-03-04
| ||
16:57 | Patch from the cygwin folks check-in: 314c416b user: jan.nijtmans tags: trunk | |
2012-02-28
| ||
20:44 | [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. check-in: 5528cb09 user: fvogel tags: trunk | |
20:14 | [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. check-in: 6dfcc8fc user: fvogel tags: core-8-5-branch | |
13:47 | [Bug 3495198]: Corrected types of canvas bitmap options. check-in: acd15416 user: dkf tags: trunk | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 | 2012-02-28 Donal K. Fellows <[email protected]> * doc/canvas.n: [Bug 3495198]: Corrected types of bitmap options. 2012-02-26 Jan Nijtmans <[email protected]> * xlib/xcolors.c: Provide fallback for _strtoi64 | > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 2012-02-28 Francois Vogel <[email protected]> * generic/tkText.c: [Bug-1630262], [Bug-1615425]: segfault * generic/tkTextBTree.c when deleting lines or tagging outside of * generic/tkTextDisp.c the -startline/-endline range with peer * generic/tkTextMark.c text widgets. * tests/text.test [Bug-3487407]: Weird text indices. * tests/textMark.test 2012-02-28 Donal K. Fellows <[email protected]> * doc/canvas.n: [Bug 3495198]: Corrected types of bitmap options. 2012-02-26 Jan Nijtmans <[email protected]> * xlib/xcolors.c: Provide fallback for _strtoi64 |
︙ | ︙ |
Changes to generic/tkText.c.
︙ | ︙ | |||
2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 | } /* Indices are potentially obsolete after changing -startline and/or * -endline, therefore increase the epoch. * Also, clamp the insert and current (unshared) marks to the new * -startline/-endline range limits of the widget. All other (shared) * marks are unchanged. */ textPtr->sharedTextPtr->stateEpoch++; TkTextMarkNameToIndex(textPtr, "insert", &index3); if (TkTextIndexCmp(&index3, &index1) < 0) { textPtr->insertMarkPtr = TkTextSetMark(textPtr, "insert", &index1); } | > > > > | 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 | } /* Indices are potentially obsolete after changing -startline and/or * -endline, therefore increase the epoch. * 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++; TkTextMarkNameToIndex(textPtr, "insert", &index3); if (TkTextIndexCmp(&index3, &index1) < 0) { textPtr->insertMarkPtr = TkTextSetMark(textPtr, "insert", &index1); } |
︙ | ︙ | |||
3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 | * Deletion range starts on top line but after topIndex. Use * the current topIndex as the new one. */ resetView = 1; line = line1; byteIndex = tPtr->topIndex.byteIndex; } } else if (index2.linePtr == tPtr->topIndex.linePtr) { /* * Deletion range ends on top line but before topIndex. Figure out * what will be the new character index for the character * currently pointed to by topIndex. */ resetView = 1; line = line2; byteIndex = tPtr->topIndex.byteIndex; if (index1.linePtr != index2.linePtr) { byteIndex -= index2.byteIndex; } else { byteIndex -= (index2.byteIndex - index1.byteIndex); } } if (resetView) { lineAndByteIndex[resetViewCount] = line; lineAndByteIndex[resetViewCount+1] = byteIndex; } else { lineAndByteIndex[resetViewCount] = -1; } | > > > > > > > > > > | 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 | * Deletion range starts on top line but after topIndex. Use * the current topIndex as the new one. */ 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) { /* * Deletion range ends on top line but before topIndex. Figure out * what will be the new character index for the character * currently pointed to by topIndex. */ resetView = 1; line = line2; byteIndex = tPtr->topIndex.byteIndex; if (index1.linePtr != index2.linePtr) { byteIndex -= index2.byteIndex; } 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; lineAndByteIndex[resetViewCount+1] = byteIndex; } else { lineAndByteIndex[resetViewCount] = -1; } |
︙ | ︙ | |||
3161 3162 3163 3164 3165 3166 3167 | int line = lineAndByteIndex[resetViewCount]; if (line != -1) { int byteIndex = lineAndByteIndex[resetViewCount+1]; TkTextIndex indexTmp; if (tPtr == textPtr) { | | > > > > > > > > | > > > > > > > > > > > > > > > > > > > > > | 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 | int line = lineAndByteIndex[resetViewCount]; if (line != -1) { int byteIndex = lineAndByteIndex[resetViewCount+1]; TkTextIndex indexTmp; if (tPtr == textPtr) { 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, 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); } } resetViewCount += 2; } if (sharedTextPtr->refCount > PIXEL_CLIENTS) { ckfree(lineAndByteIndex); |
︙ | ︙ |
Changes to generic/tkTextBTree.c.
︙ | ︙ | |||
654 655 656 657 658 659 660 | sizeof(TkTextLine *) * count); treePtr->startEndRef = ckrealloc(treePtr->startEndRef, sizeof(TkText *) * count); if (textPtr->start != NULL) { count--; treePtr->startEnd[count] = textPtr->start; | | | | 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 | sizeof(TkTextLine *) * count); treePtr->startEndRef = ckrealloc(treePtr->startEndRef, sizeof(TkText *) * count); if (textPtr->start != NULL) { count--; treePtr->startEnd[count] = textPtr->start; treePtr->startEndRef[count] = textPtr; } if (textPtr->end != NULL) { count--; treePtr->startEnd[count] = textPtr->end; treePtr->startEndRef[count] = textPtr; } } } /* *---------------------------------------------------------------------- * |
︙ | ︙ | |||
1602 1603 1604 1605 1606 1607 1608 | nodePtr = treePtr->rootPtr; if ((line < 0) || (line >= nodePtr->numLines)) { return NULL; } /* | | | 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 | nodePtr = treePtr->rootPtr; if ((line < 0) || (line >= nodePtr->numLines)) { return NULL; } /* * Check for any start/end offset for this text widget. */ if (textPtr != NULL) { if (textPtr->start != NULL) { line += TkBTreeLinesTo(NULL, textPtr->start); if (line >= nodePtr->numLines) { return NULL; |
︙ | ︙ | |||
1984 1985 1986 1987 1988 1989 1990 | nodePtr2 = nodePtr2->nextPtr) { if (nodePtr2 == NULL) { Tcl_Panic("TkBTreeLinesTo couldn't find node"); } index += nodePtr2->numLines; } } | | > > > > > > > > > > | > > | > > > > > > > > > > > > > | | 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 | nodePtr2 = nodePtr2->nextPtr) { if (nodePtr2 == NULL) { Tcl_Panic("TkBTreeLinesTo couldn't find node"); } index += nodePtr2->numLines; } } if (textPtr != NULL) { /* * The index to return must be relative to textPtr, not to the entire * tree. Take care to never return a negative index when linePtr * denotes a line before -startline, or an index larger than the * number of lines in textPtr when linePtr is a line past -endline. */ int indexStart, indexEnd; if (textPtr->start != NULL) { indexStart = TkBTreeLinesTo(NULL, textPtr->start); } else { indexStart = 0; } if (textPtr->end != NULL) { indexEnd = TkBTreeLinesTo(NULL, textPtr->end); } else { indexEnd = TkBTreeNumLines(textPtr->sharedTextPtr->tree, NULL); } if (index < indexStart) { index = 0; } else if (index > indexEnd) { index = TkBTreeNumLines(textPtr->sharedTextPtr->tree, textPtr); } else { index -= indexStart; } } return index; } /* *---------------------------------------------------------------------- * * TkBTreeLinkSegment -- * * This function adds a new segment to a B-tree at a given location. * |
︙ | ︙ |
Changes to generic/tkTextDisp.c.
︙ | ︙ | |||
1968 1969 1970 1971 1972 1973 1974 | * displayed, or the lines above it. */ int spaceLeft = maxY - y; if (spaceLeft <= dInfoPtr->newTopPixelOffset) { /* | | | 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 | * displayed, or the lines above it. */ int spaceLeft = maxY - y; if (spaceLeft <= dInfoPtr->newTopPixelOffset) { /* * We can fill up all the needed space just by showing more of the * current top line. */ dInfoPtr->newTopPixelOffset -= spaceLeft; y += spaceLeft; spaceLeft = 0; } else { |
︙ | ︙ | |||
3227 3228 3229 3230 3231 3232 3233 | fromLine = TkBTreeLinesTo(textPtr, linePtr); /* * Invalidate the height calculations of each line in the given range. */ TkBTreeLinePixelEpoch(textPtr, linePtr) = 0; | | | | 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 | fromLine = TkBTreeLinesTo(textPtr, linePtr); /* * Invalidate the height calculations of each line in the given range. */ TkBTreeLinePixelEpoch(textPtr, linePtr) = 0; while (counter > 0 && linePtr != NULL) { linePtr = TkBTreeNextLine(textPtr, linePtr); if (linePtr != NULL) { TkBTreeLinePixelEpoch(textPtr, linePtr) = 0; } counter--; } /* * Now schedule an examination of each line in the union of the old * and new update ranges, including the (possibly empty) range in * between. If that between range is not-empty, then we are examining * more lines than is strictly necessary (but the examination of the * extra lines should be quick, since their pixelCalculationEpoch will * be up to date). However, to keep track of that would require more * complex record-keeping than what we have. */ if (dInfoPtr->lineUpdateTimer == NULL) { dInfoPtr->currentMetricUpdateLine = fromLine; if (action == TK_TEXT_INVALIDATE_DELETE) { lineCount = 0; } |
︙ | ︙ |
Changes to generic/tkTextMark.c.
︙ | ︙ | |||
282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 | * If this is the insertion point that's being moved, be sure to force * a display update at the old position. Also, don't let the insertion * cursor be after the final newline of the file. */ if (markPtr == textPtr->insertMarkPtr) { TkTextIndex index, index2; TkTextMarkSegToIndex(textPtr, textPtr->insertMarkPtr, &index); TkTextIndexForwChars(NULL, &index, 1, &index2, COUNT_INDICES); /* * While we wish to redisplay, no heights have changed, so no need * to call TkTextInvalidateLineMetrics. */ TkTextChanged(NULL, textPtr, &index, &index2); | > | > > > > > > > | > > | | 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 | * If this is the insertion point that's being moved, be sure to force * a display update at the old position. Also, don't let the insertion * cursor be after the final newline of the file. */ if (markPtr == textPtr->insertMarkPtr) { TkTextIndex index, index2; int nblines; TkTextMarkSegToIndex(textPtr, textPtr->insertMarkPtr, &index); TkTextIndexForwChars(NULL, &index, 1, &index2, COUNT_INDICES); /* * While we wish to redisplay, no heights have changed, so no need * to call TkTextInvalidateLineMetrics. */ TkTextChanged(NULL, textPtr, &index, &index2); /* * 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; } } TkBTreeUnlinkSegment(markPtr, markPtr->body.mark.linePtr); } else { markPtr = ckalloc(MSEG_SIZE); |
︙ | ︙ | |||
382 383 384 385 386 387 388 | * TkTextMarkNameToIndex -- * * Given the name of a mark, return an index corresponding to the mark * name. * * Results: * The return value is TCL_OK if "name" exists as a mark in the text | > | | | > > > > > | 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 | * TkTextMarkNameToIndex -- * * Given the name of a mark, return an index corresponding to the mark * name. * * Results: * The return value is TCL_OK if "name" exists as a mark in the text * 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. * *-------------------------------------------------------------- */ |
︙ | ︙ |
Changes to tests/text.test.
︙ | ︙ | |||
6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 | lappend res [.t tag ranges sel] .t configure -start {} -end {} lappend res [.t tag ranges sel] return $res } -cleanup { destroy .t } -result {{10.0 20.0} {6.0 16.0} {6.0 11.0} {1.0 6.0} {1.0 2.0} {} {10.0 20.0}} test text-35.1 {widget dump -command alters tags} -setup { proc Dumpy {key value index} { #puts "KK: $key, $value" .t tag add $value [list $index linestart] [list $index lineend] } text .t | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 | lappend res [.t tag ranges sel] .t configure -start {} -end {} lappend res [.t tag ranges sel] return $res } -cleanup { destroy .t } -result {{10.0 20.0} {6.0 16.0} {6.0 11.0} {1.0 6.0} {1.0 2.0} {} {10.0 20.0}} test text-32.2 {peer widget -start, -end and deletion (bug 1630262)} -setup { destroy .t .pt set res {} } -body { text .t .t peer create .pt for {set i 1} {$i < 100} {incr i} { .t insert end "Line $i\n" } .t configure -startline 5 # none of the following delete shall crash # (all did before fixing bug 1630262) # 1. delete on the same line: line1 == line2 in DeleteIndexRange, # and resetView is true neither for .t not for .pt .pt delete 2.0 2.2 # 2. delete just one line: line1 < line2 in DeleteIndexRange, # and resetView is true only for .t, not for .pt .pt delete 2.0 3.0 # 3. delete several lines: line1 < line2 in DeleteIndexRange, # and resetView is true only for .t, not for .pt .pt delete 2.0 5.0 # 4. delete to the end line: line1 < line2 in DeleteIndexRange, # and resetView is true only for .t, not for .pt .pt delete 2.0 end # this test succeeds provided there is no crash set res 1 } -cleanup { destroy .pt } -result {1} test text-32.3 {peer widget -start, -end and deletion (bug 1630262)} -setup { destroy .t .pt set res {} } -body { text .t .t peer create .pt for {set i 1} {$i < 100} {incr i} { .t insert end "Line $i\n" } .t configure -startline 5 .pt configure -startline 3 # the following delete shall not crash # (it did before fixing bug 1630262) .pt delete 2.0 3.0 # moreover -startline shall be correct # (was wrong before fixing bug 1630262) lappend res [.t cget -start] [.pt cget -start] } -cleanup { destroy .pt } -result {4 3} test text-32.4 {peer widget -start, -end and deletion (bug 1630262)} -setup { destroy .t .pt set res {} } -body { text .t .t peer create .pt for {set i 1} {$i < 100} {incr i} { .t insert end "Line $i\n" } .t configure -startline 5 -endline 15 .pt configure -startline 8 -endline 12 # .pt now shows a range entirely inside the range of .pt # from .t, delete lines located after [.pt cget -end] .t delete 9.0 10.0 # from .t, delete lines straddling [.pt cget -end] .t delete 6.0 9.0 lappend res [.t cget -start] [.t cget -end] [.pt cget -start] [.pt cget -end] .t configure -startline 5 -endline 12 .pt configure -startline 8 -endline 12 # .pt now shows again a range entirely inside the range of .pt # from .t, delete lines located before [.pt cget -start] .t delete 2.0 3.0 # from .t, delete lines straddling [.pt cget -start] .t delete 2.0 5.0 lappend res [.t cget -start] [.t cget -end] [.pt cget -start] [.pt cget -end] .t configure -startline 22 -endline 31 .pt configure -startline 42 -endline 51 # .t now shows a range entirely before the range of .pt # from .t, delete some lines, then do it from .pt .t delete 2.0 3.0 .t delete 2.0 5.0 .pt delete 2.0 5.0 lappend res [.t cget -start] [.t cget -end] [.pt cget -start] [.pt cget -end] .t configure -startline 55 -endline 75 .pt configure -startline 60 -endline 70 # .pt now shows a range entirely inside the range of .t # from .t, delete a range straddling the entire range of .pt .t delete 3.0 18.0 lappend res [.t cget -start] [.t cget -end] [.pt cget -start] [.pt cget -end] } -cleanup { destroy .pt .t } -result {5 11 8 10 5 8 6 8 22 27 38 44 55 60 57 57} test text-35.1 {widget dump -command alters tags} -setup { proc Dumpy {key value index} { #puts "KK: $key, $value" .t tag add $value [list $index linestart] [list $index lineend] } text .t |
︙ | ︙ |
Changes to tests/textMark.test.
︙ | ︙ | |||
171 172 173 174 175 176 177 178 179 180 181 182 183 184 | lappend res [.t get mymark] lappend res [catch {.pt get mymark} msg] $msg } -cleanup { .t configure -startline {} -endline {} .pt configure -startline {} -endline {} .t mark unset mymark } -result {1 {bad text index "mymark"} 1.0 1.0 1 {bad text index "mymark"} L 1 {bad text index "mymark"}} 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 { .t mark set insert 2.0 .t mark set current 2.0 | > > > > > > > | 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 | lappend res [.t get mymark] lappend res [catch {.pt get mymark} msg] $msg } -cleanup { .t configure -startline {} -endline {} .pt configure -startline {} -endline {} .t mark unset mymark } -result {1 {bad text index "mymark"} 1.0 1.0 1 {bad text index "mymark"} L 1 {bad text index "mymark"}} test textMark-6.5 {insert and current marks in an empty peer - bug 3487407} -body { .t mark set insert 1.0 .t configure -start 5 -end 5 set res [.t index insert] } -cleanup { .t configure -startline {} -endline {} } -result {1.0} 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 { .t mark set insert 2.0 .t mark set current 2.0 |
︙ | ︙ |
Changes to tests/textTag.test.
︙ | ︙ | |||
400 401 402 403 404 405 406 407 408 409 410 411 412 413 | } -body { .t tag remove sel 1.0 end .t tag add sel 1.1 1.5 2.4 .t tag ranges sel } -cleanup { .t tag remove sel 1.0 end } -result {1.1 1.5 2.4 2.5} test textTag-3.1 {TkTextTagCmd - "bind" option} -constraints { haveCourier12 } -body { .t tag bind } -returnCodes error -result {wrong # args: should be ".t tag bind tagName ?sequence? ?command?"} | > > > > > > > > > > > > > | 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 | } -body { .t tag remove sel 1.0 end .t tag add sel 1.1 1.5 2.4 .t tag ranges sel } -cleanup { .t tag remove sel 1.0 end } -result {1.1 1.5 2.4 2.5} test textTag-2.14 {tag add before -startline - Bug 1615425} haveCourier12 { text .tt for {set i 1} {$i <10} {incr i} { .tt insert end "Line $i\n" } .tt tag configure mytag -font {Courier 12 bold} .tt peer create .ptt .ptt configure -startline 3 -endline 7 # the test succeeds if next line does not crash .tt tag add mytag 1.0 1.end destroy .ptt .tt set res 1 } {1} test textTag-3.1 {TkTextTagCmd - "bind" option} -constraints { haveCourier12 } -body { .t tag bind } -returnCodes error -result {wrong # args: should be ".t tag bind tagName ?sequence? ?command?"} |
︙ | ︙ |