Android6.0 按键流程(五)无线鼠标右键无效 -- hal层

最近在我们的手机上碰到这样一个问题,用otg连接无线鼠标,发现右键没反应。

 

于是先用getEvent命令:查看其扫描码,然后再去kl文件中,结果没找到这个扫描码对应的键盘码。

于是结合之前分析的按键流程,怀疑按键流程最后没走KeyboardInputMapper,就在InputReader中打印log。

最后在InputDevice::process函数中遍历InputMapper调用器process

void InputDevice::process(const RawEvent* rawEvents, size_t count) {
    size_t numMappers = mMappers.size();
    for (const RawEvent* rawEvent = rawEvents; count--; rawEvent++) {

        if (mDropUntilNextSync) {
            if (rawEvent->type == EV_SYN && rawEvent->code == SYN_REPORT) {
                mDropUntilNextSync = false;
            } else {
            }
        } else if (rawEvent->type == EV_SYN && rawEvent->code == SYN_DROPPED) {
            mDropUntilNextSync = true;
            reset(rawEvent->when);
        } else {
            for (size_t i = 0; i < numMappers; i++) {
                InputMapper* mapper = mMappers[i];
                mapper->process(rawEvent);
            }
        }
    }
}

最后发现只调用了CursorInputMapper::process函数。

 

一、CursorInputMapper的process函数

下面我们开始分析CusorInputMapper的process函数。

void CursorInputMapper::process(const RawEvent* rawEvent) {
    mCursorButtonAccumulator.process(rawEvent);//按键
    mCursorMotionAccumulator.process(rawEvent);//移动
    mCursorScrollAccumulator.process(rawEvent);//滚动

    if (rawEvent->type == EV_SYN && rawEvent->code == SYN_REPORT) {
        sync(rawEvent->when);
    }
}

先来看CursorButtonAccumulator::process函数,根据按键事件传来的值,赋值各个成员变量

void CursorButtonAccumulator::process(const RawEvent* rawEvent) {
    if (rawEvent->type == EV_KEY) {
        switch (rawEvent->code) {
        case BTN_LEFT:
            mBtnLeft = rawEvent->value;//鼠标左键
            break;
        case BTN_RIGHT:
            mBtnRight = rawEvent->value;//鼠标右键
            break;
        case BTN_MIDDLE:
            mBtnMiddle = rawEvent->value;
            break;
        case BTN_BACK:
            mBtnBack = rawEvent->value;
            break;
        case BTN_SIDE:
            mBtnSide = rawEvent->value;
            break;
        case BTN_FORWARD:
            mBtnForward = rawEvent->value;
            break;
        case BTN_EXTRA:
            mBtnExtra = rawEvent->value;
            break;
        case BTN_TASK:
            mBtnTask = rawEvent->value;
            break;
        }
    }
}

剩下的鼠标移动和滚动事件我们就不分析了。

下面我们再分析下CursorInputMapper::sync函数,我们分析部分代码:

void CursorInputMapper::sync(nsecs_t when) {
    int32_t lastButtonState = mButtonState;
    int32_t currentButtonState = mCursorButtonAccumulator.getButtonState();
    mButtonState = currentButtonState;

    bool wasDown = isPointerDown(lastButtonState);
    bool down = isPointerDown(currentButtonState);

我们先看看CursorButtonAccumulator.getButtonState函数:

uint32_t CursorButtonAccumulator::getButtonState() const {
    uint32_t result = 0;
    if (mBtnLeft) {
        result |= AMOTION_EVENT_BUTTON_PRIMARY;
    }
    if (mBtnRight) {
        //result |= AMOTION_EVENT_BUTTON_SECONDARY;
        result |= AMOTION_EVENT_BUTTON_BACK;//修改成返回键
    }
    if (mBtnMiddle) {
        result |= AMOTION_EVENT_BUTTON_TERTIARY;
    }
    if (mBtnBack || mBtnSide) {
        result |= AMOTION_EVENT_BUTTON_
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值