Chromium Code Reviews| Index: webkit/plugins/ppapi/event_conversion.cc |
| =================================================================== |
| --- webkit/plugins/ppapi/event_conversion.cc (revision 90976) |
| +++ 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,30 +60,28 @@ |
| // 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); |
|
dmichael (off chromium)
2011/07/01 20:04:19
static_cast
brettw
2011/07/01 21:14:52
Done.
|
| - 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); |
| + 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); |
| @@ -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); |
| @@ -128,29 +125,31 @@ |
| 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); |
| + 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); |
| + 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 |