/* * This file defines everything we need to handle * nestable bindable macros. */ #include "def.h" /* * Currently we allow a maximum of 40 keys to be * bound to macros. */ #define MAXKMAC (40) struct macrobind { KEY key, *macro ; } mbind[MAXKMAC] ; extern KEY *kbdmip, *kbdmop ; extern KEY *kbdnext ; extern KEY *lmalloc() ; /* * This macro takes the currently defined keyboard * macro and binds it to a key. It copies the * macro higher in the array, and points things at * that copy for the next one. */ bindmacrotokey(f, n, c) { register struct macrobind *mp ; KEY *cur ; KEY *p, *q ; KEY bc ; SYMBOL *sp ; if (kbdmip) { ewprintf("Not now") ; return(FALSE) ; } sp = symlookup("call-last-kbd-macro") ; if (sp==NULL) { ewprintf("Couldn't find call-last-kbd-macro") ; return(FALSE) ; } cur = (KEY *)lmalloc(sizeof(KEY) * (long)(kbdnext-kbdm)) ; if (cur==NULL) { ewprintf("Out of macro space") ; return(FALSE) ; } if (kbdmop==NULL) ewprintf("Set key to macro: ") ; bc = (int) getkey(0) ; for (p=kbdm, q=cur; pkey==bc) { free(mp->macro) ; mp->macro = cur ; } else if (mp->key==0) { mp->key = bc ; mp->macro = cur ; binding[(KEY) bc] = sp ; return(TRUE) ; } } ewprintf("Out of macro space") ; return(FALSE) ; } /* * Here we find the macro associated with a particular * key, and bind everything. */ KEY *kbdloc(k) { register struct macrobind *p ; if (k==KRANDOM || k==(KCTLX|'E')) return(kbdm) ; if (k==KMACCUR) return(kbdnext + 10) ; for (p=mbind; pkey) return(p->macro) ; return(NULL) ; } /* * This routine does some initialization which is best * done here. */ kbdminit() { kbdm[0] =(KCTLX|')') ; kbdnext = kbdm + 1 ; } /* * We even allow a stack to handle recursive macros. We * don't let it get very deep, though. */ #define KSDEP (5) KEY *kbdstack[KSDEP] ; KEY **kbdsp = kbdstack ; /* * This routine pushes a position onto the stack. */ pushkbdm(k) KEY *k ; { if (kbdsp >= kbdstack + KSDEP) return(1) ; *kbdsp++ = k ; return(0) ; } /* * Here we pop one off. */ popkbdm() { if (kbdsp > kbdstack) kbdmop = (*--kbdsp) ; else kbdmop = NULL ; } /* * This forgets all of the macros. */ flushkbdm() { kbdsp = kbdstack ; }