146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/services/public/cpp/input_events/input_events_type_converters.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#if defined(USE_X11)
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <X11/extensions/XInput2.h>
903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include <X11/Xlib.h>
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#endif
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "mojo/services/public/cpp/geometry/geometry_type_converters.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "mojo/services/public/cpp/input_events/lib/mojo_extended_key_event_data.h"
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/interfaces/input_events/input_events.mojom.h"
1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/events/event_utils.h"
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace mojo {
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_NONE) ==
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_NONE),
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_CAPS_LOCK_DOWN) ==
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_CAPS_LOCK_DOWN),
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_SHIFT_DOWN) ==
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_SHIFT_DOWN),
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_CONTROL_DOWN) ==
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_CONTROL_DOWN),
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_ALT_DOWN) ==
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_ALT_DOWN),
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_LEFT_MOUSE_BUTTON) ==
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_LEFT_MOUSE_BUTTON),
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_MIDDLE_MOUSE_BUTTON) ==
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_MIDDLE_MOUSE_BUTTON),
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_RIGHT_MOUSE_BUTTON) ==
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_RIGHT_MOUSE_BUTTON),
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_COMMAND_DOWN) ==
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_COMMAND_DOWN),
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_EXTENDED) ==
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_EXTENDED),
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_IS_SYNTHESIZED) ==
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_IS_SYNTHESIZED),
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_ALTGR_DOWN) ==
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_ALTGR_DOWN),
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)COMPILE_ASSERT(static_cast<int32>(EVENT_FLAGS_MOD3_DOWN) ==
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               static_cast<int32>(ui::EF_MOD3_DOWN),
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)               event_flags_should_match);
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciEventType TypeConverter<EventType, ui::EventType>::Convert(ui::EventType type) {
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MOJO_INPUT_EVENT_NAME(name) case ui::ET_##name: return EVENT_TYPE_##name
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (type) {
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/input_events/lib/input_event_names.h"
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case ui::ET_LAST:
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      NOTREACHED();
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      break;
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#undef MOJO_INPUT_EVENT_NAME
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return EVENT_TYPE_UNKNOWN;
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// static
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciui::EventType TypeConverter<ui::EventType, EventType>::Convert(EventType type) {
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define MOJO_INPUT_EVENT_NAME(name) case EVENT_TYPE_##name: return ui::ET_##name
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  switch (type) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "mojo/services/public/cpp/input_events/lib/input_event_names.h"
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#undef MOJO_INPUT_EVENT_NAME
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return ui::ET_UNKNOWN;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciEventPtr TypeConverter<EventPtr, ui::Event>::Convert(const ui::Event& input) {
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EventPtr event(Event::New());
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  event->action = ConvertTo<EventType>(input.type());
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event->flags = EventFlags(input.flags());
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  event->time_stamp = input.time_stamp().ToInternalValue();
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (input.IsMouseEvent() || input.IsTouchEvent()) {
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const ui::LocatedEvent* located_event =
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        static_cast<const ui::LocatedEvent*>(&input);
10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
10303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    LocationDataPtr location_data(LocationData::New());
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    location_data->in_view_location = Point::From(located_event->location());
10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (input.HasNativeEvent()) {
10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      location_data->screen_location =
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          Point::From(ui::EventSystemLocationFromNative(input.native_event()));
10803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
10903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
11003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    event->location_data = location_data.Pass();
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (input.IsTouchEvent()) {
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const ui::TouchEvent* touch_event =
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        static_cast<const ui::TouchEvent*>(&input);
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    TouchDataPtr touch_data(TouchData::New());
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    touch_data->pointer_id = touch_event->touch_id();
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    event->touch_data = touch_data.Pass();
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else if (input.IsKeyEvent()) {
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const ui::KeyEvent* key_event = static_cast<const ui::KeyEvent*>(&input);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    KeyDataPtr key_data(KeyData::New());
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    key_data->key_code = key_event->GetConflatedWindowsKeyCode();
12303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    key_data->native_key_code = key_event->platform_keycode();
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    key_data->is_char = key_event->is_char();
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    key_data->character = key_event->GetCharacter();
12603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    if (key_event->extended_key_event_data()) {
12803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      const MojoExtendedKeyEventData* data =
12903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          static_cast<const MojoExtendedKeyEventData*>(
13003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              key_event->extended_key_event_data());
13103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      key_data->windows_key_code = static_cast<mojo::KeyboardCode>(
13203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          data->windows_key_code());
13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      key_data->text = data->text();
13403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      key_data->unmodified_text = data->unmodified_text();
13503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    } else {
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      key_data->windows_key_code = static_cast<mojo::KeyboardCode>(
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          key_event->GetLocatedWindowsKeyboardCode());
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      key_data->text = key_event->GetText();
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      key_data->unmodified_text = key_event->GetUnmodifiedText();
14003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
14103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    event->key_data = key_data.Pass();
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (input.IsMouseWheelEvent()) {
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ui::MouseWheelEvent* wheel_event =
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        static_cast<const ui::MouseWheelEvent*>(&input);
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MouseWheelDataPtr wheel_data(MouseWheelData::New());
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    wheel_data->x_offset = wheel_event->x_offset();
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    wheel_data->y_offset = wheel_event->y_offset();
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    event->wheel_data = wheel_data.Pass();
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return event.Pass();
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// static
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciEventPtr TypeConverter<EventPtr, ui::KeyEvent>::Convert(
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const ui::KeyEvent& input) {
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return Event::From(static_cast<const ui::Event&>(input));
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<ui::Event> TypeConverter<scoped_ptr<ui::Event>, EventPtr>::Convert(
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const EventPtr& input) {
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  scoped_ptr<ui::Event> ui_event;
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ui::EventType ui_event_type = ConvertTo<ui::EventType>(input->action);
16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
16603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  gfx::Point location;
16703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (!input->location_data.is_null() &&
16803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      !input->location_data->in_view_location.is_null()) {
1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    location = input->location_data->in_view_location.To<gfx::Point>();
17003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
17103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (input->action) {
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case ui::ET_KEY_PRESSED:
17403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    case ui::ET_KEY_RELEASED: {
17503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      scoped_ptr<ui::KeyEvent> key_event;
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      if (input->key_data->is_char) {
17703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        key_event.reset(new ui::KeyEvent(
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            static_cast<base::char16>(input->key_data->character),
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            static_cast<ui::KeyboardCode>(
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                input->key_data->key_code),
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input->flags));
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      } else {
18303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        key_event.reset(new ui::KeyEvent(
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            ui_event_type,
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            static_cast<ui::KeyboardCode>(
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                input->key_data->key_code),
1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            input->flags));
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
18903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      key_event->SetExtendedKeyEventData(scoped_ptr<ui::ExtendedKeyEventData>(
19003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)          new MojoExtendedKeyEventData(
19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              static_cast<int32_t>(input->key_data->windows_key_code),
19203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              input->key_data->text,
19303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)              input->key_data->unmodified_text)));
19403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      key_event->set_platform_keycode(input->key_data->native_key_code);
19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      ui_event = key_event.PassAs<ui::KeyEvent>();
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      break;
19703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    }
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSE_PRESSED:
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSE_DRAGGED:
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSE_RELEASED:
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSE_MOVED:
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSE_ENTERED:
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSE_EXITED: {
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      // TODO: last flags isn't right. Need to send changed_flags.
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_event.reset(new ui::MouseEvent(
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         ui_event_type,
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         location,
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         location,
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         ui::EventFlags(input->flags),
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         ui::EventFlags(input->flags)));
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_MOUSEWHEEL: {
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      const gfx::Vector2d offset(input->wheel_data->x_offset,
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 input->wheel_data->y_offset);
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_event.reset(new ui::MouseWheelEvent(offset,
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             location,
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             location,
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             ui::EventFlags(input->flags),
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             ui::EventFlags(input->flags)));
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_TOUCH_MOVED:
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_TOUCH_PRESSED:
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_TOUCH_CANCELLED:
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case EVENT_TYPE_TOUCH_RELEASED: {
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      ui_event.reset(new ui::TouchEvent(
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         ui_event_type,
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         location,
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                         ui::EventFlags(input->flags),
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         input->touch_data->pointer_id,
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         base::TimeDelta::FromInternalValue(input->time_stamp),
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         0.f, 0.f, 0.f, 0.f));
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      break;
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    default:
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // TODO: support other types.
238f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // NOTIMPLEMENTED();
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      ;
240f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
241f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO: need to support time_stamp.
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return ui_event.Pass();
243f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
244f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
24546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace mojo
246