📄 ninput.h
字号:
/*NEO SDK V2.1.90 For DOS
Copyleft Cker Home 2003-2006.
Open Source Obey NEO_PL.TXT.
http://neo.coderlife.net
ckerhome@yahoo.com.cn
文件名称 : ninput.h
摘 要 : 本头文件中包含NEO SDK里有关键盘、鼠标控制的各种函数、结构、全局变量
的声明及定义
当前版本 : V5.04
作 者 : 董凯
完成日期 : 2006.02.12
取代版本 : V5.02
原 作 者 : 董凯
完成日期 : 2006.02.09
*/
#ifndef NINPUT_H
#define NINPUT_H
/*======================================================*
* 宏和结构的定义(Macro & type definitions) *
*======================================================*/
#ifdef NEO_mouse_bas_unused
#define NEO_mouse_exp_unused
#endif
/*双击延时量(单位:秒*18):FAST_DBLCLICK为最短延时;SLOW_DBLCLICK为最长延时;MIDDLE_DBLCLICK为中
速延时,即两次左键单击时间间隔小于0.35秒时被视为一次双击动作.其判定过程通过函数refresh-
cursor()实现.*/
#define FAST_DBLCLICK 0x3L
#define MID_DBLCLICK 0x5L
#define SLOW_DBLCLICK 0x9L
#define MOUSE_L_DOWN 0x1
#define MOUSE_R_DOWN 0x2
#define MOUSE_LR_DOWN 0x3
#define MOUSE_LDBL_CLICK 0x5
#define MOUSE_RDBL_CLICK 0x6
#define MOUSE_L_UP 0x8
#define MOUSE_R_UP 0x10
#ifndef KEY_BUF_SIZE
#define KEY_BUF_SIZE 0x10
#endif
#define SCAN_ALT 56
#define SCAN_CTRL 29
#define SCAN_caps 58
#define SCAN_LEFTSHIFT 42
#define SCAN_RIGHTSHIFT 54
#define SCAN_SHIFT (keyflag[SCAN_RIGHTSHIFT]||keyflag[SCAN_LEFTSHIFT])
/* 键盘 ASCII 码 */
#define KEY_ESC 27
#define KEY_END 255
#define KEY_LEFT 254
#define KEY_RIGHT 253
#define KEY_PAGEUP 252
#define KEY_UP 251
#define KEY_DOWN 250
#define KEY_HOME 249
#define KEY_CTRLBREAK 248
#define KEY_F1 247
#define KEY_F2 246
#define KEY_F3 245
#define KEY_F4 244
#define KEY_F5 243
#define KEY_F6 242
#define KEY_F7 241
#define KEY_F8 240
#define KEY_F9 239
#define KEY_F10 238
#define KEY_PAGEDOWN 237
#define KEY_INSERT 236
#define KEY_DELETE 235
#define KEY_LEFTALT 234
#define KEY_RIGHTALT 233
#define KEY_RIGHTCTRL 232
#define KEY_LEFTCTRL 231
#define KEY_caps 230
#define KEY_F11 229
#define KEY_F12 228
#define KEY_PRINTSCREEN 228
#define KEY_NUMLOCK 227
#define KEY_SCROLLLOCK 226
#define KEY_LEFTSHIFT 225
#define KEY_RIGHTSHIFT 224
#define KEY_WINDOWS 223
#ifndef NEO_keyboard_unused
unsigned char g_pause_key;
unsigned char g_ascii_key;
unsigned char g_scan_key;
unsigned char keyflag[128];
unsigned char g_keypress;
/*unsigned char g_wheel_flag = FALSE;*/
unsigned g_key;
unsigned g_key_filter = 0xffff;
unsigned g_combine_keys_delay = 400;
static unsigned char g_caps;
static unsigned char g_cur_code,g_key_code;
#endif
void interrupt far (*old_key_int)(__CPPARGS);
#ifndef NEO_keyboard_unused
unsigned char asciis[] =
{
0,27,'1','2','3','4','5','6','7','8','9','0','-','=',8,9,
'q','w','e','r','t','y','u','i','o','p','[',']',13,KEY_LEFTCTRL,'a','s',
'd','f','g','h','j','k','l',';',39,'`',0,92,'z','x','c','v',
'b','n','m',',','.','/',0,'*',KEY_LEFTALT,' ',KEY_caps,KEY_F1,KEY_F2,KEY_F3,KEY_F4,KEY_F5,
KEY_F6,KEY_F7,KEY_F8,KEY_F9,KEY_F10,KEY_NUMLOCK,KEY_SCROLLLOCK,'7','8','9','-','4','5','6','+','1',
'2','3','0',127,0,0,'\\',KEY_F11,KEY_F12,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#endif
#ifndef NEO_keyboard_unused
unsigned char shifts[] =
{
0,27,'!','@','#','$','%','^','&','*','(',')','_','+',8,9,
'Q','W','E','R','T','Y','U','I','O','P','{','}',13,1,'A','S',
'D','F','G','H','J','K','L',':',34,'~',KEY_LEFTSHIFT,'|','Z','X','C','V',
'B','N','M','<','>','?',KEY_RIGHTSHIFT,'*',1,' ',0,0,0,0,0,0,
0,0,0,0,0,0,0,'7','8','9','-','4','5','6','+','1',
'2','3','0',127,0,0,'|',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#endif
#ifndef NEO_keyboard_unused
char specials[] =
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,KEY_RIGHTCTRL,0,0,
0,0,0,0,0,0,0,0,0,0,KEY_WINDOWS,0,0,0,0,0,
0,0,0,0,0,'/',0,KEY_PRINTSCREEN,KEY_RIGHTALT,0,0,0,0,0,0,0,
0,0,0,0,0,0,KEY_CTRLBREAK,KEY_HOME,KEY_UP,KEY_PAGEUP,0,KEY_LEFT,0,KEY_RIGHT,0,KEY_END,
KEY_DOWN,KEY_PAGEDOWN,KEY_INSERT,KEY_DELETE,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
#endif
#ifndef NEO_mouse_exp_unused
typedef struct
{
unsigned int cursor[32];
char hotx;
char hoty;
}Hardcur_T;
Hardcur_T g_arrow_t=
{
{
0x3fff,0x1fff,0x0fff,0x07ff,
0x03ff,0x01ff,0x00ff,0x007f,
0x003f,0x00ff,0x01ff,0x10ff,
0x30ff,0xf87f,0xf87f,0xfc3f,
0x0000,0x7c00,0x6000,0x7000,
0x7800,0x7c00,0x7e00,0x7f00,
0x7f80,0x7e00,0x7c00,0x4600,
0x0600,0x0300,0x0300,0x0180
},
0,0,
};
#endif
#ifndef NEO_keyboard_unused
unsigned g_key_buf[KEY_BUF_SIZE];
unsigned char g_head_count;
unsigned char g_tail_count;
#endif
#ifndef NEO_mouse_adv_unused
typedef struct
{
int x; /*当前鼠标光标 x坐标*/
int y; /*当前鼠标光标 y坐标*/
/*int z;*/ /*当前鼠标滚轮偏移量*/
#ifndef NEO_mouse_exp_unused
char logic_x; /*鼠标光标贴图的逻辑坐标(相对于以上的两个物理坐标,可以为负值)*/
char logic_y;
#endif
long dblclickdelay; /*双击延时变量.当第二次按下鼠标键与第一次的时间间隔小于该变量时,被
认为是双击鼠标键*/
char advclickinfo; /*当前鼠标的按键状态,
clickinfo=0 : 没动作;
clickinfo=1 : 左键被按下;
clickinfo=2 : 右键被按下;
clickinfo=3 : 两键同时按下;
clickinfo=5 : 左键被双击; */
int oldclickinfo;
clock_t start;
clock_t end; /*这几个变量是为实现记录左键双击而设的“私有”变量*/
char status_flag;/*临时去掉鼠标光标标志,为1时暂时不显示光标,一般用在作画操作前隐藏鼠标,防止满屏留下鼠标拖动轨迹*/
#ifdef NEO_color_depth_16_unused
char overlay_buf[CUR_SIDE];/*覆盖缓冲区:保存被光标覆盖的屏幕,以在光标移开后恢复*/
#else
int overlay_buf[CUR_SIDE];
#endif
Cursor iconbuffer; /*光标缓冲区:保存被光标(文件)的位图信息,用以显示光标*/
Cursor_ptr iconbuffer_p; /*指向光标缓冲区的指针,用作调用相关函数的参数*/
char mouse_b;
}Mouse_t;
Mouse_t *g_mouse_tp;
#endif
/*======================================================*
* 函数声明(Function declare) *
*======================================================*/
#define keyboard_callback(key_filter) (g_key_filter = (key_filter))
#define _get_asc() (g_keypress == 1?g_ascii_key : 0)
#define _get_scan() (g_keypress == 1?g_scan_key : 0)
void clear_keybuf(void);
void interrupt new_key_int(__CPPARGS);
unsigned readkey(void);
void simulate_keypress(unsigned key);
void install_keyboard(void);
void remove_keyboard(void);
unsigned char _getch(void);
unsigned char get_asc(void);
unsigned char get_scan(void);
/*NEO的键盘例程提供的函数不能与TC标准库的键盘处理函数混用(如getch();)否则将无法正常结束程序*/
char keypressed(void);
char scan_asc_key(unsigned char scankey, unsigned char asckey);
#ifndef NEO_mouse_bas_unused
/*判断鼠标是否发生按键动作.*/
#define mouse_act() get_click() == 0?0 : 1
int init_mouse(void); /*初始化鼠标器.*/
int get_mouse_x(void); /*获取当前鼠标光标X坐标.*/
int get_mouse_y(void); /*获取当前鼠标光标Y坐标.*/
char get_click(void); /*获取当前鼠标按钮状态.*/
/*获取按钮按下状态.*/
unsigned get_press_info(int key, int *x, int *y, int *count);
/*获取按钮放开状态.*/
unsigned get_release_info(int key, int *x, int *y, int *count);
void locate_mouse(int x,int y);
/*显示鼠标光标.*/
void show_hard_cur(void);
/*隐藏鼠标光标.*/
void hide_hard_cur(void);
/*设置光标的有效活动范围.*/
void set_mouse_range(int xmin,int xmax,int ymin,int ymax);
#endif
#ifndef NEO_mouse_exp_unused
void mouse_shape(Hardcur_T cur);
void set_mouse_speed(int vx,int vy);
/*设置光标速度加速下限.*/
void speed_limit(int ms);
/*设置鼠标光标焦点*/
void set_mouse_focus(char f_x, char f_y);
#endif
#ifndef NEO_mouse_adv_unused
char install_mouse(void); /*鼠标器高级初始化.*/
/*设置光标坐标.*/
void position_mouse(int x,int y);
void show_mouse(void); /*鼠标图形光标显示.*/
void hide_mouse(void); /*鼠标图形光标隐藏.*/
void cursor_refresh(void); /*鼠标图形光标的更新显示.*/
void scare_mouse_area(int x, int y, int w, int h); /*设置光标的隐藏区域*/
void scare_mouse(void); /*暂时隐藏光标*/
void unscare_mouse(void); /*取消光标隐藏*/
int mouse_refresh(void); /*鼠标图形光标的刷新.*/
/*鼠标双击判定延时设置.*/
void set_dbl_click_delay(int userdelay);
/*改变鼠标光标的形状.*/
int set_mouse_icon(char *p_iconfile);
int get_click_info(void);/*获得当前的鼠标高级按键状态.*/
void remove_mouse(void); /*鼠标关闭函数.*/
#endif
/*======================================================*
* 函数定义(Function definitions) *
*======================================================*/
#ifndef NEO_keyboard_unused
void clear_keybuf(void)
{
if (!_keyboard_installed)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"clear_keybuf", N_KEYB_NOT_INIT, 0};
throw_error(error);
#endif
}
else
{
g_key = 0;
memset(keyflag, 0, sizeof(keyflag)); /*键盘映射缓冲归零*/
memset(g_key_buf, 0, KEY_BUF_SIZE); /*键盘队列缓冲归零*/
#ifndef NEO_key_buffer_unused
g_tail_count = g_head_count;
#endif
}
}
void interrupt new_key_int(__CPPARGS)
{
static unsigned char specialflag;
static char rec_specials;
unsigned char k, c, temp;
k = inp(0x60);
temp = inp(0x61) | 0x80;
outportb(0x61,temp);
if (k == 0xe0) specialflag = 1;
else if (k == 0xe1) g_pause_key = 1;
else
{
if (k & 0x80)
{
k &= 0x7f;
keyflag[k] = 0;
g_keypress = -1;
}
else
{
g_key_code = g_cur_code;
g_cur_code = g_scan_key = k;
keyflag[k] = 1;
if (specialflag) /*防止特殊键被重复判断*/
{
c = specials[k];
if (rec_specials == -33)
{
if (c) g_ascii_key = c;
specialflag = rec_specials = 0;
outportb(0x20,0x20);
return;
}
rec_specials = -33;
}
else
{
if (k == SCAN_caps)
{
g_caps = (~g_caps) & 1;
}
if (SCAN_SHIFT)
{
c = shifts[k];
if ((c >= 'A')&&(c <= 'Z') && g_caps)
c += 'a'- 'A';
}
else
{
c=asciis[k];
if (( c >= 'a') && (c <= 'z') && g_caps)
c -= 'a' - 'A';
}
}
if (c) g_ascii_key = c;
g_keypress = 1;
}
specialflag=0;
}
outportb(0x20,0x20);
#ifndef NEO_key_buffer_unused
/*往键盘缓冲区放入相应的键值*/
if (g_keypress == 1 && (g_key = (g_scan_key << 8) + g_ascii_key) != 10975)
{
if (g_key_filter == 0xffff)
{
g_key_buf[g_head_count] = g_key & g_key_filter;
}
else if (g_key_filter == 0)
{ /*按键不被加入缓冲队列*/ }
else
{
g_key_buf[g_head_count] = g_key_filter;
}
if ( !((++g_head_count) < KEY_BUF_SIZE) )
{
g_head_count = 0;
}
if (g_head_count == g_tail_count)
{
if( !((++g_tail_count) < KEY_BUF_SIZE) )
{
g_tail_count = 0;
}
}
}
#else
g_key = (g_scan_key << 8) + g_ascii_key;
#endif
}
unsigned readkey(void)
{
#ifndef NEO_key_buffer_unused
unsigned key;
while (g_head_count == g_tail_count); /*缓冲区为空时等待*/
key = g_key_buf[g_tail_count];
if ( !((++g_tail_count) < KEY_BUF_SIZE) )
{
g_tail_count = 0;
}
return key;
#else
unsigned key = g_key;
if (g_keypress == 1)
{
g_key = 0;
}
return key;
#endif
}
void simulate_keypress(unsigned key)
{
#ifndef NEO_key_buffer_unused
if ((g_key = key) != 10975)
{
g_key_buf[g_head_count] = g_key;
if ( !((++g_head_count) < KEY_BUF_SIZE) )
{
g_head_count = 0;
}
if (g_head_count == g_tail_count)
{
if( !((++g_tail_count) < KEY_BUF_SIZE) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -