#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 {
// 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) {
}
// 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) {
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()) {
} 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 =
}
// 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,
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,
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,