/*
 * Name:	MG 2a Amiga virtual terminal keyboard, default console
 * keymap. Created:	Mic Kaczmarczik (mic@emx.cc.utexas.edu) Last edit:
 * May 14, 1988
 */

#include "fkeys.h"

#undef	TRUE
#undef	FALSE
#include	"def.h"
#include	"kbd.h"

/*
 * List of function key names, from KFIRST to KLAST
 */
#ifdef	FKEYS
char	*keystrings[] = {
	"Up",		"Down",		"Left",		"Right",
	"Shift-Up",	"Shift-Down",	"Shift-Left",	"Shift-Right",
	"F1",		"F2",		"F3",		"F4",
	"F5",		"F6",		"F7",		"F8",
	"F9",		"F10",		"Shift-F1",	"Shift-F2",
	"Shift-F3",	"Shift-F4",	"Shift-F5",	"Shift-F6",
	"Shift-F7",	"Shift-F8",	"Shift-F9",	"Shift-F10",
	"Help",		"The menu",	"The resize gadget", "The mouse",
	"Mouse",			"Ctrl-Mouse",
	"Shift-Mouse",			"Shift-Ctrl-Mouse",
	"Meta-Mouse",			"Meta-Ctrl-Mouse",
	"Meta-Shift-Mouse",		"Meta-Shift-Ctrl-Mouse",
	"Mode-Mouse",			"Ctrl-Mode-Mouse",
	"Shift-Mode-Mouse",		"Shift-Ctrl-Mode-Mouse",
	"Meta-Mode-Mouse",		"Meta-Ctrl-Mode-Mouse",
	"Meta-Shift-Mode-Mouse",	"Meta-Shift-Ctrl-Mode-Mouse",
	"Echo-Mouse",			"Ctrl-Echo-Mouse",
	"Shift-Echo-Mouse",		"Shift-Ctrl-Echo-Mouse",
	"Meta-Echo-Mouse",		"Meta-Ctrl-Echo-Mouse",
	"Meta-Shift-Echo-Mouse",	"Meta-Shift-Ctrl-Echo-Mouse"
};
#endif

/*
 * Read in a key, doing whatever low-level mapping of ASCII code to 11 bit
 * code.  This has become a bit easier since keymaps.
 */
#define	CSI	0x9b

getkbd()
{
	register int    c;
#ifdef	FKEYS
	register int    n;
#endif
loop:
	if ((c = ttgetc()) == CSI) {
		c = ttgetc();
#ifdef	FKEYS
		if (c == '?') {	/* HELP key		 */
			ttgetc();	/* discard '~'		 */
			return (KHELP);
		}
		/* Arrow keys */
		if (c == 'A')
			return (KUP);
		if (c == 'B')
			return (KDOWN);
		if (c == 'C')
			return (KRIGHT);
		if (c == 'D')
			return (KLEFT);
		if (c == 'T')
			return (KSUP);
		if (c == 'S')
			return (KSDOWN);

		/* Shifted left, right arrow */
		if (c == ' ') {
			c = ttgetc();
			if (c == 'A' || c == '@')
				return ((c == 'A') ? (KSLEFT) : (KSRIGHT));
			goto loop;	/* try again, sucker */
		}
		/* Function keys	 */
		if (c >= '0' && c <= '9') {
			n = 0;
			do {
				n = 10 * n + c - '0';
				c = ttgetc();
			} while (c >= '0' && c <= '9');
			if (c == '~' && n < 20)
				return (n < 9) ? (KF1 + n) : (KSF1 + (n - 10));
			else
				goto loop;	/* Try again */
		}
#endif
		goto loop;	/* Try again */
	}
	return (c);
}

/*
 * Terminal specific keymap initialization, calling bind() to get things
 * done.  All the keys bound here are done globally.
 */

VOID
ttykeymapinit()
{
#ifdef	notdef
	KCHAR           c;
	register struct keymap *mapp = map_table[0].p_map;
	static KCHAR    esc_bs[] = {CCHR('['), CCHR('H')};
	static KCHAR    esc_del[] = {CCHR('['), CCHR('?')};

#define	BINDC(k,s) (c = k, bindkey(mapp, s, &c, 1))
#define	BINDM(m,s) bindkey(mapp, s, m, (sizeof(m)/sizeof(KCHAR)))

	/*
	 * Swap the backspace and del keys, at least in normal usage. This
	 * loses the help feature of CTRL-H, but we rebind CTRL-_ to do the
	 * same thing. Under FKEYS, the Help key calls describe-key-briefly.
	 */
	BINDC(CCHR('_'), "help-help");	/* CTRL-Backspace */
	BINDM(esc_bs, "backward-kill-word");
	BINDC(CCHR('H'), "delete-backward-char");

	BINDC(CCHR('?'), "delete-char");
	BINDM(esc_del, "kill-word");
#endif
}
