2.4G无线遥控器鼠标解决办法

本文档介绍了针对2.4G无线鼠标输入问题的解决方案,详细解析了在EventHub.h中添加鼠标设备类,InputReader.h中新增MouseInputMapper类,EventHub.cpp和InputDispatcher.cpp的更新,以及WindowManagerService.java中处理鼠标指针的代码。通过这些修改,实现了对2.4G无线鼠标的正确识别和支持。
摘要由CSDN通过智能技术生成

    

           接上次讨论的2.4G input校验有问题, frameworks里没有加入对鼠标事件的支持。

           1.在EventHub.h文件里:

             enum {
    /* The input device is a keyboard. */
    INPUT_DEVICE_CLASS_KEYBOARD      = 0x00000001,

    /* The input device is an alpha-numeric keyboard (not just a dial pad). */
    INPUT_DEVICE_CLASS_ALPHAKEY      = 0x00000002,

    /* The input device is a touchscreen (either single-touch or multi-touch). */
    INPUT_DEVICE_CLASS_TOUCHSCREEN   = 0x00000004,

    /* The input device is a trackball. */
    INPUT_DEVICE_CLASS_TRACKBALL     = 0x00000008,

    /* The input device is a multi-touch touchscreen. */
    INPUT_DEVICE_CLASS_TOUCHSCREEN_MT= 0x00000010,

    /* The input device is a directional pad (implies keyboard, has DPAD keys). */
    INPUT_DEVICE_CLASS_DPAD          = 0x00000020,

    /* The input device is a gamepad (implies keyboard, has BUTTON keys). */
    INPUT_DEVICE_CLASS_GAMEPAD       = 0x00000040,

    /* The input device has switches. */
    INPUT_DEVICE_CLASS_SWITCH        = 0x00000080,

    /* The input device is a mouse. */
    INPUT_DEVICE_CLASS_MOUSE         = 0x00000100, //加入这行
};

  2.在InputReader.h

增加MouseInputMapper类声明

  class MouseInputMapper : public InputMapper {
public:
    MouseInputMapper(InputDevice* device, int32_t associatedDisplayId);

    virtual uint32_t getSources();
    virtual void populateDeviceInfo(InputDeviceInfo* deviceInfo);
    virtual void dump(String8& dump);
    virtual void reset();
    virtual void process(const RawEvent* rawEvent);

    virtual int32_t getScanCodeState(uint32_t sourceMask, int32_t scanCode);

private:
    Mutex mLock;

    int32_t mAssociatedDisplayId;

    struct Accumulator {
        enum {
            FIELD_BTN_LEFT = 1,
            FIELD_REL_X = 2,
            FIELD_REL_Y = 4,
            FIELD_BTN_RIGHT = 8,
            FIELD_BTN_MIDDLE = 16,
            FIELD_BTN_SIDE = 32,
            FIELD_BTN_EXTRA = 64,
            FIELD_BTN_FORWARD = 128,
            FIELD_BTN_BACK = 256,
            FIELD_REL_WHEEL = 512,
        };

        uint32_t fields;

        bool btnLeft;
        bool btnRight;
        bool btnMiddle;
        bool btnSide;
        bool btnExtra;
        bool btnForward;
        bool btnBack;
        bool btnScrollUp;
        bool btnScrollDown;
        int32_t relX;
        int32_t relY;
        int32_t absX;
        int32_t absY;

        inline void clear() {
            fields = 0;
        }
    } mAccumulator;

    struct LockedState {
        bool down;
        nsecs_t downTime;
    } mLocked;

    struct Keyevent {
        bool down;
        int keycode;
    };

    void initializeLocked();

    void sync(nsecs_t when);
    void sendKey();
};

3.EventHub.cpp

   // See if this is a trackball (or mouse).
    if (test_bit(BTN_MOUSE, key_bitmask)) {
        uint8_t rel_bitmask[sizeof_bit_array(REL_MAX + 1)];
        memset(rel_bitmask, 0, sizeof(rel_bitmask));
        LOGV("Getting relative controllers...");
        if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(rel_bitmask)), rel_bitmask) >= 0) {
            if (test_bit(REL_X, rel_bitmask) && test_bit(REL_Y, rel_bitmask)) {
                device->classes |= (test_bit(BTN_LEFT, key_bitmask) && test_bit(BTN_RIGHT, key_bitmask)) ?
                        INPUT_DEVICE_CLASS_MOUSE : INPUT_DEVICE_CLASS_TRACKBALL;//增加这行
            }
        }
    }

  4.InputDispatcher.cpp

     bool isTouchEvent = ! ((entry->source & AINPUT_SOURCE_TOUCHSCREEN) ^ AINPUT_SOURCE_TOUCHSCREEN);
    bool isMouseEvent = ! ((entry->source & AINPUT_SOURCE_MOUSE) ^ AINPUT_SOURCE_MOUSE);
    bool isDownEvent = (entry-

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值