原文:http://blog.sina.com.cn/s/blog_4a0a39c30100azzq.html
在做SDL至Android的移植時,鍵盤事件是能正常捕獲到,看了SLD的源碼,發現用的device是
/dev/tty0,但是滑鼠叫是不能成功捕獲,總是得到 0,運行命令查看devices時,顯示如下:
# cat /proc/bus/input/devices cat /proc/bus/input/devices I: Bus=0000 Vendor=0000 Product=0000 Version=0000 N: Name="qwerty" P: Phys= S: Sysfs=/class/input/input0 U: Uniq= H: Handlers=kbd mouse0 event0 B: EV=2f B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff f fffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe B: REL=3 B: ABS=7 B: SW=1 |
進入 /dev/input 目錄,發現在3個device檔案:mice,mouse0,event0,分別
cat這3個檔案,發現只有 event0 有反應,如:
而且不管是點擊滑鼠還是按鍵,都有反應,但顯示的是一堆亂碼,而且點擊滑鼠出來的東西要多一點,難道這就是傳說是的
touchscreen ?!
為了分析 event0 的傳回值,寫了一段代碼 testmice.c,如下:
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <linux/input.h> static int event0_fd = -1; struct input_event ev0[64]; //for handling event0, mouse/key/ts static int handle_event0() { int button = 0, realx = 0, realy = 0, i, rd; rd = read(event0_fd, ev0, sizeof(struct input_event) * 64); if ( rd < sizeof(struct input_event) ) return 0; for (i = 0; i < rd / sizeof(struct input_event); i++) { printf("", ev0[i].type, ev0[i].code, ev0[i].value); if (ev0[i].type == 3 && ev0[i].code == 0) realx = ev0[i].value; else if (ev0[i].type == 3 && ev0[i].code == 1) realy = ev0[i].value; else if (ev0[i].type == 1) { if (ev0[i].code == 158) { //if key esc then exit return 0; } } else if (ev0[i].type == 0 && ev0[i].code == 0 && ev0[i].value == 0) { realx = 0, realy = 0; } printf("event(%d): type: %d; code: %3d; value: %3d; realx: %3d; realy: %3d/n", i, ev0[i].type, ev0[i].code, ev0[i].value, realx, realy); } return 1; } int main(void) { int done = 1; printf("sizeof(struct input_event) = %d/n", sizeof(struct input_event)); event0_fd = open("/dev/input/event0", O_RDWR); if ( event0_fd < 0 ) return -1; while ( done ) { printf("begin handel_event0.../n"); done = handle_event0(); printf("end handel_event0.../n"); } if ( event0_fd > 0 ) { close(event0_fd); event0_fd = -1; } return 0; } |
用交叉編譯器編譯好後(編譯過程就不再詳述,請參見 blog:Android原生(Native)C開發之一:環境搭建篇),push至
emulator後執行後,切換到android
模擬器,在模擬器上點幾下mouse,程式就會打出你點擊的資訊,效果如下,果然能正確得到點擊的 mouse pos,如:
分析上面的傳回值,發現當按下 mouse left button 時,會得到4個事件,2個 type = 3 的事件返回了
pos x, pos y 的值,即mouse click pos, 另外1個 type = 1
的事件是按鍵事件(keydown),value就是按下的鍵的key,為0的應該就是 key的release事件,當鬆開
mouse時,也會得到兩個 type = 1, 0 的事件,沒有仔細去看它們的傳回值,反正已經正確得到了
mosue的事件,下一步就是改SDL的事件驅動源碼了...