Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / mojo / services / public / cpp / input_events / lib / input_events_type_converters.cc
index a5292d3..340e200 100644 (file)
@@ -4,8 +4,15 @@
 
 #include "mojo/services/public/cpp/input_events/input_events_type_converters.h"
 
+#if defined(USE_X11)
+#include <X11/extensions/XInput2.h>
+#include <X11/Xlib.h>
+#endif
+
 #include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
+#include "mojo/services/public/cpp/input_events/lib/mojo_extended_key_event_data.h"
 #include "mojo/services/public/interfaces/input_events/input_events.mojom.h"
+#include "ui/events/event_utils.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 
 namespace mojo {
@@ -52,9 +59,7 @@ COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_MOD3_DOWN) ==
 
 
 // static
-EventType TypeConverter<EventType, ui::EventType>::ConvertFrom(
-    ui::EventType type) {
-
+EventType TypeConverter<EventType, ui::EventType>::Convert(ui::EventType type) {
 #define MOJO_INPUT_EVENT_NAME(name) case ui::ET_##name: return EVENT_TYPE_##name
 
   switch (type) {
@@ -71,9 +76,7 @@ EventType TypeConverter<EventType, ui::EventType>::ConvertFrom(
 }
 
 // static
-ui::EventType TypeConverter<EventType, ui::EventType>::ConvertTo(
-  EventType type) {
-
+ui::EventType TypeConverter<ui::EventType, EventType>::Convert(EventType type) {
 #define MOJO_INPUT_EVENT_NAME(name) case EVENT_TYPE_##name: return ui::ET_##name
 
   switch (type) {
@@ -86,22 +89,25 @@ ui::EventType TypeConverter<EventType, ui::EventType>::ConvertTo(
   return ui::ET_UNKNOWN;
 }
 
-
 // static
-EventPtr TypeConverter<EventPtr, ui::Event>::ConvertFrom(
-    const ui::Event& input) {
+EventPtr TypeConverter<EventPtr, ui::Event>::Convert(const ui::Event& input) {
   EventPtr event(Event::New());
-  event->action = TypeConverter<EventType, ui::EventType>::ConvertFrom(
-      input.type());
+  event->action = ConvertTo<EventType>(input.type());
   event->flags = EventFlags(input.flags());
   event->time_stamp = input.time_stamp().ToInternalValue();
 
   if (input.IsMouseEvent() || input.IsTouchEvent()) {
     const ui::LocatedEvent* located_event =
         static_cast<const ui::LocatedEvent*>(&input);
-    event->location =
-        TypeConverter<PointPtr, gfx::Point>::ConvertFrom(
-            located_event->location());
+
+    LocationDataPtr location_data(LocationData::New());
+    location_data->in_view_location = Point::From(located_event->location());
+    if (input.HasNativeEvent()) {
+      location_data->screen_location =
+          Point::From(ui::EventSystemLocationFromNative(input.native_event()));
+    }
+
+    event->location_data = location_data.Pass();
   }
 
   if (input.IsTouchEvent()) {
@@ -113,8 +119,26 @@ EventPtr TypeConverter<EventPtr, ui::Event>::ConvertFrom(
   } else if (input.IsKeyEvent()) {
     const ui::KeyEvent* key_event = static_cast<const ui::KeyEvent*>(&input);
     KeyDataPtr key_data(KeyData::New());
-    key_data->key_code = key_event->key_code();
+    key_data->key_code = key_event->GetConflatedWindowsKeyCode();
+    key_data->native_key_code = key_event->platform_keycode();
     key_data->is_char = key_event->is_char();
+    key_data->character = key_event->GetCharacter();
+
+    if (key_event->extended_key_event_data()) {
+      const MojoExtendedKeyEventData* data =
+          static_cast<const MojoExtendedKeyEventData*>(
+              key_event->extended_key_event_data());
+      key_data->windows_key_code = static_cast<mojo::KeyboardCode>(
+          data->windows_key_code());
+      key_data->text = data->text();
+      key_data->unmodified_text = data->unmodified_text();
+    } else {
+      key_data->windows_key_code = static_cast<mojo::KeyboardCode>(
+          key_event->GetLocatedWindowsKeyboardCode());
+      key_data->text = key_event->GetText();
+      key_data->unmodified_text = key_event->GetUnmodifiedText();
+    }
+
     event->key_data = key_data.Pass();
   } else if (input.IsMouseWheelEvent()) {
     const ui::MouseWheelEvent* wheel_event =
@@ -128,43 +152,55 @@ EventPtr TypeConverter<EventPtr, ui::Event>::ConvertFrom(
 }
 
 // static
-EventPtr TypeConverter<EventPtr, ui::KeyEvent>::ConvertFrom(
+EventPtr TypeConverter<EventPtr, ui::KeyEvent>::Convert(
     const ui::KeyEvent& input) {
   return Event::From(static_cast<const ui::Event&>(input));
 }
 
 // static
-scoped_ptr<ui::Event>
-TypeConverter<EventPtr, scoped_ptr<ui::Event> >::ConvertTo(
+scoped_ptr<ui::Event> TypeConverter<scoped_ptr<ui::Event>, EventPtr>::Convert(
     const EventPtr& input) {
   scoped_ptr<ui::Event> ui_event;
-  ui::EventType ui_event_type =
-      TypeConverter<EventType, ui::EventType>::ConvertTo(input->action);
+  ui::EventType ui_event_type = ConvertTo<ui::EventType>(input->action);
+
+  gfx::Point location;
+  if (!input->location_data.is_null() &&
+      !input->location_data->in_view_location.is_null()) {
+    location = input->location_data->in_view_location.To<gfx::Point>();
+  }
+
   switch (input->action) {
     case ui::ET_KEY_PRESSED:
-    case ui::ET_KEY_RELEASED:
+    case ui::ET_KEY_RELEASED: {
+      scoped_ptr<ui::KeyEvent> key_event;
       if (input->key_data->is_char) {
-        ui_event.reset(new ui::KeyEvent(
-                           static_cast<base::char16>(input->key_data->key_code),
-                           static_cast<ui::KeyboardCode>(
-                               input->key_data->key_code),
-                           input->flags));
+        key_event.reset(new ui::KeyEvent(
+            static_cast<base::char16>(input->key_data->character),
+            static_cast<ui::KeyboardCode>(
+                input->key_data->key_code),
+            input->flags));
       } else {
-        ui_event.reset(new ui::KeyEvent(
-                           ui_event_type,
-                           static_cast<ui::KeyboardCode>(
-                               input->key_data->key_code),
-                           input->flags));
+        key_event.reset(new ui::KeyEvent(
+            ui_event_type,
+            static_cast<ui::KeyboardCode>(
+                input->key_data->key_code),
+            input->flags));
       }
+      key_event->SetExtendedKeyEventData(scoped_ptr<ui::ExtendedKeyEventData>(
+          new MojoExtendedKeyEventData(
+              static_cast<int32_t>(input->key_data->windows_key_code),
+              input->key_data->text,
+              input->key_data->unmodified_text)));
+      key_event->set_platform_keycode(input->key_data->native_key_code);
+      ui_event = key_event.PassAs<ui::KeyEvent>();
       break;
+    }
     case EVENT_TYPE_MOUSE_PRESSED:
     case EVENT_TYPE_MOUSE_DRAGGED:
     case EVENT_TYPE_MOUSE_RELEASED:
     case EVENT_TYPE_MOUSE_MOVED:
     case EVENT_TYPE_MOUSE_ENTERED:
     case EVENT_TYPE_MOUSE_EXITED: {
-      const gfx::PointF location(TypeConverter<PointPtr, gfx::Point>::ConvertTo(
-                                     input->location));
       // TODO: last flags isn't right. Need to send changed_flags.
       ui_event.reset(new ui::MouseEvent(
                          ui_event_type,
@@ -175,8 +211,6 @@ TypeConverter<EventPtr, scoped_ptr<ui::Event> >::ConvertTo(
       break;
     }
     case EVENT_TYPE_MOUSEWHEEL: {
-      const gfx::PointF location(TypeConverter<PointPtr, gfx::Point>::ConvertTo(
-                                     input->location));
       const gfx::Vector2d offset(input->wheel_data->x_offset,
                                  input->wheel_data->y_offset);
       ui_event.reset(new ui::MouseWheelEvent(offset,
@@ -190,7 +224,6 @@ TypeConverter<EventPtr, scoped_ptr<ui::Event> >::ConvertTo(
     case EVENT_TYPE_TOUCH_PRESSED:
     case EVENT_TYPE_TOUCH_CANCELLED:
     case EVENT_TYPE_TOUCH_RELEASED: {
-      gfx::Point location(input->location->x, input->location->y);
       ui_event.reset(new ui::TouchEvent(
                          ui_event_type,
                          location,