亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 786 | 回復(fù): 0
打印 上一主題 下一主題

Android原生(Native)C開發(fā)之三:鼠標(biāo)事件篇(捕鼠記) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-21 08:41 |只看該作者 |倒序?yàn)g覽

在做SDL至Android的移植時(shí),鍵盤事件是能正常捕獲到,看了SLD的源碼,發(fā)現(xiàn)用的device是 /dev/tty0,但是鼠標(biāo)叫是不能成功捕獲,總是得到 0,運(yùn)行命令查看devices時(shí),顯示如下:

 # 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

 

進(jìn)入 /dev/input 目錄,發(fā)現(xiàn)在3個(gè)device文件:mice,mouse0,event0,分別 cat這3個(gè)文件,發(fā)現(xiàn)只有 event0 有反應(yīng),如下圖:

Android原生(Native)C開發(fā)之三:鼠標(biāo)事件篇(捕鼠記)

 

而且不管是點(diǎn)擊鼠標(biāo)還是按鍵,都有反應(yīng),但顯示的是一堆亂碼,而且點(diǎn)擊鼠標(biāo)出來的東西要多一點(diǎn),難道這就是傳說是的 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開發(fā)之一:環(huán)境搭建篇),push至 emulator后執(zhí)行后,切換到android 模擬器,在模擬器上點(diǎn)幾下mouse,程序就會(huì)打出你點(diǎn)擊的信息,效果如下,果然能正確得到點(diǎn)擊的 mouse pos,如下圖:

Android原生(Native)C開發(fā)之三:鼠標(biāo)事件篇(捕鼠記)

 

分析上面的返回值,發(fā)現(xiàn)當(dāng)按下 mouse left button 時(shí),會(huì)得到4個(gè)事件,2個(gè) type = 3 的事件返回了 pos x, pos y 的值,即mouse click pos, 另外1個(gè) type = 1 的事件是按鍵事件(keydown),value就是按下的鍵的key,為0的應(yīng)該就是 key的release事件,當(dāng)松開 mouse時(shí),也會(huì)得到兩個(gè) type = 1, 0 的事件,沒有仔細(xì)去看它們的返回值,反正已經(jīng)正確得到了 mosue的事件,下一步就是改SDL的事件驅(qū)動(dòng)源碼了...

 

參考鏈接: USB Mouse and Touch Screen ( TS ) Input(EN)[http://www.webkinesia.com/games/embedded.php]

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP