Android原生(Native)C開發之三 鼠標事件篇(捕鼠記)

Android原生(Native)C開發之三 鼠標事件篇(捕鼠記)php

在作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

Android Native 鼠標事件截圖1

Android Native 鼠標事件截圖1android

並且無論是點擊鼠標仍是按鍵,都有反應,但顯示的是一堆亂碼,並且點擊鼠標出來的東西要多一點,難道這就是傳說是的 touchscreen ?!web

爲了分析 event0 的返回值,寫了一段代碼 testmice.c,以下:spa

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <linux/input.h>

 

static int event0_fd = -1;
struct input_event ev0[64];3d

//for handling event0, mouse/key/ts
static int handle_event0() {
int button = 0, realx = 0, realy = 0, i, rd;code

rd = read(event0_fd, ev0, sizeof(struct input_event) * 64);
if ( rd < sizeof(struct input_event) ) return 0;htm

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);
}blog

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,以下圖:

Android Native 鼠標事件截圖2

Android Native 鼠標事件截圖2

分析上面的返回值,發現當按下 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]

相關文章
相關標籤/搜索