diff options
Diffstat (limited to 'generic/tkUndo.h')
-rw-r--r-- | generic/tkUndo.h | 133 |
1 files changed, 83 insertions, 50 deletions
diff --git a/generic/tkUndo.h b/generic/tkUndo.h index 8f0411c..b0e2db0 100644 --- a/generic/tkUndo.h +++ b/generic/tkUndo.h @@ -1,20 +1,19 @@ /* * tkUndo.h -- * - * Declarations shared among the files that implement an undo - * stack. + * Declarations shared among the files that implement an undo stack. * * Copyright (c) 2002 Ludwig Callewaert. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. */ #ifndef _TKUNDO #define _TKUNDO -#ifndef _TK -#include "tk.h" +#ifndef _TKINT +#include "tkInt.h" #endif #ifdef BUILD_tk @@ -22,65 +21,99 @@ # define TCL_STORAGE_CLASS DLLEXPORT #endif -/* enum definining the types used in an undo stack */ +/* + * Enum definining the types used in an undo stack. + */ typedef enum { - TK_UNDO_SEPARATOR, /* Marker */ - TK_UNDO_ACTION /* Command */ + TK_UNDO_SEPARATOR, /* Marker */ + TK_UNDO_ACTION /* Command */ } TkUndoAtomType; -/* struct defining the basic undo/redo stack element */ - -typedef struct TkUndoAtom { - TkUndoAtomType type; /* The type that will trigger the - * required action*/ - Tcl_Obj * apply; /* Command to apply the action that was taken */ - Tcl_Obj * revert; /* The command to undo the action */ - struct TkUndoAtom * next; /* Pointer to the next element in the - * stack */ -} TkUndoAtom; - -/* struct defining the basic undo/redo stack element */ - -typedef struct TkUndoRedoStack { - TkUndoAtom * undoStack; /* The undo stack */ - TkUndoAtom * redoStack; /* The redo stack */ - Tcl_Interp * interp ; /* The interpreter in which to execute the revert and apply scripts */ - int maxdepth; - int depth; -} TkUndoRedoStack; - -/* basic functions */ +/* + * Callback proc type to carry out an undo or redo action via C code. (Actions + * can also be defined by Tcl scripts). + */ -EXTERN void TkUndoPushStack _ANSI_ARGS_((TkUndoAtom ** stack, - TkUndoAtom * elem)); +typedef int (TkUndoProc)(Tcl_Interp *interp, ClientData clientData, + Tcl_Obj *objPtr); -EXTERN TkUndoAtom * TkUndoPopStack _ANSI_ARGS_((TkUndoAtom ** stack)); - -EXTERN int TkUndoInsertSeparator _ANSI_ARGS_((TkUndoAtom ** stack)); +/* + * Struct defining a single action, one or more of which may be defined (and + * stored in a linked list) separately for each undo and redo action of an + * undo atom. + */ -EXTERN void TkUndoClearStack _ANSI_ARGS_((TkUndoAtom ** stack)); +typedef struct TkUndoSubAtom { + Tcl_Command command; /* Tcl token used to get the current Tcl + * command name which will be used to execute + * apply/revert scripts. If NULL then it is + * assumed the apply/revert scripts already + * contain everything. */ + TkUndoProc *funcPtr; /* Function pointer for callback to perform + * undo/redo actions. */ + ClientData clientData; /* Data for 'funcPtr'. */ + Tcl_Obj *action; /* Command to apply the action that was + * taken. */ + struct TkUndoSubAtom *next; /* Pointer to the next element in the linked + * list. */ +} TkUndoSubAtom; -/* functions working on an undo/redo stack */ +/* + * Struct representing a single undo+redo atom to be placed in the stack. + */ -EXTERN TkUndoRedoStack * TkUndoInitStack _ANSI_ARGS_((Tcl_Interp * interp, - int maxdepth)); +typedef struct TkUndoAtom { + TkUndoAtomType type; /* The type that will trigger the required + * action. */ + TkUndoSubAtom *apply; /* Linked list of 'apply' actions to perform + * for this operation. */ + TkUndoSubAtom *revert; /* Linked list of 'revert' actions to perform + * for this operation. */ + struct TkUndoAtom *next; /* Pointer to the next element in the + * stack. */ +} TkUndoAtom; -EXTERN void TkUndoSetDepth _ANSI_ARGS_((TkUndoRedoStack * stack, - int maxdepth)); +/* + * Struct defining a single undo+redo stack. + */ -EXTERN void TkUndoClearStacks _ANSI_ARGS_((TkUndoRedoStack * stack)); +typedef struct TkUndoRedoStack { + TkUndoAtom *undoStack; /* The undo stack. */ + TkUndoAtom *redoStack; /* The redo stack. */ + Tcl_Interp *interp; /* The interpreter in which to execute the + * revert and apply scripts. */ + int maxdepth; + int depth; +} TkUndoRedoStack; -EXTERN void TkUndoFreeStack _ANSI_ARGS_((TkUndoRedoStack * stack)); +/* + * Basic functions. + */ -EXTERN void TkUndoInsertUndoSeparator _ANSI_ARGS_((TkUndoRedoStack * stack)); +MODULE_SCOPE void TkUndoPushStack(TkUndoAtom **stack, TkUndoAtom *elem); +MODULE_SCOPE TkUndoAtom *TkUndoPopStack(TkUndoAtom **stack); +MODULE_SCOPE int TkUndoInsertSeparator(TkUndoAtom **stack); +MODULE_SCOPE void TkUndoClearStack(TkUndoAtom **stack); -EXTERN void TkUndoPushAction _ANSI_ARGS_((TkUndoRedoStack * stack, - Tcl_DString * actionScript, Tcl_DString * revertScript)); +/* + * Functions for working on an undo/redo stack. + */ -EXTERN int TkUndoRevert _ANSI_ARGS_((TkUndoRedoStack * stack)); - -EXTERN int TkUndoApply _ANSI_ARGS_((TkUndoRedoStack * stack)); +MODULE_SCOPE TkUndoRedoStack *TkUndoInitStack(Tcl_Interp *interp, int maxdepth); +MODULE_SCOPE void TkUndoSetDepth(TkUndoRedoStack *stack, int maxdepth); +MODULE_SCOPE void TkUndoClearStacks(TkUndoRedoStack *stack); +MODULE_SCOPE void TkUndoFreeStack(TkUndoRedoStack *stack); +MODULE_SCOPE void TkUndoInsertUndoSeparator(TkUndoRedoStack *stack); +MODULE_SCOPE TkUndoSubAtom *TkUndoMakeCmdSubAtom(Tcl_Command command, + Tcl_Obj *actionScript, TkUndoSubAtom *subAtomList); +MODULE_SCOPE TkUndoSubAtom *TkUndoMakeSubAtom(TkUndoProc *funcPtr, + ClientData clientData, Tcl_Obj *actionScript, + TkUndoSubAtom *subAtomList); +MODULE_SCOPE void TkUndoPushAction(TkUndoRedoStack *stack, + TkUndoSubAtom *apply, TkUndoSubAtom *revert); +MODULE_SCOPE int TkUndoRevert(TkUndoRedoStack *stack); +MODULE_SCOPE int TkUndoApply(TkUndoRedoStack *stack); # undef TCL_STORAGE_CLASS # define TCL_STORAGE_CLASS DLLIMPORT |