当前位置--> 首 页 --> 文 章 -->Linux Develop

※阅读文章※

Linux程式设计- 10.termios/keymap/terminal programming


作者:不祥 [文章出自: www.fanqiang.com]



termios
  
  

int tcgetattr (int fd, struct termios *termios_p); 
int tcsetattr (int fd, int optional_actions,const struct termios *termios_p); 
  
  
  
  



--------------------------------------------------------------------------------

keymap
我写了一个小程式来专门处理Linux上的keymap,keymap.h及keymap.c。 
在Linux Terminal上,如果您想要设定某些按键返回特定值,您会需要用到以下这些技巧。 

设定keymap
#include  
#include  
void setkeymap(void) 

  struct kbentry KEYMAP; 
  KEYMAP.kb_table=STATE; 
  KEYMAP.kb_index=SCANCODE; 
  KEYMAP.kb_value=VALUE; 
  ioctl(console,KDSKBENT,&KEYMAP); 


STATE为状态键组合 
/usr/include/linux/keyboard.h中 

#define KG_SHIFT        0 
#define KG_CTRL         2 
#define KG_ALT          3 
#define KG_ALTGR        1 
#define KG_SHIFTL       4 
#define KG_SHIFTR       5 
#define KG_CTRLL        6 
#define KG_CTRLR        7 
#define KG_CAPSSHIFT    8 

使用方式如: 
#define KST_CTRL        (1<#define KST_ALT         (1<#define KST_SHIFT       (1<#define KST_CTRL_ALT    (KST_CTRL|KST_ALT) 
#define KST_ALT_SHIFT   (KST_ALT|KST_SHIFT) 

SCANCODE为键盘扫描码 

#define SCAN_ESC      0x01 
#define SCAN_1        0x02 
#define SCAN_2        0x03 
#define SCAN_3        0x04 
#define SCAN_4        0x05 
#define SCAN_5        0x06 
#define SCAN_6        0x07 
#define SCAN_7        0x08 
#define SCAN_8        0x09 
#define SCAN_9        0x0A 
#define SCAN_0        0x0B 
#define SCAN_MINUS    0x0C 
#define SCAN_PLUS     0x0D 
#define SCAN_BACK     0x0E 
#define SCAN_TAB      0x0F 
#define SCAN_Q        0x10 
#define SCAN_W        0x11 
#define SCAN_E        0x12 
#define SCAN_R        0x13 
#define SCAN_T        0x14 
#define SCAN_Y        0x15 
#define SCAN_U        0x16 
#define SCAN_I        0x17 
#define SCAN_O        0x18 
#define SCAN_P        0x19 
#define SCAN_LTQUOTE  0x1A 
#define SCAN_RTQUOTE  0x1B 
#define SCAN_ENTER    0x1C 
#define SCAN_CTRL     0x1D 
#define SCAN_A        0x1E 
#define SCAN_S        0x1F 
#define SCAN_D        0x20 
#define SCAN_F        0x21 
#define SCAN_G        0x22 
#define SCAN_H        0x23 
#define SCAN_J        0x24 
#define SCAN_K        0x25 
#define SCAN_L        0x26 
#define SCAN_SPLIT    0x27 
#define SCAN_QUOTE    0x28 
#define SCAN_MARK     0x29 
#define SCAN_LSHIFT   0x2A 
#define SCAN_STAND    0x2B 
#define SCAN_Z        0x2C 
#define SCAN_X        0x2D 
#define SCAN_C        0x2E 
#define SCAN_V        0x2F 
#define SCAN_B        0x30 
#define SCAN_N        0x31 
#define SCAN_M        0x32 
#define SCAN_LSQUOTE  0x33 
#define SCAN_RSQUOTE  0x34 
#define SCAN_QUESTION 0x35 
#define SCAN_RSHIFT   0x36 
#define SCAN_PRTSCR   0x37 
#define SCAN_ALT      0x38 
#define SCAN_SPACE    0x39 
#define SCAN_CAPSLOCK 0x3A 
#define SCAN_F1       0x3B 
#define SCAN_F2       0x3C 
#define SCAN_F3       0x3D 
#define SCAN_F4       0x3E 
#define SCAN_F5       0x3F 
#define SCAN_F6       0x40 
#define SCAN_F7       0x41 
#define SCAN_F8       0x42 
#define SCAN_F9       0x43 
#define SCAN_F10      0x44 
#define SCAN_NUMLOCK  0x45 

#define SCAN_HOME     0x47 
#define SCAN_UP       0x48 
#define SCAN_PGUP     0x49 
#define SCAN_LEFT     0x4B 

#define SCAN_RIGHT    0x4D 

#define SCAN_END      0x4F 
#define SCAN_DOWN     0x50 
#define SCAN_PGDN     0x51 
#define SCAN_INSERT   0x52 
#define SCAN_DELETE   0x53 
#define SCAN_F11      0x85 
#define SCAN_F12      0x86 

/usr/include/linux/kd.h中 

struct kbentry { 
        unsigned char kb_table; 
        unsigned char kb_index; 
        unsigned short kb_value; 
}; 

#define KDGKBENT        0x4B46  /* gets one entry in translation table */ 
#define KDSKBENT        0x4B47  /* sets one entry in translation table */ 

而console为 
console = open("/dev/console",O_RDWR); 

读取按键
read(console,&c,sizeof(char)); 

--------------------------------------------------------------------------------

terminal programming
term.h/term.c是我写来专门处理一些小型的互动界面程式。 
  
  
  
  
Terminal指令集
设定颜色 : \033[colorm 
其中color可以是以下的值 
0 : Reset Color Attributes 
1 : bold on 
2 : bold off 
4 : underline on 
5 : blink on 
7 : reverse on 
21/22 : bold normal 
24 : underline off 
25 : blink off 
27 : reverse off 

30 : 前景,黑色 
31 : 前景,红色 
32 : 前景,绿色 
33 : 前景,黄色 
34 : 前景,篮色 
35 : 前景,紫色 
36 : 前景,青色 
37 : 前景,白色 
40 : 背景,黑色 
41 : 背景,红色 
42 : 背景,绿色 
43 : 背景,黄色 
44 : 背景,篮色 
45 : 背景,紫色 
46 : 背景,青色 
47 : 背景,白色 

清除萤幕 : \033c 

设定水平标位置 : \033[XG 
X为水平标位置。 

设定垂直标位置 : \033[Xd 
Y为垂直标位置。 

\033[YA 
Current_Cursor_Y -= Y 

\033[YB或\033[Ye 
Current_Cursor_Y += Y 

\033[XC或\033[Xa 
Current_Cursor_X += X 

\033[XD 
Current_Cursor_X -= X 

\033[YE 
gotoxy(0,Current_Cursor_Y+Y) 

\033[YF 
gotoxy(0,Current_Cursor_Y-Y) 

\033[Y;XH 
gotoxy(X,Y); 

\033[0K : 删除从标到该行结尾 
\033[1K : 删除从该行开始到标处 
\033[2K : 删除整行 

\033[0J : 删除标到萤幕结尾 
\033[1J : 删除从萤幕开始到标处 
\033[2J : 删除整个萤幕 

\033[N@ : insert N char 
\033[P : delete char 
\033[M : delete line 
\033[L : insert line 
\033[s : save cursor position 
\033[u : restore cursor position 

\033E : carry ; linefeed 
\033M : Current_Cursor_Y-1 
\033D : linefeed 

文章加入时间: 2004-11-17 14:56:33 责任编辑: w9   (2579 人次查阅)
 
Copyright © 1998-2004 中国PHP联盟 All rights reserved.