diff options
Diffstat (limited to 'generic/tkText.c')
-rw-r--r-- | generic/tkText.c | 69 |
1 files changed, 53 insertions, 16 deletions
diff --git a/generic/tkText.c b/generic/tkText.c index 95d91e5..75d253f 100644 --- a/generic/tkText.c +++ b/generic/tkText.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: tkText.c,v 1.79.2.3 2009/02/06 08:13:23 das Exp $ + * RCS: @(#) $Id: tkText.c,v 1.79.2.4 2009/10/22 21:41:20 dkf Exp $ */ #include "default.h" @@ -529,7 +529,8 @@ CreateWidget( Tcl_InitHashTable(&sharedPtr->imageTable, TCL_STRING_KEYS); sharedPtr->undoStack = TkUndoInitStack(interp,0); sharedPtr->undo = 1; - sharedPtr->isDirtyIncrement = 1; + sharedPtr->isDirty = 0; + sharedPtr->dirtyMode = TK_TEXT_DIRTY_NORMAL; sharedPtr->autoSeparators = 1; sharedPtr->lastEditMode = TK_TEXT_EDIT_OTHER; sharedPtr->stateEpoch = 0; @@ -4878,16 +4879,21 @@ TextEditUndo( } /* - * Turn off the undo feature while we revert a compound action. Note that - * the dirty counter counts backwards while we are undoing... + * Turn off the undo feature while we revert a compound action, setting + * the dirty handling mode to undo for the duration (unless it is + * 'fixed'). */ textPtr->sharedTextPtr->undo = 0; - textPtr->sharedTextPtr->isDirtyIncrement = -1; + if (textPtr->sharedTextPtr->dirtyMode != TK_TEXT_DIRTY_FIXED) { + textPtr->sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_UNDO; + } status = TkUndoRevert(textPtr->sharedTextPtr->undoStack); - textPtr->sharedTextPtr->isDirtyIncrement = 1; + if (textPtr->sharedTextPtr->dirtyMode != TK_TEXT_DIRTY_FIXED) { + textPtr->sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_NORMAL; + } textPtr->sharedTextPtr->undo = 1; return status; @@ -4922,13 +4928,20 @@ TextEditRedo( /* * Turn off the undo feature temporarily while we revert a previously - * undone compound action. + * undone compound action, setting the dirty handling mode to redo for the + * duration (unless it is 'fixed'). */ textPtr->sharedTextPtr->undo = 0; + if (textPtr->sharedTextPtr->dirtyMode != TK_TEXT_DIRTY_FIXED) { + textPtr->sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_REDO; + } status = TkUndoApply(textPtr->sharedTextPtr->undoStack); + if (textPtr->sharedTextPtr->dirtyMode != TK_TEXT_DIRTY_FIXED) { + textPtr->sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_NORMAL; + } textPtr->sharedTextPtr->undo = 1; return status; } @@ -4993,17 +5006,18 @@ TextEditCmd( } /* - * Set or reset the dirty info, but trigger a Modified event only - * if it has changed. Ensure a rationalized value for the bit. + * Set or reset the dirty info, and trigger a Modified event. */ setModified = setModified ? 1 : 0; textPtr->sharedTextPtr->isDirty = setModified; - if (textPtr->sharedTextPtr->modifiedSet != setModified) { - textPtr->sharedTextPtr->modifiedSet = setModified; - GenerateModifiedEvent(textPtr); + if (setModified) { + textPtr->sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_FIXED; + } else { + textPtr->sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_NORMAL; } + GenerateModifiedEvent(textPtr); } break; case EDIT_REDO: @@ -5171,7 +5185,7 @@ GenerateModifiedEvent( * * UpdateDirtyFlag -- * - * Increases the dirtyness of the text widget + * Updates the dirtyness of the text widget * * Results: * None @@ -5187,14 +5201,37 @@ UpdateDirtyFlag( TkSharedText *sharedTextPtr)/* Information about text widget. */ { int oldDirtyFlag; + TkText *textPtr; + + /* + * If we've been forced to be dirty, we stay dirty (until explicitly + * reset, of course). + */ - if (sharedTextPtr->modifiedSet) { + if (sharedTextPtr->dirtyMode == TK_TEXT_DIRTY_FIXED) { return; } + + if (sharedTextPtr->isDirty < 0 + && sharedTextPtr->dirtyMode == TK_TEXT_DIRTY_NORMAL) { + /* + * If dirty flag is negative, only redo operations can make it zero + * again. If we do a normal operation, it can never become zero any + * more (other than by explicit reset). + */ + + sharedTextPtr->dirtyMode = TK_TEXT_DIRTY_FIXED; + return; + } + oldDirtyFlag = sharedTextPtr->isDirty; - sharedTextPtr->isDirty += sharedTextPtr->isDirtyIncrement; + if (sharedTextPtr->dirtyMode == TK_TEXT_DIRTY_UNDO) { + sharedTextPtr->isDirty--; + } else { + sharedTextPtr->isDirty++; + } + if (sharedTextPtr->isDirty == 0 || oldDirtyFlag == 0) { - TkText *textPtr; for (textPtr = sharedTextPtr->peers; textPtr != NULL; textPtr = textPtr->next) { GenerateModifiedEvent(textPtr); |