Linux 版 (精华区)

发信人: xian (我想用心来点亮希望), 信区: Linux
标  题: Linux程式设计入门 - termios/keymap/terminal progr
发信站: 紫 丁 香 (Sun May  2 16:31:26 1999), 转信



网络工作室--知识库:编程技术:Unix编程:Linux程式设计入门:
Linux程式设计入门-termios/keymap/terminalprogramming
Linux程式设计入门-termios/keymap/terminalprogramming


termios


inttcgetattr(intfd,structtermios*termios_p);

inttcsetattr(intfd,intoptional_actions,conststructtermios

*termios_p);


keymap


我写了一个小程式来专门处理Linux上的keymap,keymap.h及keymap.c。


在LinuxTerminal上,如果您想要设定某些按键返回特定值,您会需要用到以

下这些技巧。


设定keymap


#include<linux/kd.h>

#include<linux/keyboard.h>


voidsetkeymap(void)

{

structkbentryKEYMAP;

KEYMAP.kb_table=STATE;

KEYMAP.kb_index=SCANCODE;

KEYMAP.kb_value=VALUE;

ioctl(console,KDSKBENT,&KEYMAP);

}


STATE为状态键组合

/usr/include/linux/keyboard.h中


#defineKG_SHIFT0

#defineKG_CTRL2

#defineKG_ALT3

#defineKG_ALTGR1

#defineKG_SHIFTL4

#defineKG_SHIFTR5

#defineKG_CTRLL6

#defineKG_CTRLR7

#defineKG_CAPSSHIFT8


使用方式如:

#defineKST_CTRL(1<<KG_CTRL)

#defineKST_ALT(1<<KG_ALT)

#defineKST_SHIFT(1<<KG_SHIFT)

#defineKST_CTRL_ALT(KST_CTRL|KST_ALT)

#defineKST_ALT_SHIFT(KST_ALT|KST_SHIFT)


SCANCODE为键盘扫描码


#defineSCAN_ESC0x01

#defineSCAN_10x02

#defineSCAN_20x03

#defineSCAN_30x04

#defineSCAN_40x05

#defineSCAN_50x06

#defineSCAN_60x07

#defineSCAN_70x08

#defineSCAN_80x09

#defineSCAN_90x0A

#defineSCAN_00x0B

#defineSCAN_MINUS0x0C

#defineSCAN_PLUS0x0D

#defineSCAN_BACK0x0E

#defineSCAN_TAB0x0F

#defineSCAN_Q0x10

#defineSCAN_W0x11

#defineSCAN_E0x12

#defineSCAN_R0x13

#defineSCAN_T0x14

#defineSCAN_Y0x15

#defineSCAN_U0x16

#defineSCAN_I0x17

#defineSCAN_O0x18

#defineSCAN_P0x19

#defineSCAN_LTQUOTE0x1A

#defineSCAN_RTQUOTE0x1B

#defineSCAN_ENTER0x1C

#defineSCAN_CTRL0x1D

#defineSCAN_A0x1E

#defineSCAN_S0x1F

#defineSCAN_D0x20

#defineSCAN_F0x21

#defineSCAN_G0x22

#defineSCAN_H0x23

#defineSCAN_J0x24

#defineSCAN_K0x25

#defineSCAN_L0x26

#defineSCAN_SPLIT0x27

#defineSCAN_QUOTE0x28

#defineSCAN_MARK0x29

#defineSCAN_LSHIFT0x2A

#defineSCAN_STAND0x2B

#defineSCAN_Z0x2C

#defineSCAN_X0x2D

#defineSCAN_C0x2E

#defineSCAN_V0x2F

#defineSCAN_B0x30

#defineSCAN_N0x31

#defineSCAN_M0x32

#defineSCAN_LSQUOTE0x33

#defineSCAN_RSQUOTE0x34

#defineSCAN_QUESTION0x35

#defineSCAN_RSHIFT0x36

#defineSCAN_PRTSCR0x37

#defineSCAN_ALT0x38

#defineSCAN_SPACE0x39

#defineSCAN_CAPSLOCK0x3A

#defineSCAN_F10x3B

#defineSCAN_F20x3C

#defineSCAN_F30x3D

#defineSCAN_F40x3E

#defineSCAN_F50x3F

#defineSCAN_F60x40

#defineSCAN_F70x41

#defineSCAN_F80x42

#defineSCAN_F90x43

#defineSCAN_F100x44

#defineSCAN_NUMLOCK0x45


#defineSCAN_HOME0x47

#defineSCAN_UP0x48

#defineSCAN_PGUP0x49

#defineSCAN_LEFT0x4B


#defineSCAN_RIGHT0x4D


#defineSCAN_END0x4F

#defineSCAN_DOWN0x50

#defineSCAN_PGDN0x51

#defineSCAN_INSERT0x52

#defineSCAN_DELETE0x53

#defineSCAN_F110x85

#defineSCAN_F120x86


/usr/include/linux/kd.h中


structkbentry{

unsignedcharkb_table;

unsignedcharkb_index;

unsignedshortkb_value;

};


#defineKDGKBENT0x4B46/*getsoneentryintranslation

table*/

#defineKDSKBENT0x4B47/*setsoneentryintranslation

table*/


而console为

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


读取按键


read(console,&c,sizeof(char));



terminalprogramming


term.h/term.c是我写来专门处理一些小型的互动界面程式。


Terminal指令集


设定颜色:\033[colorm

其中color可以是以下的值


0:ResetColorAttributes

1:boldon

2:boldoff

4:underlineon

5:blinkon

7:reverseon

21/22:boldnormal

24:underlineoff

25:blinkoff

27:reverseoff


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@:insertNchar

\033[P:deletechar

\033[M:deleteline

\033[L:insertline

\033[s:savecursorposition

\033[u:restorecursorposition


\033E:carry;linefeed

\033M:Current_Cursor_Y-1

\033D:linefeed



OKSTATION,Webmaster,BrianLin

admin@studio.openunix.org

--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.118.239.115]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.881毫秒