/****************************************************************************/

#include <iocslib.h>
#include <doslibm.h>
#include "defines.h"
#include "skey.h"

extern	int	_khelp_;		/* ヘルプキー */
extern	struct	KEY_XY	*_keyxy_;	/* キーエリア構造体アドレス */
extern	int	_gmkeys_;		/* サーチキー数 */
extern	int	_gmmode_;		/* サーチモード */

/****************************************************************************/

int KeyIn2(int mode,int fkbclr,int btn)
/* getch2()/inkey2()共通ルーチン（ヘルプ対応）*/
/* V2.0 : 領域マウスキー判定対応 */
/* V2.1 : マウスリピート対応 */
/* V2.2 : マウスグラフィック座標対応 */
/* V2.3 : ちょっと改良 */
/* 漢字は読み込めない */
/* mode : 1=inkey2() , 0=getch2() */
{
unint c,cc,x,y,sx,sy,tx,ty,fc,fwx;
	while (1) {
	    while (B_KEYSNS()==0) { /* キーは押されていない */
		/* マウス無効条件：無効モードである/左ボタンが押されていない */
		
		/* ﾏｳｽｶｰｿﾙoffのとき右ｸﾘｯｸでon/offできるので毎回調べる */
		if (_gmmode_==-1||MS_STAT()==0) goto NSNS; /* マウス無効 */
		
		/* マウス左ボタン押下状態把握 */
		if (!mode) btn=mson(); /* getch2() */
		if ((cc=(btn>>16))==0) goto NSNS; /* 左ボタンは押されてない */
		
		/* マウス座標取得 */
		x=MS_CURGT();
		y=(x&0xffff);
		x>>=16;
		if (_gmmode_<100) { /* テキスト座標モードの時 */
			/* マウス座標をテキスト座標に直す */
			x/=8;
			y/=16;
		}
		
		/* 領域サーチ */
		for (c=0;c<_gmkeys_;c++) {
		    sx=_keyxy_[c].sx;
		    sy=_keyxy_[c].sy;
		    if (x>=sx && y>=sy /* 速く判定が終わりそうな順 */
		     && x<sx+_keyxy_[c].wx && y<sy+_keyxy_[c].wy) {
			/* 指定領域内で押されている */
			/* リピート不可のところでリピート？ */
			if (_keyxy_[c].mode==0 && cc!=1) goto NSNS; /* Yes */
			c=_keyxy_[c].key;
			goto GOHELP;
		    }
		}
		/* ファンクションキーサーチ */
		if (_gmmode_==0 || cc!=1) goto NSNS;
			/* ファンクションキーなし */
			/* ﾌｧﾝｸｼｮﾝｷｰはリピート処理なしだから */
		
		if (_gmmode_>=100) { /* グラフィック座標モードの時 */
			/* ファンクションキーはテキスト座標で判断する*/
			x/=8;
			y/=16;
		}
		tx=TWIDTH(&ty);
		if (y==ty-1) { /* 最下行の時 */
			fc=(tx==32? 5:10); /* ファンクションキー数 */
			fwx=(tx==96? 8:5); /* ファンクションキー幅 */
			for (c=0;c<fc;c++) {
				sx=xfkey(c);
				if (x>=sx && x<sx+fwx) {
					/* ﾌｧﾝｸｼｮﾝｷｰのｽｷｬﾝｷｰｺｰﾄﾞ作成 */
					c=(0x63+c)<<8;
					goto GOHELP;
				}
			}
		}
	      NSNS:;
		if (mode) return(0); /* inkey2() */
	    }
	    /* キー入力あり */
	    c=B_KEYINP();
	    if (fkbclr) KFLUSHIO(0xff); /* キーボードバッファークリア */
	
	    /* 修飾キー（SHIFT/CTRLなど）のときは入力しない */
	    if ((c>=0x5a00 && c<=0x5d00)||c==0x5f00||c==0x6000||c>=0x6d00) goto NSNS2;
	
	    /* 特殊キーの時のみ SHIFT/CTRL/OPT.1/OPT.2 判定 */
	    if ((c&0xff)==0x00) c=(c&0xff00)|BITSNS(0x0e);
	
	  GOHELP:
	    if (_khelp_==-1) break;
	    /* ヘルプは有効 */
	    if (!look_help(c==SKhelp||keycmp(c,_khelp_))) break;
	  NSNS2:
	    c=0; /* ヘルプを無効にするため：マウス対応 */
	    if (mode) break; /* inkey2() */
	}
	return(c);
}

/****************************************************************************/
