接上次讨论的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-