| Index: webkit/plugins/ppapi/event_conversion.cc
|
| ===================================================================
|
| --- webkit/plugins/ppapi/event_conversion.cc (revision 91372)
|
| +++ webkit/plugins/ppapi/event_conversion.cc (working copy)
|
| @@ -4,6 +4,7 @@
|
|
|
| #include "webkit/plugins/ppapi/event_conversion.h"
|
|
|
| +#include "base/basictypes.h"
|
| #include "base/i18n/char_iterator.h"
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| @@ -11,9 +12,11 @@
|
| #include "base/utf_string_conversions.h"
|
| #include "base/utf_string_conversion_utils.h"
|
| #include "ppapi/c/pp_input_event.h"
|
| +#include "ppapi/shared_impl/input_event_impl.h"
|
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
|
| #include "webkit/plugins/ppapi/common.h"
|
|
|
| +using ppapi::InputEventData;
|
| using WebKit::WebInputEvent;
|
| using WebKit::WebKeyboardEvent;
|
| using WebKit::WebMouseEvent;
|
| @@ -57,32 +60,30 @@
|
| // Generates a PP_InputEvent with the fields common to all events, as well as
|
| // the event type from the given web event. Event-specific fields will be zero
|
| // initialized.
|
| -PP_InputEvent GetPPEventWithCommonFieldsAndType(
|
| - const WebInputEvent& web_event) {
|
| - PP_InputEvent result;
|
| - memset(&result, 0, sizeof(PP_InputEvent));
|
| - result.type = ConvertEventTypes(web_event.type);
|
| +InputEventData GetEventWithCommonFieldsAndType(const WebInputEvent& web_event) {
|
| + InputEventData result;
|
| + result.event_type = ConvertEventTypes(web_event.type);
|
| // TODO(brettw) http://code.google.com/p/chromium/issues/detail?id=57448
|
| // This should use a tick count rather than the wall clock time that WebKit
|
| // uses.
|
| - result.time_stamp = web_event.timeStampSeconds;
|
| + result.event_time_stamp = web_event.timeStampSeconds;
|
| return result;
|
| }
|
|
|
| void AppendKeyEvent(const WebInputEvent& event,
|
| - std::vector<PP_InputEvent>* pp_events) {
|
| + std::vector<InputEventData>* result_events) {
|
| const WebKeyboardEvent& key_event =
|
| - reinterpret_cast<const WebKeyboardEvent&>(event);
|
| - PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
|
| - result.u.key.modifier = key_event.modifiers;
|
| - result.u.key.key_code = key_event.windowsKeyCode;
|
| - pp_events->push_back(result);
|
| + static_cast<const WebKeyboardEvent&>(event);
|
| + InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| + result.event_modifiers = key_event.modifiers;
|
| + result.key_code = key_event.windowsKeyCode;
|
| + result_events->push_back(result);
|
| }
|
|
|
| void AppendCharEvent(const WebInputEvent& event,
|
| - std::vector<PP_InputEvent>* pp_events) {
|
| + std::vector<InputEventData>* result_events) {
|
| const WebKeyboardEvent& key_event =
|
| - reinterpret_cast<const WebKeyboardEvent&>(event);
|
| + static_cast<const WebKeyboardEvent&>(event);
|
|
|
| // This is a bit complex, the input event will normally just have one 16-bit
|
| // character in it, but may be zero or more than one. The text array is
|
| @@ -98,21 +99,17 @@
|
| // Make a separate PP_InputEvent for each Unicode character in the input.
|
| base::i18n::UTF16CharIterator iter(key_event.text, utf16_char_count);
|
| while (!iter.end()) {
|
| - PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
|
| - result.u.character.modifier = key_event.modifiers;
|
| + InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| + result.event_modifiers = key_event.modifiers;
|
| + base::WriteUnicodeCharacter(iter.get(), &result.character_text);
|
|
|
| - std::string utf8_char;
|
| - base::WriteUnicodeCharacter(iter.get(), &utf8_char);
|
| - base::strlcpy(result.u.character.text, utf8_char.c_str(),
|
| - sizeof(result.u.character.text));
|
| -
|
| - pp_events->push_back(result);
|
| + result_events->push_back(result);
|
| iter.Advance();
|
| }
|
| }
|
|
|
| void AppendMouseEvent(const WebInputEvent& event,
|
| - std::vector<PP_InputEvent>* pp_events) {
|
| + std::vector<InputEventData>* result_events) {
|
| COMPILE_ASSERT(static_cast<int>(WebMouseEvent::ButtonNone) ==
|
| static_cast<int>(PP_INPUTEVENT_MOUSEBUTTON_NONE),
|
| MouseNone);
|
| @@ -127,30 +124,32 @@
|
| MouseMiddle);
|
|
|
| const WebMouseEvent& mouse_event =
|
| - reinterpret_cast<const WebMouseEvent&>(event);
|
| - PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
|
| - result.u.mouse.modifier = mouse_event.modifiers;
|
| - result.u.mouse.button =
|
| - static_cast<PP_InputEvent_MouseButton>(mouse_event.button);
|
| - result.u.mouse.x = static_cast<float>(mouse_event.x);
|
| - result.u.mouse.y = static_cast<float>(mouse_event.y);
|
| - result.u.mouse.click_count = mouse_event.clickCount;
|
| - pp_events->push_back(result);
|
| + static_cast<const WebMouseEvent&>(event);
|
| + InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| + result.event_modifiers = mouse_event.modifiers;
|
| + if (mouse_event.type == WebInputEvent::MouseDown ||
|
| + mouse_event.type == WebInputEvent::MouseUp) {
|
| + result.mouse_button =
|
| + static_cast<PP_InputEvent_MouseButton>(mouse_event.button);
|
| + }
|
| + result.mouse_position.x = mouse_event.x;
|
| + result.mouse_position.y = mouse_event.y;
|
| + result.mouse_click_count = mouse_event.clickCount;
|
| + result_events->push_back(result);
|
| }
|
|
|
| void AppendMouseWheelEvent(const WebInputEvent& event,
|
| - std::vector<PP_InputEvent>* pp_events) {
|
| + std::vector<InputEventData>* result_events) {
|
| const WebMouseWheelEvent& mouse_wheel_event =
|
| - reinterpret_cast<const WebMouseWheelEvent&>(event);
|
| - PP_InputEvent result = GetPPEventWithCommonFieldsAndType(event);
|
| - result.u.wheel.modifier = mouse_wheel_event.modifiers;
|
| - result.u.wheel.delta_x = mouse_wheel_event.deltaX;
|
| - result.u.wheel.delta_y = mouse_wheel_event.deltaY;
|
| - result.u.wheel.wheel_ticks_x = mouse_wheel_event.wheelTicksX;
|
| - result.u.wheel.wheel_ticks_y = mouse_wheel_event.wheelTicksY;
|
| - result.u.wheel.scroll_by_page =
|
| - BoolToPPBool(!!mouse_wheel_event.scrollByPage);
|
| - pp_events->push_back(result);
|
| + static_cast<const WebMouseWheelEvent&>(event);
|
| + InputEventData result = GetEventWithCommonFieldsAndType(event);
|
| + result.event_modifiers = mouse_wheel_event.modifiers;
|
| + result.wheel_delta.x = mouse_wheel_event.deltaX;
|
| + result.wheel_delta.y = mouse_wheel_event.deltaY;
|
| + result.wheel_ticks.x = mouse_wheel_event.wheelTicksX;
|
| + result.wheel_ticks.y = mouse_wheel_event.wheelTicksY;
|
| + result.wheel_scroll_by_page = mouse_wheel_event.scrollByPage;
|
| + result_events->push_back(result);
|
| }
|
|
|
| WebKeyboardEvent* BuildKeyEvent(const PP_InputEvent& event) {
|
| @@ -244,12 +243,64 @@
|
| return mouse_wheel_event;
|
| }
|
|
|
| +void InputEventDataToPPInputEvent(const InputEventData& data,
|
| + PP_InputEvent* result) {
|
| + memset(result, 0, sizeof(PP_InputEvent));
|
| + result->type = data.event_type;
|
| + result->time_stamp = data.event_time_stamp;
|
| +
|
| + switch (data.event_type) {
|
| + case PP_INPUTEVENT_TYPE_MOUSEDOWN:
|
| + case PP_INPUTEVENT_TYPE_MOUSEUP:
|
| + case PP_INPUTEVENT_TYPE_MOUSEMOVE:
|
| + case PP_INPUTEVENT_TYPE_MOUSEENTER:
|
| + case PP_INPUTEVENT_TYPE_MOUSELEAVE:
|
| + case PP_INPUTEVENT_TYPE_CONTEXTMENU:
|
| + result->u.mouse.modifier = data.event_modifiers;
|
| + result->u.mouse.button = data.mouse_button;
|
| + result->u.mouse.x = static_cast<float>(data.mouse_position.x);
|
| + result->u.mouse.y = static_cast<float>(data.mouse_position.y);
|
| + result->u.mouse.click_count = data.mouse_click_count;
|
| + break;
|
| + case PP_INPUTEVENT_TYPE_MOUSEWHEEL:
|
| + result->u.wheel.modifier = data.event_modifiers;
|
| + result->u.wheel.delta_x = data.wheel_delta.x;
|
| + result->u.wheel.delta_y = data.wheel_delta.y;
|
| + result->u.wheel.wheel_ticks_x = data.wheel_ticks.x;
|
| + result->u.wheel.wheel_ticks_y = data.wheel_ticks.y;
|
| + break;
|
| + case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
|
| + case PP_INPUTEVENT_TYPE_KEYDOWN:
|
| + case PP_INPUTEVENT_TYPE_KEYUP:
|
| + result->u.key.modifier = data.event_modifiers;
|
| + result->u.key.key_code = data.key_code;
|
| + break;
|
| + case PP_INPUTEVENT_TYPE_CHAR:
|
| + result->u.character.modifier = data.event_modifiers;
|
| + base::strlcpy(result->u.character.text, data.character_text.c_str(),
|
| + arraysize(result->u.character.text));
|
| + break;
|
| + case PP_INPUTEVENT_TYPE_UNDEFINED:
|
| + break;
|
| + }
|
| +}
|
| +
|
| } // namespace
|
|
|
| void CreatePPEvent(const WebInputEvent& event,
|
| std::vector<PP_InputEvent>* pp_events) {
|
| - pp_events->clear();
|
| + std::vector<InputEventData> data;
|
| + CreateInputEventData(event, &data);
|
|
|
| + pp_events->resize(data.size());
|
| + for (size_t i = 0; i < data.size(); i++)
|
| + InputEventDataToPPInputEvent(data[i], &(*pp_events)[i]);
|
| +}
|
| +
|
| +void CreateInputEventData(const WebInputEvent& event,
|
| + std::vector<InputEventData>* result) {
|
| + result->clear();
|
| +
|
| switch (event.type) {
|
| case WebInputEvent::MouseDown:
|
| case WebInputEvent::MouseUp:
|
| @@ -257,18 +308,18 @@
|
| case WebInputEvent::MouseEnter:
|
| case WebInputEvent::MouseLeave:
|
| case WebInputEvent::ContextMenu:
|
| - AppendMouseEvent(event, pp_events);
|
| + AppendMouseEvent(event, result);
|
| break;
|
| case WebInputEvent::MouseWheel:
|
| - AppendMouseWheelEvent(event, pp_events);
|
| + AppendMouseWheelEvent(event, result);
|
| break;
|
| case WebInputEvent::RawKeyDown:
|
| case WebInputEvent::KeyDown:
|
| case WebInputEvent::KeyUp:
|
| - AppendKeyEvent(event, pp_events);
|
| + AppendKeyEvent(event, result);
|
| break;
|
| case WebInputEvent::Char:
|
| - AppendCharEvent(event, pp_events);
|
| + AppendCharEvent(event, result);
|
| break;
|
| case WebInputEvent::Undefined:
|
| default:
|
| @@ -305,5 +356,28 @@
|
| return web_input_event.release();
|
| }
|
|
|
| +PP_InputEvent_Class ClassifyInputEvent(WebInputEvent::Type type) {
|
| + switch (type) {
|
| + case WebInputEvent::MouseDown:
|
| + case WebInputEvent::MouseUp:
|
| + case WebInputEvent::MouseMove:
|
| + case WebInputEvent::MouseEnter:
|
| + case WebInputEvent::MouseLeave:
|
| + case WebInputEvent::ContextMenu:
|
| + return PP_INPUTEVENT_CLASS_MOUSE;
|
| + case WebInputEvent::MouseWheel:
|
| + return PP_INPUTEVENT_CLASS_WHEEL;
|
| + case WebInputEvent::RawKeyDown:
|
| + case WebInputEvent::KeyDown:
|
| + case WebInputEvent::KeyUp:
|
| + case WebInputEvent::Char:
|
| + return PP_INPUTEVENT_CLASS_KEYBOARD;
|
| + case WebInputEvent::Undefined:
|
| + default:
|
| + NOTREACHED();
|
| + return PP_InputEvent_Class(0);
|
| + }
|
| +}
|
| +
|
| } // namespace ppapi
|
| } // namespace webkit
|
|
|