Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | [Bug-3288113,3288121]: Missing marks/endless loop in text mark prev/next |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | patch-3471873 |
Files: | files | file ages | folders |
SHA1: |
8ffcb51530f893fd78cd6c38433b3cb6 |
User & Date: | jan.nijtmans 2012-01-19 20:33:10 |
Context
2012-01-22
| ||
16:02 | patch 3471873: mark next/prev with peer text widgets check-in: 27a6e526 user: jan.nijtmans tags: core-8-5-branch | |
2012-01-19
| ||
20:33 | [Bug-3288113,3288121]: Missing marks/endless loop in text mark prev/next Closed-Leaf check-in: 8ffcb515 user: jan.nijtmans tags: patch-3471873 | |
05:43 | [Bug-3021557]: Moving the cursor in elided text freezes Tk check-in: 32dd4021 user: jan.nijtmans tags: core-8-5-branch | |
Changes
Changes to ChangeLog.
1 2 3 4 5 6 7 | 2012-01-19 Francois Vogel <[email protected]> * generic/tkText.c: [Bug-3021557]: Moving the cursor in * tests/text.test: elided text freezes Tk 2011-11-22 Jan Nijtmans <[email protected]> | > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 | 2012-??-?? Francois Vogel <[email protected]> * generic/tkTextMark.c: [Bug-3288113,3288121]: Missing marks/endless * tests/textMark.test: loop in text mark prev/next 2012-01-19 Francois Vogel <[email protected]> * generic/tkText.c: [Bug-3021557]: Moving the cursor in * tests/text.test: elided text freezes Tk 2011-11-22 Jan Nijtmans <[email protected]> |
︙ | ︙ |
Changes to generic/tkTextMark.c.
︙ | ︙ | |||
777 778 779 780 781 782 783 | for ( ; segPtr != NULL ; segPtr = segPtr->nextPtr) { if (segPtr->typePtr == &tkTextRightMarkType || segPtr->typePtr == &tkTextLeftMarkType) { if (segPtr == textPtr->currentMarkPtr) { Tcl_SetResult(interp, "current", TCL_STATIC); } else if (segPtr == textPtr->insertMarkPtr) { Tcl_SetResult(interp, "insert", TCL_STATIC); | | > > > > > > > | < | 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 | for ( ; segPtr != NULL ; segPtr = segPtr->nextPtr) { if (segPtr->typePtr == &tkTextRightMarkType || segPtr->typePtr == &tkTextLeftMarkType) { if (segPtr == textPtr->currentMarkPtr) { Tcl_SetResult(interp, "current", TCL_STATIC); } else if (segPtr == textPtr->insertMarkPtr) { Tcl_SetResult(interp, "insert", TCL_STATIC); } 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, Tcl_GetHashKey(&textPtr->sharedTextPtr->markTable, segPtr->body.mark.hPtr), TCL_STATIC); } return TCL_OK; |
︙ | ︙ | |||
864 865 866 867 868 869 870 | } } } while (1) { /* * segPtr points just past the first possible candidate, or at the | | > > > > > > > > > > > > | > > > > > > > | < < < | > | 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 | } } } while (1) { /* * segPtr points just past the first possible candidate, or at the * beginning of the line. */ for (prevPtr = NULL, seg2Ptr = index.linePtr->segPtr; seg2Ptr != NULL && seg2Ptr != segPtr; 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); return TCL_OK; } else if (prevPtr->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. */ } else { Tcl_SetResult(interp, Tcl_GetHashKey(&textPtr->sharedTextPtr->markTable, prevPtr->body.mark.hPtr), TCL_STATIC); return TCL_OK; } } index.linePtr = TkBTreePreviousLine(textPtr, index.linePtr); if (index.linePtr == NULL) { return TCL_OK; } segPtr = NULL; } |
︙ | ︙ |
Changes to tests/textMark.test.
︙ | ︙ | |||
15 16 17 18 19 20 21 | testConstraint haveCourier12 [expr {[catch { .t configure -font {Courier 12} }] == 0}] pack append . .t {top expand fill} update .t debug on wm geometry . {} | > | | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | testConstraint haveCourier12 [expr {[catch { .t configure -font {Courier 12} }] == 0}] pack append . .t {top expand fill} update .t debug on wm geometry . {} .t peer create .pt # The statements below reset the main window; it's needed if the window # manager is mwm to make mwm forget about a previous minimum size setting. wm withdraw . wm minsize . 1 1 wm positionfrom . user wm deiconify . |
︙ | ︙ | |||
171 172 173 174 175 176 177 | .t mark next end } {current} test textMark-7.8 {MarkFindNext - no next mark} haveCourier12 { .t mark set current 1.0 .t mark set insert 3.0 .t mark next insert } {} | > > > > > > > | > > | | > > | | > > | | > > | | > > | | > > | | > > | | > > > > > | > > > > | 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | .t mark next end } {current} test textMark-7.8 {MarkFindNext - no next mark} haveCourier12 { .t mark set current 1.0 .t mark set insert 3.0 .t mark next insert } {} test textMark-7.9 {MarkFindNext - mark set in a text widget and retrieved from a peer} -setup { .t mark unset {*}[.t mark names] } -body { .t mark set mymark 1.0 set res [list [.pt mark next 1.0] [.pt mark next mymark] [.pt mark next insert]] } -result {mymark insert current} test textMark-8.1 {MarkFindPrev - invalid mark name} -constraints haveCourier12 -setup { .t mark unset {*}[.t mark names] } -body { catch {.t mark prev bogus} x set x } -result {bad text index "bogus"} test textMark-8.2 {MarkFindPrev - marks at same location} -constraints haveCourier12 -setup { .t mark unset {*}[.t mark names] } -body { .t mark set insert 2.0 .t mark set current 2.0 .t mark prev insert } -result {current} test textMark-8.3 {MarkFindPrev - numerical starting mark} -constraints haveCourier12 -setup { .t mark unset {*}[.t mark names] } -body { .t mark set current 1.0 .t mark set insert 1.0 .t mark prev 1.1 } -result {current} test textMark-8.4 {MarkFindPrev - mark on the same line} -setup { .t mark unset {*}[.t mark names] } -body { .t mark set current 1.0 .t mark set insert 1.1 .t mark prev insert } -result {current} test textMark-8.5 {MarkFindPrev - mark on the previous line} -setup { .t mark unset {*}[.t mark names] } -body { .t mark set current 1.end .t mark set insert 2.0 .t mark prev insert } -result {current} test textMark-8.6 {MarkFindPrev - mark far away} -constraints haveCourier12 -setup { .t mark unset {*}[.t mark names] } -body { .t mark set current 1.2 .t mark set insert 7.0 .t mark prev insert } -result {current} test textMark-8.7 {MarkFindPrev - mark on top of end} -constraints haveCourier12 -setup { .t mark unset {*}[.t mark names] } -body { .t mark set insert 3.0 .t mark set current end .t mark prev end } -result {insert} test textMark-8.8 {MarkFindPrev - no previous mark} -constraints haveCourier12 -setup { .t mark unset {*}[.t mark names] } -body { .t mark set current 1.0 .t mark set insert 3.0 .t mark prev current } -result {} test textMark-8.9 {MarkFindPrev - mark set in a text widget and retrieved from a peer} -setup { .t mark unset {*}[.t mark names] } -body { .t mark set mymark 1.0 set res [list [.pt mark prev end] [.pt mark prev current] [.pt mark prev insert]] } -result {current insert mymark} catch {destroy .t} catch {destroy .pt} # cleanup cleanupTests return |