#include <kamui2.h>
#include <shinobi.h>
#include <ctype.h>
#include "dispstrex.h"
#include "key.h"
#include "command.h"

#include "kbdmain_.c"
#include "ktbnrm_.c"
#include "ktbsft_.c"
#include "ktbalt_.c"
#include "ktbgui_.c"

static PD_KBD hKbd[] = {
	NULL,
	NULL,
	NULL,
	NULL,
};

static Uint32 KbdPort[] = {
	PDD_PORT_A0,
	PDD_PORT_B0,
	PDD_PORT_C0,
	PDD_PORT_D0,
};

static void CheckKeyboard(Sint32 port, PD_KBD kbd, char* CommandLine);

void KeyBoardServer(void)
{
	Sint32 i;
	char CommandLine[80];

	/* キーボードハンドルが生成されていなければ生成する */
	for (i = 0; i < 4; i++) {
		if (hKbd[i] == NULL) {
			hKbd[i] = pdKbdCreate(KbdPort[i]);
		}
	}

	/* サーバー関数をコール */
	pdKbdExecServer();

	/* キーボードをチェック */
	for (i = 0; i < 4; i++) {
		CheckKeyboard(KbdPort[i], hKbd[i], CommandLine);
	}

}

static void CheckKeyboard(Sint32 port, PD_KBD hKbd, char* CommandLine)
{
	char ch;
	PDS_KEYBOARD* kbd;

	kbd = pdKbdGetData(port);
	if (kbd != NULL) {
		if (pdKbdIsHit(hKbd)) {
			ch = pdKbdGetChar(hKbd);

			switch (ch) {
				case '\0':
				{
					break;					/* No Action */
				}
				case 0x0D:
				{
					PRINTOUT(("%c", 0x08));	/* Back Space */
					txt_GetCommandLineString(CommandLine);		/* Execute Command */
					PRINTOUT(("%c", 0x0a));					/* Return */

					ExecuteCommand(CommandLine);

					PRINTOUT((">"));
					txt_SetBlink( TRUE );
					PRINTOUT(("_"));
					txt_SetBlink( FALSE );
					break;
				}
				case '\t':
				{
					/* 左ALT+Tabの場合にはWindowプライオリティを変える */
					if(kbd->ctrl & PDD_KEY_CTRL_LALT)
					{
						ChangeLastDraw2TopDraw();
					}
					break;
				}
				case 0x1c:		/* -> Move Right */
				{
					MoveCurrentWindow(5, 0);
					break;
				}
				case 0x1d:		/* <- Move Left */
				{
					MoveCurrentWindow(-5, 0);
					break;
				}
				case 0x1e:		/*  Move Up */
				{
					MoveCurrentWindow(0, -5);
					break;
				}
				case 0x1f:		/* Move Down */
				{
					MoveCurrentWindow(0, 5);
					break;
				}
				default:
				{
					PRINTOUT(("%c", 0x08));	/* Back Space */
					PRINTOUT(("%c", ch));
					txt_SetBlink( TRUE );
					PRINTOUT(("_"));
					txt_SetBlink( FALSE );
					break;
				}
			}
		}
	}
}