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

來源:互聯網
上載者:User

 原文: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的事件驅動源碼了...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.