 /*
		Keys funktion als nachladbar Modul

		Erlaubt Sonderzeichen Eingabe

		17.9.92						Stefan Bachert

*/

#define		__ACS_MODULE__

#include		<string.h>
#include		<acs.h>
#include		<keys.h>
static char line1 [] = {0x20,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
												0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0};
static char line2 [] = {0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
												0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0};
static char line3 [] = {0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,
												0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0};
static char line4 [] = {0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,
												0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0};
static char line5 [] = {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
												0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,0};
static char line6 [] = {0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
												0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,0};
static char line7 [] = {0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
												0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,0};
static char line8 [] = {0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
												0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff,0};

static void keys (void);
static Awindow *make_keys (void *not_used);
static INT16 service_keys (Awindow* wi, INT16 task, void* in_out);

#include		<keys.ah>

static INT16 service_keys (Awindow* wi, INT16 task, void* in_out)
		/*
		 *
		 */
{
	switch (task) {
		case AS_TERM:
			Awi_delete (wi);
			ACSmoduleterm ();
			break;
		case AS_INFO:								/* Info zeigen */
			A_dialog (&INFOBOX); break;
		default:
			return FALSE;
	}
	return TRUE;
}


static void keys (void)
		/*
		 *		Key empfangen
		 */
{
	static INT16 trecord [4] = {0, 3, 0, 0};
	INT16 chr, ch;
	INT16 top, temp, mstate;
	INT16 pxy [4];
	Awindow *wi;
	
	wind_get (0, WF_TOP, &top, &temp, &temp, &temp);
	wi = Awi_wid (top);

	chr = (ev_mmox - ev_window-> wi_work. x) / gl_wbox;
	ch	= (ev_mmoy - ev_window-> wi_work. y) / gl_hbox;

	pxy [0] = pxy [2] = chr * gl_wbox + ev_window-> wi_work. x;
	pxy [1] = pxy [3] = ch * gl_hbox	+ ev_window-> wi_work. y;

	pxy [0] += gl_wbox - 1;
	pxy [1] += gl_hbox - 1;

	Amo_hide ();

	vswr_mode (vdi_handle, MD_XOR);
	vsf_interior (vdi_handle, FIS_SOLID);
	vsf_color (vdi_handle, BLACK);
	v_bar (vdi_handle, pxy);				/* Invert */

	chr += (ch << 5);
	if (wi != NULL) {								/* eigenes Fenster */
		(wi-> keys) (wi, 0, chr);
	} else {
		trecord [2] = chr;
		appl_tplay (trecord, 1, 100);
	};
	evnt_timer (150, 0);
	v_bar (vdi_handle, pxy);				/* Normal */
	Amo_show ();

	wind_update (END_UPDATE);
	do {
		evnt_timer (40, 0);
		graf_mkstate (&temp, &temp, &mstate, &temp);
	} while ((mstate & 1) == 1);
	wind_update (BEG_UPDATE);
}

static Awindow *make_keys (void* not_used)
		/*
		 *		Erzeuge Fenster
		 */
{
	Awindow* wi;
	OBJECT *table;

	table = &TABLE;
	table [L1]. ob_spec. free_string = line1;
	table [L2]. ob_spec. free_string = line2;
	table [L3]. ob_spec. free_string = line3;
	table [L4]. ob_spec. free_string = line4;
	table [L5]. ob_spec. free_string = line5;
	table [L6]. ob_spec. free_string = line6;
	table [L7]. ob_spec. free_string = line7;
	table [L8]. ob_spec. free_string = line8;

	wi = Awi_create (&KEYS);
	if (wi == NULL) return NULL;
	return wi;
}


INT16 ACSinit (void)
{
	make_keys (NULL);
	return OK;
}