/* Context management functions. A context is a set of data used to - handle help requests, - displaying status info, - process keystrokes. */ #include "common.h" typedef struct { CharPtr HelpCode; KeyProc KeyAction; CharPtr Text; } Context; Local(ByteStorePtr) ContextStack=NULL; Local(Context) context; Local(void) ProcessKey(Char); /* Sets a new context */ Global(void) PushContext(CharPtr HelpCode, KeyProc KeyAction, CharPtr Text) { if (!ContextStack) { ContextStack=BSNew(sizeof(Context)); KeyboardView(ProcessKey); } context.HelpCode=_StringSave(HelpCode); context.KeyAction=KeyAction; context.Text=_StringSave(Text); BSSeek(ContextStack,0,SEEK_SET); BSInsert(ContextStack,&context,sizeof(Context)); UpdateInfoInMainWindow(MWI_STATUS,Text); } /* Restores previuos context */ Global(void) PopContext(void) { _MemFree(context.HelpCode); _MemFree(context.Text); BSSeek(ContextStack,0,SEEK_SET); BSDelete(ContextStack,sizeof(Context)); if (BSLen(ContextStack)) { BSRead(ContextStack,&context,sizeof(Context)); UpdateInfoInMainWindow(MWI_STATUS,context.Text); } else { ContextStack=BSFree(ContextStack); KeyboardView(NULL); } } /* Processes a keystroke in the current context */ Local(void) ProcessKey(Char key) { if (context.KeyAction) context.KeyAction(key); } Global(CharPtr) GetHelpKey(void) { return context.HelpCode; }