From 2a739cee5e02ba828e59bcf8348ff158ef53db67 Mon Sep 17 00:00:00 2001 From: vincentdarley Date: Fri, 7 Nov 2003 12:06:47 +0000 Subject: another elide/tkchat/tkTextDisp.c fix --- ChangeLog | 6 ++++++ generic/tkTextDisp.c | 25 ++++++++++++++++++++----- tests/textDisp.test | 27 ++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index dc6ca84..0ae431c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2003-11-07 Vince Darley + + * tests/textDisp.test: + * generic/tkTextDisp.c: fix to another version of [Bug 833627] + (crash in tkchat), adding two new tests. + 2003-11-05 Donal K. Fellows * library/demos/nl.msg: Dutch messages from Arjen Markus [Patch 836368] diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c index 08680f9..ebe9b4c 100644 --- a/generic/tkTextDisp.c +++ b/generic/tkTextDisp.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkTextDisp.c,v 1.22 2003/11/03 16:10:12 vincentdarley Exp $ + * RCS: @(#) $Id: tkTextDisp.c,v 1.23 2003/11/07 12:06:47 vincentdarley Exp $ */ #include "tkPort.h" @@ -955,6 +955,7 @@ LayoutDLine(textPtr, indexPtr) */ elide = TkTextIsElided(textPtr, indexPtr); /* save a malloc */ if (elide && indexPtr->byteIndex==0) { + int tagElidePriority = -1; maxBytes = 0; for (segPtr = indexPtr->linePtr->segPtr; segPtr != NULL; @@ -969,11 +970,25 @@ LayoutDLine(textPtr, indexPtr) break; } maxBytes += segPtr->size; + /* + * Reset tag elide priority, since we're on a new + * character. + */ + tagElidePriority = -1; } else if ((segPtr->typePtr == &tkTextToggleOffType) - || (segPtr->typePtr == &tkTextToggleOnType)) { - if (segPtr->body.toggle.tagPtr->elideString != NULL) { - elide = (segPtr->typePtr == &tkTextToggleOffType) - ^ segPtr->body.toggle.tagPtr->elide; + || (segPtr->typePtr == &tkTextToggleOnType)) { + TkTextTag *tagPtr = segPtr->body.toggle.tagPtr; + if (tagPtr->elideString != NULL) { + /* + * Only update the elide status if this tag has + * higher priority than any other we've so far + * seen at this index. + */ + if (tagPtr->priority > tagElidePriority) { + elide = ((segPtr->typePtr == &tkTextToggleOffType) + ^ tagPtr->elide); + tagElidePriority = tagPtr->priority; + } } } } diff --git a/tests/textDisp.test b/tests/textDisp.test index 49dbe1b..abf1d2a 100644 --- a/tests/textDisp.test +++ b/tests/textDisp.test @@ -6,7 +6,7 @@ # Copyright (c) 1998-1999 by Scriptics Corporation. # All rights reserved. # -# RCS: @(#) $Id: textDisp.test,v 1.14 2003/11/04 23:37:51 vincentdarley Exp $ +# RCS: @(#) $Id: textDisp.test,v 1.15 2003/11/07 12:06:47 vincentdarley Exp $ package require tcltest 2.1 eval tcltest::configure $argv @@ -161,6 +161,31 @@ test textDisp-0.2 {double tag elide transition} { destroy .top } {} +test textDisp-0.3 {double tag elide transition} { + catch {destroy .txt} + pack [text .txt] + # Note that TRAFFIC should have a higher priority than SYSTEM + # in terms of the tag effects. + .txt tag configure SYSTEM -elide 0 + .txt tag configure TRAFFIC -elide 1 + .txt insert end "\n" {TRAFFIC SYSTEM} + update + destroy .txt +} {} + +test textDisp-0.4 {double tag elide transition} { + catch {destroy .txt} + pack [text .txt] + # Note that TRAFFIC should have a higher priority than SYSTEM + # in terms of the tag effects. + .txt tag configure SYSTEM -elide 0 + .txt tag configure TRAFFIC -elide 1 + .txt insert end "\n" {SYSTEM TRAFFIC} + # Crash was here. + update + destroy .txt +} {} + test textDisp-1.1 {GetStyle procedure, priorities and tab stops} { .t delete 1.0 end .t insert 1.0 "x\ty" -- cgit v0.12