Read MSC_TIMESTAMP from evdev and pass along This CL passes along MSC_TIMESTAMP if the device reports it. We will use this in the touchpad gesture library for more accurate time deltas, particularly for lux/hammer. BUG=b:65041115 TEST=Deploy to device which supports MSC_TIMESTAMP: values are succesfully passed. Deploy to device without MSC_TIMESTAMP support: no problems. Change-Id: Ib7c6431d11f593eb10481de6cc6348f837aee05c Reviewed-on: https://chromium-review.googlesource.com/742488 Commit-Ready: Sean O'Brien <seobrien@chromium.org> Tested-by: Sean O'Brien <seobrien@chromium.org> Reviewed-by: Michael Spang <spang@chromium.org> Reviewed-by: Sean O'Brien <seobrien@chromium.org>
diff --git a/include/libevdev/libevdev.h b/include/libevdev/libevdev.h index 3240e7f..d68ea52 100644 --- a/include/libevdev/libevdev.h +++ b/include/libevdev/libevdev.h
@@ -45,6 +45,7 @@ unsigned long bitmask[NLONGS(EV_CNT)]; unsigned long key_bitmask[NLONGS(KEY_CNT)]; unsigned long rel_bitmask[NLONGS(REL_CNT)]; + unsigned long msc_bitmask[NLONGS(MSC_CNT)]; unsigned long abs_bitmask[NLONGS(ABS_CNT)]; unsigned long led_bitmask[NLONGS(LED_CNT)]; struct input_absinfo absinfo[ABS_CNT];
diff --git a/include/libevdev/libevdev_event.h b/include/libevdev/libevdev_event.h index a220519..4a6f369 100755 --- a/include/libevdev/libevdev_event.h +++ b/include/libevdev/libevdev_event.h
@@ -30,6 +30,8 @@ int rel_wheel; int rel_hwheel; + int msc_timestamp; + struct input_absinfo* mt_axes[_ABS_MT_CNT]; /* Log of recent input_event structs for debugging */ @@ -63,6 +65,7 @@ int Event_Get_Button_Middle(EvdevPtr); int Event_Get_Button_Right(EvdevPtr); int Event_Get_Button(EvdevPtr, int button); +int Event_Get_Timestamp(EvdevPtr); void Event_Sync_State(EvdevPtr); const char* Event_To_String(int type, int code); const char* Event_Type_To_String(int type);
diff --git a/src/libevdev.c b/src/libevdev.c index e920a02..1b4d52e 100644 --- a/src/libevdev.c +++ b/src/libevdev.c
@@ -160,6 +160,20 @@ Event_To_String(EV_KEY, i)); } + len = ioctl(fd, EVIOCGBIT(EV_MSC, sizeof(info->msc_bitmask)), + info->msc_bitmask); + if (len < 0) { + LOG_ERROR(device, "ioctl EVIOCGBIT(EV_MSC) failed: %s\n", + strerror(errno)); + return !Success; + } + for (i = 0; i < len*8; i++) { + if (TestBit(i, info->msc_bitmask)) { + LOG_DEBUG(device, "Has MSC[%d] = %s\n", i, + Event_To_String(EV_MSC, i)); + } + } + len = ioctl(fd, EVIOCGBIT(EV_LED, sizeof(info->led_bitmask)), info->led_bitmask); if (len < 0) {
diff --git a/src/libevdev_event.c b/src/libevdev_event.c index 4df9d4a..e1835b4 100755 --- a/src/libevdev_event.c +++ b/src/libevdev_event.c
@@ -51,6 +51,8 @@ static void Event_Rel(EvdevPtr, struct input_event*); +static void Event_Msc(EvdevPtr, struct input_event*); + static void Event_Get_Time(struct timeval*, bool); static int Event_Is_Valid(struct input_event*); @@ -205,6 +207,13 @@ return TestBit(button, device->key_state_bitmask); } +int +Event_Get_Timestamp(EvdevPtr device) +{ + EventStatePtr evstate = device->evstate; + return evstate->msc_timestamp; +} + #define CASE_RETURN(s) \ case (s):\ return #s @@ -273,6 +282,13 @@ break; } break; + case EV_MSC: + switch (code) { + CASE_RETURN(MSC_TIMESTAMP); + default: + break; + } + break; default: break; } @@ -327,6 +343,7 @@ } } } + evstate->msc_timestamp = 0; return Success; } @@ -492,6 +509,10 @@ Event_Rel(device, ev); break; + case EV_MSC: + Event_Msc(device, ev); + break; + default: break; } @@ -699,6 +720,18 @@ } } +static void +Event_Msc(EvdevPtr device, struct input_event* ev) +{ + EventStatePtr evstate = device->evstate; + + switch (ev->code) { + case MSC_TIMESTAMP: + evstate->msc_timestamp = ev->value; + break; + } +} + static int Event_Is_Valid(struct input_event* ev) { /* Key repeats are invalid. They're handled by X anyway */