Support forward and back button reports

Those events can be sent from classic mice with two thumb buttons.

BUG=chromium:285663
TEST=use back and forward button on a mouse (test in combination with
the remaining cobra CLs)

CQ-DEPEND=CL:187668
Change-Id: I342a01926d76a7cf85a1ca6b5302b9a19b31d935
Reviewed-on: https://chromium-review.googlesource.com/187713
Reviewed-by: Dennis Kempin <denniskempin@chromium.org>
Tested-by: Dennis Kempin <denniskempin@chromium.org>
Commit-Queue: Dennis Kempin <denniskempin@chromium.org>
diff --git a/src/gesture.c b/src/gesture.c
index 8779b47..f86ab87 100755
--- a/src/gesture.c
+++ b/src/gesture.c
@@ -23,6 +23,18 @@
     return !!(array[bit / LONG_BITS] & (1L << (bit % LONG_BITS)));
 }
 
+// This array maps input_event button types to gestures buttons
+#define EVDEV_BUTTON_MAP_SIZE 7
+static const int kEvdevButtonMap[EVDEV_BUTTON_MAP_SIZE][2] = {
+    {BTN_LEFT, GESTURES_BUTTON_LEFT},
+    {BTN_MIDDLE, GESTURES_BUTTON_MIDDLE},
+    {BTN_RIGHT, GESTURES_BUTTON_RIGHT},
+    {BTN_BACK, GESTURES_BUTTON_BACK},
+    {BTN_SIDE, GESTURES_BUTTON_BACK},
+    {BTN_FORWARD, GESTURES_BUTTON_FORWARD},
+    {BTN_EXTRA, GESTURES_BUTTON_FORWARD}
+};
+
 /*
  * Gestures timer functions
  */
@@ -281,12 +293,12 @@
         current_finger++;
     }
     hwstate.timestamp = StimeFromTimeval(tv);
-    if (Event_Get_Button_Left(evdev))
-        hwstate.buttons_down |= GESTURES_BUTTON_LEFT;
-    if (Event_Get_Button_Middle(evdev))
-        hwstate.buttons_down |= GESTURES_BUTTON_MIDDLE;
-    if (Event_Get_Button_Right(evdev))
-        hwstate.buttons_down |= GESTURES_BUTTON_RIGHT;
+
+    for (i = 0; i < EVDEV_BUTTON_MAP_SIZE; ++i) {
+        if (Event_Get_Button(evdev, kEvdevButtonMap[i][0]))
+            hwstate.buttons_down |= kEvdevButtonMap[i][1];
+    }
+
     hwstate.touch_cnt = Event_Get_Touch_Count(evdev);
     hwstate.finger_cnt = current_finger;
     hwstate.fingers = rec->fingers;
@@ -402,12 +414,20 @@
                 xf86PostButtonEventM(dev, TRUE, CMT_BTN_MIDDLE, 1, mask);
             if (buttons->down & GESTURES_BUTTON_RIGHT)
                 xf86PostButtonEventM(dev, TRUE, CMT_BTN_RIGHT, 1, mask);
+            if (buttons->down & GESTURES_BUTTON_BACK)
+                xf86PostButtonEventM(dev, TRUE, CMT_BTN_BACK, 1, mask);
+            if (buttons->down & GESTURES_BUTTON_FORWARD)
+                xf86PostButtonEventM(dev, TRUE, CMT_BTN_FORWARD, 1, mask);
             if (buttons->up & GESTURES_BUTTON_LEFT)
                 xf86PostButtonEventM(dev, TRUE, CMT_BTN_LEFT, 0, mask);
             if (buttons->up & GESTURES_BUTTON_MIDDLE)
                 xf86PostButtonEventM(dev, TRUE, CMT_BTN_MIDDLE, 0, mask);
             if (buttons->up & GESTURES_BUTTON_RIGHT)
                 xf86PostButtonEventM(dev, TRUE, CMT_BTN_RIGHT, 0, mask);
+            if (buttons->up & GESTURES_BUTTON_BACK)
+                xf86PostButtonEventM(dev, TRUE, CMT_BTN_BACK, 0, mask);
+            if (buttons->up & GESTURES_BUTTON_FORWARD)
+                xf86PostButtonEventM(dev, TRUE, CMT_BTN_FORWARD, 0, mask);
             break;
         }
         case kGestureTypeFling: {