Tk Source Code

Check-in [8ffcb515]
Login

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: 8ffcb51530f893fd78cd6c38433b3cb6a7168415
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
Hide Diffs Unified Diffs Ignore Whitespace Patch

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
784
785
786







787
788
789
790
791
792
793
794
795
	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.textPtr != textPtr) {
		    /*
		     * Ignore widget-specific marks for the other widgets.







		     */

		    continue;
		} else {
		    Tcl_SetResult(interp,
			    Tcl_GetHashKey(&textPtr->sharedTextPtr->markTable,
			    segPtr->body.mark.hPtr), TCL_STATIC);
		}
		return TCL_OK;







|


>
>
>
>
>
>
>
|
<







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
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
	    }
	}
    }

    while (1) {
	/*
	 * segPtr points just past the first possible candidate, or at the
	 * begining of the line.
	 */

	for (prevPtr = NULL, seg2Ptr = index.linePtr->segPtr;
		seg2Ptr != NULL && seg2Ptr != segPtr;
		seg2Ptr = seg2Ptr->nextPtr) {
	    if (seg2Ptr->typePtr == &tkTextRightMarkType ||
		    seg2Ptr->typePtr == &tkTextLeftMarkType) {










		prevPtr = seg2Ptr;
	    }
	}
	if (prevPtr != NULL) {
	    if (prevPtr == textPtr->currentMarkPtr) {
		Tcl_SetResult(interp, "current", TCL_STATIC);

	    } else if (prevPtr == textPtr->insertMarkPtr) {
		Tcl_SetResult(interp, "insert", TCL_STATIC);

	    } else if (prevPtr->body.mark.textPtr != textPtr) {
		/*
		 * Ignore widget-specific marks for the other widgets.







		 */

		continue;
	    } 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;
    }







|







>
>
>
>
>
>
>
>
>
>






>


>
|


>
>
>
>
>
>
>
|
<
<




<
|
>







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

22
23
24
25
26
27
28
29
testConstraint haveCourier12 [expr {[catch {
    .t configure -font {Courier 12}
}] == 0}]
pack append . .t {top expand fill}
update
.t debug on
wm geometry . {}

  
# 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 .







>
|







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







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
    .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-8.1 {MarkFindPrev - invalid mark name} haveCourier12 {


    catch {.t mark prev bogus} x
    set x
} {bad text index "bogus"}
test textMark-8.2 {MarkFindPrev - marks at same location} haveCourier12 {


    .t mark set insert 2.0
    .t mark set current 2.0
    .t mark prev insert
} {current}
test textMark-8.3 {MarkFindPrev - numerical starting mark} haveCourier12 {


    .t mark set current 1.0
    .t mark set insert 1.0
    .t mark prev 1.1
} {current}
test textMark-8.4 {MarkFindPrev - mark on the same line} haveCourier12 {


    .t mark set current 1.0
    .t mark set insert 1.1
    .t mark prev insert
} {current}
test textMark-8.5 {MarkFindPrev - mark on the previous line} haveCourier12 {


    .t mark set current 1.end
    .t mark set insert 2.0
    .t mark prev insert
} {current}
test textMark-8.6 {MarkFindPrev - mark far away} haveCourier12 {


    .t mark set current 1.2
    .t mark set insert 7.0
    .t mark prev insert
} {current}
test textMark-8.7 {MarkFindPrev - mark on top of end} haveCourier12 {


    .t mark set insert 3.0
    .t mark set current end
    .t mark prev end
} {insert}
test textMark-8.8 {MarkFindPrev - no previous mark} haveCourier12 {


    .t mark set current 1.0
    .t mark set insert 3.0
    .t mark prev current



} {}




catch {destroy .t}


# cleanup
cleanupTests
return







>
>
>
>
>
>
>
|
>
>


|
|
>
>



|
|
>
>



|
|
>
>



|
|
>
>



|
|
>
>



|
|
>
>



|
|
>
>



>
>
>
|
>
>
>


>




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