在作SDL至Android的移植時,鍵盤事件是能正常捕獲到,看了SLD的源碼,發現用的device是 /dev/tty0,可是鼠標叫是不能成功捕獲,老是獲得 0,運行命令查看devices時,顯示以下:html
# 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 有反應,以下圖:linux
並且無論是點擊鼠標仍是按鍵,都有反應,但顯示的是一堆亂碼,並且點擊鼠標出來的東西要多一點,難道這就是傳說是的 touchscreen ?!web
爲了分析 event0 的返回值,寫了一段代碼 testmice.c,以下:spa
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <linux/input.h>
static int event0_fd = -1; //for handling event0, mouse/key/ts rd = read(event0_fd, ev0, sizeof(struct input_event) * 64); for (i = 0; i < rd / sizeof(struct input_event); i++) { return 1; int main(void) { event0_fd = open(」/dev/input/event0″, O_RDWR); if ( event0_fd < 0 ) while ( done ) { if ( event0_fd > 0 ) { 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的事件驅動源碼了…
參考連接: USB Mouse and Touch Screen ( TS ) Input(EN)[http://www.webkinesia.com/games/embedded.php]