home *** CD-ROM | disk | FTP | other *** search
- /*
- kbrecord.c 8/04/87 jmd
-
- % kb_Record
-
- keystroke recorder.
-
- OWL 1.1
- Copyright (c) 1988, 1989 by Oakland Group, Inc.
- ALL RIGHTS RESERVED.
-
- Revision History:
- -----------------
- 9/11/88 jmd Added support for GREYPLUS and GREYMINUS
- 10/05/88 jmd Added support for kb_Check
- 11/07/88 jmd fixed support for kb_Check, added assert
- 12/01/88 jmd modified for new KeyReadEvent
-
- 1/09/88 jmd changed if (mode != KB_STOP) to if (key_mode ...
- 7/07/89 gam changed NULL to FNULL where applicable
- 8/14/89 jmd added evcheck support and MOUSE support
- 8/23/89 jmd changed {MOUSE} to {M}, removed use of fprintf return value
-
- Key File Rules:
- ---------------
-
- Regular letters are printed out verbatim
- Special keys are printed out as scancode.h string
- e.g., {ENTER} {ESC} {FN1}
-
- '{' is quoted as '{}'
- Carriage returns are ignored in the key file
- the {PAUSE} command can be used to indicate a delay.
- the {PROMPT} waits for a real key stroke.
-
- the {MOUSE} command is followed by 3 numbers:
- mouse x position, mouse y position, mouse event (button state)
-
- Note: key_col is used to make the output file look nice. Its
- value is not necessarily religiously maintained.
- */
-
- #include "oakhead.h"
- #include "disppriv.h"
-
- #include "strdecl.h" /* for ascii() */
- #include "scancode.h"
- #include "kbrecord.h"
-
- #include <ctype.h>
-
- struct key_name {
- unsigned val;
- char *name;
- };
-
- static struct key_name keylist[] = {
- { HOME, "HOME" },
- { END, "END" },
- { LEFT, "LEFT" },
- { RIGHT, "RIGHT" },
- { UP, "UP" },
- { DOWN, "DOWN" },
- { PGUP, "PGUP" },
- { PGDN, "PGDN" },
- { INS, "INS" },
- { DEL, "DEL" },
- { TAB, "TAB" },
- { BACKSPACE, "BACKSPACE" },
- { ENTER, "ENTER" },
- { ESC, "ESC" },
- { PRTSC, "PRTSC" },
- { GREYPLUS, "GREYPLUS" },
- { GREYMINUS, "GREYMINUS" },
- { CTRL_HOME, "CTRL_HOME" },
- { CTRL_END, "CTRL_END" },
- { CTRL_LEFT, "CTRL_LEFT" },
- { CTRL_RIGHT, "CTRL_RIGHT" },
- { CTRL_PGUP, "CTRL_PGUP" },
- { CTRL_PGDN, "CTRL_PGDN" },
- { CTRL_BACKSPACE, "CTRL_BACKSPACE" },
- { CTRL_PRTSC, "CTRL_PRTSC" },
- { SHFT_HOME, "SHFT_HOME" },
- { SHFT_END, "SHFT_END" },
- { SHFT_LEFT, "SHFT_LEFT" },
- { SHFT_RIGHT, "SHFT_RIGHT" },
- { SHFT_UP, "SHFT_UP" },
- { SHFT_DOWN, "SHFT_DOWN" },
- { SHFT_PGUP, "SHFT_PGUP" },
- { SHFT_PGDN, "SHFT_PGDN" },
- { SHFT_INS, "SHFT_INS" },
- { SHFT_DEL, "SHFT_DEL" },
- { SHFT_TAB, "SHFT_TAB" },
- { FN1, "FN1" },
- { FN2, "FN2" },
- { FN3, "FN3" },
- { FN4, "FN4" },
- { FN5, "FN5" },
- { FN6, "FN6" },
- { FN7, "FN7" },
- { FN8, "FN8" },
- { FN9, "FN9" },
- { FN10, "FN10" },
- { SHFT_FN1, "SHFT_FN1" },
- { SHFT_FN2, "SHFT_FN2" },
- { SHFT_FN3, "SHFT_FN3" },
- { SHFT_FN4, "SHFT_FN4" },
- { SHFT_FN5, "SHFT_FN5" },
- { SHFT_FN6, "SHFT_FN6" },
- { SHFT_FN7, "SHFT_FN7" },
- { SHFT_FN8, "SHFT_FN8" },
- { SHFT_FN9, "SHFT_FN9" },
- { SHFT_FN10, "SHFT_FN10" },
- { CTRL_FN1, "CTRL_FN1" },
- { CTRL_FN2, "CTRL_FN2" },
- { CTRL_FN3, "CTRL_FN3" },
- { CTRL_FN5, "CTRL_FN5" },
- { CTRL_FN6, "CTRL_FN6" },
- { CTRL_FN7, "CTRL_FN7" },
- { CTRL_FN8, "CTRL_FN8" },
- { CTRL_FN9, "CTRL_FN9" },
- { CTRL_FN10, "CTRL_FN10" },
- { ALT_FN1, "ALT_FN1" },
- { ALT_FN2, "ALT_FN2" },
- { ALT_FN3, "ALT_FN3" },
- { ALT_FN4, "ALT_FN4" },
- { ALT_FN5, "ALT_FN5" },
- { ALT_FN6, "ALT_FN6" },
- { ALT_FN7, "ALT_FN7" },
- { ALT_FN8, "ALT_FN8" },
- { ALT_FN9, "ALT_FN9" },
- { ALT_FN10, "ALT_FN10" },
- { CTRL_2, "CTRL_2" },
- { CTRL_6, "CTRL_6" },
- { CTRL_HYPHEN, "CTRL_HYPHEN" },
- { CTRL_BS, "CTRL_BS" },
- { CTRL_A, "CTRL_A" },
- { CTRL_B, "CTRL_B" },
- { CTRL_C, "CTRL_C" },
- { CTRL_D, "CTRL_D" },
- { CTRL_E, "CTRL_E" },
- { CTRL_F, "CTRL_F" },
- { CTRL_G, "CTRL_G" },
- { CTRL_H, "CTRL_H" },
- { CTRL_I, "CTRL_I" },
- { CTRL_J, "CTRL_J" },
- { CTRL_K, "CTRL_K" },
- { CTRL_L, "CTRL_L" },
- { CTRL_M, "CTRL_M" },
- { CTRL_N, "CTRL_N" },
- { CTRL_O, "CTRL_O" },
- { CTRL_P, "CTRL_P" },
- { CTRL_Q, "CTRL_Q" },
- { CTRL_R, "CTRL_R" },
- { CTRL_S, "CTRL_S" },
- { CTRL_T, "CTRL_T" },
- { CTRL_U, "CTRL_U" },
- { CTRL_V, "CTRL_V" },
- { CTRL_W, "CTRL_W" },
- { CTRL_X, "CTRL_X" },
- { CTRL_Y, "CTRL_Y" },
- { CTRL_Z, "CTRL_Z" },
- { ALT_1, "ALT_1" },
- { ALT_2, "ALT_2" },
- { ALT_3, "ALT_3" },
- { ALT_4, "ALT_4" },
- { ALT_5, "ALT_5" },
- { ALT_6, "ALT_6" },
- { ALT_7, "ALT_7" },
- { ALT_8, "ALT_8" },
- { ALT_9, "ALT_9" },
- { ALT_0, "ALT_0" },
- { ALT_HYPHEN, "ALT_HYPHEN" },
- { ALT_EQUALS, "ALT_EQUALS" },
- { ALT_A, "ALT_A" },
- { ALT_B, "ALT_B" },
- { ALT_C, "ALT_C" },
- { ALT_D, "ALT_D" },
- { ALT_E, "ALT_E" },
- { ALT_F, "ALT_F" },
- { ALT_G, "ALT_G" },
- { ALT_H, "ALT_H" },
- { ALT_I, "ALT_I" },
- { ALT_J, "ALT_J" },
- { ALT_K, "ALT_K" },
- { ALT_L, "ALT_L" },
- { ALT_M, "ALT_M" },
- { ALT_N, "ALT_N" },
- { ALT_O, "ALT_O" },
- { ALT_P, "ALT_P" },
- { ALT_Q, "ALT_Q" },
- { ALT_R, "ALT_R" },
- { ALT_S, "ALT_S" },
- { ALT_T, "ALT_T" },
- { ALT_U, "ALT_U" },
- { ALT_V, "ALT_V" },
- { ALT_W, "ALT_W" },
- { ALT_X, "ALT_X" },
- { ALT_Y, "ALT_Y" },
- { ALT_Z, "ALT_Z" },
- { HARD_MEV, "M" }, /* mouse event */
- { KEY_PAUSE, "PAUSE" }, /* pause command */
- { KEY_PROMPT, "PROMPT" }, /* prompt command */
- { 0, "" } /* End of list, ignore keystroke */
- };
-
- OSTATIC unsigned krec_Read(_arg1(moupos_struct *));
- OSTATIC unsigned krec_Check(_arg1(unsigned));
- OSTATIC char *key_FindName(_arg1(unsigned));
- OSTATIC unsigned key_FindVal(_arg1(char *));
-
- #define KEY_WIDTH 70 /* width of key file */
-
- /** static data **/
-
- static int key_mode = KB_STOP;
- static int key_col = 0; /* column in key file */
- static int key_delay = 0;
-
- static boolean key_evcheck = TRUE; /* old state of evcheck flag */
-
- static FILE *keyfile;
-
- static dig_hReadEvent_func ((*hReadEventFptr)) = FNULL;
- static dig_hCheckEvent_func ((*hCheckEventFptr)) = FNULL;
- /* -------------------------------------------------------------------------- */
-
- void kb_Record(fp, mode, delay)
- FILE *fp;
- int mode;
- int delay;
- /*
- Starts up memory key handler.
-
- mode determines the operating mode.
-
- KB_RECORD records keystrokes to fp.
- KB_PLAY playsback keystrokes from fp
- KB_STOP stops operation (play or learn)
-
- fp must be an open file (for writing if KB_RECORD, reading if KB_PLAY)
-
- delay determines how much to pause between keystrokes.
- */
- {
- owl_Assert(disp_Ok(), OE_KR_DISP);
-
- if (mode == KB_STOP) {
- if (key_mode != KB_STOP) {
- /* restore keybord handler */
- key_mode = KB_STOP;
- key_col = 0;
- key_delay = 0;
- keyfile = NULL;
-
- disp_SetEvCheck(key_evcheck);
-
- curr_dmgr->disp.dig.hReadEvent = hReadEventFptr;
- curr_dmgr->disp.dig.hCheckEvent = hCheckEventFptr;
- }
- }
- else {
- key_col = 0;
- key_mode = mode;
- key_delay = delay;
- keyfile = fp;
-
- key_evcheck = disp_EvCheck();
-
- rewind(keyfile);
-
- /* save old keyboard handler */
- hReadEventFptr = curr_dmgr->disp.dig.hReadEvent;
- hCheckEventFptr = curr_dmgr->disp.dig.hCheckEvent;
-
- /* set new keyboard handler */
- curr_dmgr->disp.dig.hReadEvent = krec_Read;
- curr_dmgr->disp.dig.hCheckEvent = krec_Check;
-
- /* we're not supporting kb_Check anymore, turn off evcheck flag */
- disp_SetEvCheck(FALSE);
- }
- }
- /* -------------------------------------------------------------------------- */
-
- static unsigned krec_Check(wait)
- unsigned wait;
- /*
- Substitute kb_Check handler
- Always returns TRUE.
- */
- {
- oak_notused(wait);
- return(TRUE);
- }
- /* -------------------------------------------------------------------------- */
-
- static unsigned krec_Read(mposp)
- moupos_struct *mposp;
- /*
- effects: reads next key from keyboard buffer.
- returns: ASCII value of character in bits 0-7,
- and the scan code of the character in
- bits 8-15.
-
- In KB_RECORD mode saves the scancode in the keyfile.
-
- In KB_PLAY mode returns the scancodes from the keyfile.
- */
- {
- unsigned scancode;
- int key, gotkey;
- char *p, name[22];
-
- if (key_mode == KB_PLAY) {
-
- gotkey = 0;
- while(!gotkey) {
- gotkey = 1;
-
- if ((key = fgetc(keyfile)) == EOF) {
- key_mode = KB_STOP;
- scancode = (*hReadEventFptr)(mposp);
- }
- else if (key == '\n') {
- /* skip newline */
- gotkey = 0;
- }
- else if (key == '{') {
- p = name;
- while ((p - name) < 20) {
- if ((*p = (char) fgetc(keyfile)) == EOF) {
- key_mode = KB_STOP;
- scancode = (*hReadEventFptr)(mposp);
- break;
- }
- else if (*p == '}') {
- if (p == name) {
- /* "{}" is quoted '{' */
- scancode = '{';
- }
- else {
- *p = '\0';
- /* look up scancode, test for commands */
- switch (scancode = key_FindVal(name)) {
- case HARD_MEV:
- /* get mouse event information */
- fscanf(keyfile, "(%d,%d,%u)",
- &(mposp->x), &(mposp->y), &(mposp->event));
- break;
-
- case KEY_PAUSE:
- /* pause command (alway pause for fixed amount?) */
- if (key_delay > 0) {
- hard_Pause(key_delay);
- }
- gotkey = 0;
- break;
-
- case KEY_PROMPT:
- /* prompt: wait for a real keystroke */
- while ((*hReadEventFptr)(mposp) == HARD_MEV) {
- ;
- }
- gotkey = 0;
- break;
-
- default:
- break;
- }
- }
- break; /* while ((p - name) < 20) */
- }
- p++;
- }
- }
- else {
- scancode = (unsigned) ascii(key);
- }
- }
- /* delay */
- if (key_delay > 0) {
- hard_Pause(key_delay);
- }
- }
- else if (key_mode == KB_RECORD) {
- scancode = (*hReadEventFptr)(mposp);
- if (ascii(scancode) == '{') {
- /* quote '{' character */
- fprintf(keyfile, "{}");
- key_col += 2;
- }
- else if (scancode == GREYPLUS || scancode == GREYMINUS) {
- /* Handle these separately to distinguish from regular + and - */
- fprintf(keyfile, "{%s}", key_FindName(scancode));
- key_col += 8;
- }
- else if (isprint(ascii(scancode))) {
- fprintf(keyfile, "%c", ascii(scancode));
- key_col++;
- }
- else {
- p = key_FindName(scancode);
- /* Skip unnamed keystrokes */
- if (*p != '\0') {
- fprintf(keyfile, "{%s}", p);
- key_col += 7;
- if (scancode == HARD_MEV) {
- /* tack on additional mouse information (x,y,event) */
- fprintf(keyfile, "(%d,%d,%u)", mposp->x, mposp->y, mposp->event);
- key_col += 8;
- }
- }
- }
-
- /* wrap key file for readability */
- if (key_col > KEY_WIDTH) {
- key_col = 0;
- fprintf(keyfile, "\n");
- }
- }
- else {
- scancode = (*hReadEventFptr)(mposp);
- }
-
- return(scancode);
- }
- /* -------------------------------------------------------------------------- */
-
- static char *key_FindName(key)
- unsigned key;
- /*
- Given a key value, lookup the key's name
- */
- {
- int i;
-
- for(i = 0; keylist[i].val != 0;i++) {
- if (keylist[i].val == key) {
- break;
- }
- }
-
- return(keylist[i].name);
- }
- /* -------------------------------------------------------------------------- */
-
- static unsigned key_FindVal(name)
- char *name;
- /*
- Given a key name, lookup the key's value
- If name is a command such as PAUSE
- then PAUSE is returned.
- */
- {
- int i;
-
- for(i = 0; keylist[i].val != 0;i++) {
- if (strcmp(keylist[i].name, name) == 0) {
- break;
- }
- }
-
- return(keylist[i].val);
- }
- /* -------------------------------------------------------------------------- */
-
-