Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / events / ozone / evdev / touch_event_converter_evdev.cc
index bbdf660..a0de30d 100644 (file)
@@ -23,6 +23,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
+#include "ui/events/devices/device_util_linux.h"
 #include "ui/events/event.h"
 #include "ui/events/event_constants.h"
 #include "ui/events/event_switches.h"
@@ -72,16 +73,29 @@ float TuxelToPixelSize(float val, float num_tuxels, float num_pixels) {
 
 namespace ui {
 
+TouchEventConverterEvdev::InProgressEvents::InProgressEvents()
+    : x_(0),
+      y_(0),
+      id_(-1),
+      finger_(-1),
+      type_(ET_UNKNOWN),
+      radius_x_(0),
+      radius_y_(0),
+      pressure_(0) {
+}
+
 TouchEventConverterEvdev::TouchEventConverterEvdev(
     int fd,
     base::FilePath path,
+    int id,
     const EventDeviceInfo& info,
     const EventDispatchCallback& callback)
-    : EventConverterEvdev(fd, path),
+    : EventConverterEvdev(fd, path, id),
       callback_(callback),
       syn_dropped_(false),
       is_type_a_(false),
-      current_slot_(0) {
+      current_slot_(0),
+      is_internal_(IsTouchscreenInternal(path)) {
   Init(info);
 }
 
@@ -91,22 +105,19 @@ TouchEventConverterEvdev::~TouchEventConverterEvdev() {
 }
 
 void TouchEventConverterEvdev::Init(const EventDeviceInfo& info) {
-  gfx::Screen *screen = gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE);
+  gfx::Screenscreen = gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_NATIVE);
   if (!screen)
     return;  // No scaling.
   gfx::Display display = screen->GetPrimaryDisplay();
   gfx::Size size = display.GetSizeInPixel();
 
-  pressure_min_ = info.GetAbsMinimum(ABS_MT_PRESSURE),
-  pressure_max_ = info.GetAbsMaximum(ABS_MT_PRESSURE),
-  x_min_tuxels_ = info.GetAbsMinimum(ABS_MT_POSITION_X),
-  x_num_tuxels_ = info.GetAbsMaximum(ABS_MT_POSITION_X) - x_min_tuxels_ + 1,
-  y_min_tuxels_ = info.GetAbsMinimum(ABS_MT_POSITION_Y),
-  y_num_tuxels_ = info.GetAbsMaximum(ABS_MT_POSITION_Y) - y_min_tuxels_ + 1,
-  x_min_pixels_ = x_min_tuxels_,
-  x_num_pixels_ = x_num_tuxels_,
-  y_min_pixels_ = y_min_tuxels_,
-  y_num_pixels_ = y_num_tuxels_,
+  pressure_min_ = info.GetAbsMinimum(ABS_MT_PRESSURE);
+  pressure_max_ = info.GetAbsMaximum(ABS_MT_PRESSURE);
+  x_min_tuxels_ = info.GetAbsMinimum(ABS_MT_POSITION_X);
+  x_num_tuxels_ = info.GetAbsMaximum(ABS_MT_POSITION_X) - x_min_tuxels_ + 1;
+  y_min_tuxels_ = info.GetAbsMinimum(ABS_MT_POSITION_Y);
+  y_num_tuxels_ = info.GetAbsMaximum(ABS_MT_POSITION_Y) - y_min_tuxels_ + 1;
+  native_size_ = gfx::Size(x_num_tuxels_, y_num_tuxels_);
 
   // Map coordinates onto screen.
   x_min_pixels_ = 0;
@@ -131,6 +142,19 @@ void TouchEventConverterEvdev::Init(const EventDeviceInfo& info) {
                                 cal.bezel_right,
                                 cal.bezel_top,
                                 cal.bezel_bottom);
+
+  for (int i = 0;
+       i < std::min<int>(info.GetAbsMaximum(ABS_MT_SLOT) + 1, MAX_FINGERS);
+       ++i) {
+    events_[i].finger_ = info.GetSlotValue(ABS_MT_TRACKING_ID, i);
+    events_[i].type_ =
+        events_[i].finger_ < 0 ? ET_TOUCH_RELEASED : ET_TOUCH_PRESSED;
+    events_[i].x_ = info.GetSlotValue(ABS_MT_POSITION_X, i);
+    events_[i].y_ = info.GetSlotValue(ABS_MT_POSITION_Y, i);
+    events_[i].radius_x_ = info.GetSlotValue(ABS_MT_TOUCH_MAJOR, i);
+    events_[i].radius_y_ = info.GetSlotValue(ABS_MT_TOUCH_MINOR, i);
+    events_[i].pressure_ = info.GetSlotValue(ABS_MT_PRESSURE, i);
+  }
 }
 
 bool TouchEventConverterEvdev::Reinitialize() {
@@ -142,6 +166,18 @@ bool TouchEventConverterEvdev::Reinitialize() {
   return false;
 }
 
+bool TouchEventConverterEvdev::HasTouchscreen() const {
+  return true;
+}
+
+gfx::Size TouchEventConverterEvdev::GetTouchscreenSize() const {
+  return native_size_;
+}
+
+bool TouchEventConverterEvdev::IsInternal() const {
+  return is_internal_;
+}
+
 void TouchEventConverterEvdev::OnFileCanReadWithoutBlocking(int fd) {
   input_event inputs[MAX_FINGERS * 6 + 1];
   ssize_t read_size = read(fd, inputs, sizeof(inputs));
@@ -274,16 +310,18 @@ void TouchEventConverterEvdev::ReportEvents(base::TimeDelta delta) {
   for (int i = 0; i < MAX_FINGERS; i++) {
     if (altered_slots_[i]) {
       // TODO(rikroege): Support elliptical finger regions.
-      TouchEvent evt(events_[i].type_,
-                     gfx::PointF(events_[i].x_, events_[i].y_),
-                     /* flags */ 0,
-                     /* touch_id */ i,
-                     delta,
-                     /* radius_x */ events_[i].radius_x_,
-                     /* radius_y */ events_[i].radius_y_,
-                     /* angle */ 0.,
-                     events_[i].pressure_);
-      callback_.Run(&evt);
+      scoped_ptr<TouchEvent> event(
+          new TouchEvent(events_[i].type_,
+                         gfx::PointF(events_[i].x_, events_[i].y_),
+                         /* flags */ 0,
+                         /* touch_id */ i,
+                         delta,
+                         /* radius_x */ events_[i].radius_x_,
+                         /* radius_y */ events_[i].radius_y_,
+                         /* angle */ 0.,
+                         events_[i].pressure_));
+      event->set_source_device_id(id_);
+      callback_.Run(event.Pass());
 
       // Subsequent events for this finger will be touch-move until it
       // is released.