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/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 */