1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ppapi/cpp/input_event.h" 6 7#include "ppapi/cpp/instance_handle.h" 8#include "ppapi/cpp/module.h" 9#include "ppapi/cpp/module_impl.h" 10#include "ppapi/cpp/point.h" 11#include "ppapi/cpp/touch_point.h" 12#include "ppapi/cpp/var.h" 13 14namespace pp { 15 16namespace { 17 18template <> const char* interface_name<PPB_InputEvent_1_0>() { 19 return PPB_INPUT_EVENT_INTERFACE_1_0; 20} 21 22template <> const char* interface_name<PPB_KeyboardInputEvent_1_0>() { 23 return PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0; 24} 25 26template <> const char* interface_name<PPB_MouseInputEvent_1_1>() { 27 return PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1; 28} 29 30template <> const char* interface_name<PPB_WheelInputEvent_1_0>() { 31 return PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0; 32} 33 34template <> const char* interface_name<PPB_TouchInputEvent_1_0>() { 35 return PPB_TOUCH_INPUT_EVENT_INTERFACE_1_0; 36} 37 38template <> const char* interface_name<PPB_IMEInputEvent_1_0>() { 39 return PPB_IME_INPUT_EVENT_INTERFACE_1_0; 40} 41 42} // namespace 43 44// InputEvent ------------------------------------------------------------------ 45 46InputEvent::InputEvent() : Resource() { 47} 48 49InputEvent::InputEvent(PP_Resource input_event_resource) : Resource() { 50 // Type check the input event before setting it. 51 if (!has_interface<PPB_InputEvent_1_0>()) 52 return; 53 if (get_interface<PPB_InputEvent_1_0>()->IsInputEvent(input_event_resource)) { 54 Module::Get()->core()->AddRefResource(input_event_resource); 55 PassRefFromConstructor(input_event_resource); 56 } 57} 58 59InputEvent::~InputEvent() { 60} 61 62PP_InputEvent_Type InputEvent::GetType() const { 63 if (!has_interface<PPB_InputEvent_1_0>()) 64 return PP_INPUTEVENT_TYPE_UNDEFINED; 65 return get_interface<PPB_InputEvent_1_0>()->GetType(pp_resource()); 66} 67 68PP_TimeTicks InputEvent::GetTimeStamp() const { 69 if (!has_interface<PPB_InputEvent_1_0>()) 70 return 0.0f; 71 return get_interface<PPB_InputEvent_1_0>()->GetTimeStamp(pp_resource()); 72} 73 74uint32_t InputEvent::GetModifiers() const { 75 if (!has_interface<PPB_InputEvent_1_0>()) 76 return 0; 77 return get_interface<PPB_InputEvent_1_0>()->GetModifiers(pp_resource()); 78} 79 80// MouseInputEvent ------------------------------------------------------------- 81 82MouseInputEvent::MouseInputEvent() : InputEvent() { 83} 84 85MouseInputEvent::MouseInputEvent(const InputEvent& event) : InputEvent() { 86 // Type check the input event before setting it. 87 if (!has_interface<PPB_MouseInputEvent_1_1>()) 88 return; 89 if (get_interface<PPB_MouseInputEvent_1_1>()->IsMouseInputEvent( 90 event.pp_resource())) { 91 Module::Get()->core()->AddRefResource(event.pp_resource()); 92 PassRefFromConstructor(event.pp_resource()); 93 } 94} 95 96MouseInputEvent::MouseInputEvent(const InstanceHandle& instance, 97 PP_InputEvent_Type type, 98 PP_TimeTicks time_stamp, 99 uint32_t modifiers, 100 PP_InputEvent_MouseButton mouse_button, 101 const Point& mouse_position, 102 int32_t click_count, 103 const Point& mouse_movement) { 104 // Type check the input event before setting it. 105 if (!has_interface<PPB_MouseInputEvent_1_1>()) 106 return; 107 PassRefFromConstructor(get_interface<PPB_MouseInputEvent_1_1>()->Create( 108 instance.pp_instance(), type, time_stamp, modifiers, mouse_button, 109 &mouse_position.pp_point(), click_count, &mouse_movement.pp_point())); 110} 111 112PP_InputEvent_MouseButton MouseInputEvent::GetButton() const { 113 if (!has_interface<PPB_MouseInputEvent_1_1>()) 114 return PP_INPUTEVENT_MOUSEBUTTON_NONE; 115 return get_interface<PPB_MouseInputEvent_1_1>()->GetButton(pp_resource()); 116} 117 118Point MouseInputEvent::GetPosition() const { 119 if (!has_interface<PPB_MouseInputEvent_1_1>()) 120 return Point(); 121 return get_interface<PPB_MouseInputEvent_1_1>()->GetPosition(pp_resource()); 122} 123 124int32_t MouseInputEvent::GetClickCount() const { 125 if (!has_interface<PPB_MouseInputEvent_1_1>()) 126 return 0; 127 return get_interface<PPB_MouseInputEvent_1_1>()->GetClickCount(pp_resource()); 128} 129 130Point MouseInputEvent::GetMovement() const { 131 if (!has_interface<PPB_MouseInputEvent_1_1>()) 132 return Point(); 133 return get_interface<PPB_MouseInputEvent_1_1>()->GetMovement(pp_resource()); 134} 135 136// WheelInputEvent ------------------------------------------------------------- 137 138WheelInputEvent::WheelInputEvent() : InputEvent() { 139} 140 141WheelInputEvent::WheelInputEvent(const InputEvent& event) : InputEvent() { 142 // Type check the input event before setting it. 143 if (!has_interface<PPB_WheelInputEvent_1_0>()) 144 return; 145 if (get_interface<PPB_WheelInputEvent_1_0>()->IsWheelInputEvent( 146 event.pp_resource())) { 147 Module::Get()->core()->AddRefResource(event.pp_resource()); 148 PassRefFromConstructor(event.pp_resource()); 149 } 150} 151 152WheelInputEvent::WheelInputEvent(const InstanceHandle& instance, 153 PP_TimeTicks time_stamp, 154 uint32_t modifiers, 155 const FloatPoint& wheel_delta, 156 const FloatPoint& wheel_ticks, 157 bool scroll_by_page) { 158 // Type check the input event before setting it. 159 if (!has_interface<PPB_WheelInputEvent_1_0>()) 160 return; 161 PassRefFromConstructor(get_interface<PPB_WheelInputEvent_1_0>()->Create( 162 instance.pp_instance(), time_stamp, modifiers, 163 &wheel_delta.pp_float_point(), &wheel_ticks.pp_float_point(), 164 PP_FromBool(scroll_by_page))); 165} 166 167FloatPoint WheelInputEvent::GetDelta() const { 168 if (!has_interface<PPB_WheelInputEvent_1_0>()) 169 return FloatPoint(); 170 return get_interface<PPB_WheelInputEvent_1_0>()->GetDelta(pp_resource()); 171} 172 173FloatPoint WheelInputEvent::GetTicks() const { 174 if (!has_interface<PPB_WheelInputEvent_1_0>()) 175 return FloatPoint(); 176 return get_interface<PPB_WheelInputEvent_1_0>()->GetTicks(pp_resource()); 177} 178 179bool WheelInputEvent::GetScrollByPage() const { 180 if (!has_interface<PPB_WheelInputEvent_1_0>()) 181 return false; 182 return PP_ToBool( 183 get_interface<PPB_WheelInputEvent_1_0>()->GetScrollByPage(pp_resource())); 184} 185 186// KeyboardInputEvent ---------------------------------------------------------- 187 188KeyboardInputEvent::KeyboardInputEvent() : InputEvent() { 189} 190 191KeyboardInputEvent::KeyboardInputEvent(const InputEvent& event) : InputEvent() { 192 // Type check the input event before setting it. 193 if (!has_interface<PPB_KeyboardInputEvent_1_0>()) 194 return; 195 if (get_interface<PPB_KeyboardInputEvent_1_0>()->IsKeyboardInputEvent( 196 event.pp_resource())) { 197 Module::Get()->core()->AddRefResource(event.pp_resource()); 198 PassRefFromConstructor(event.pp_resource()); 199 } 200} 201 202KeyboardInputEvent::KeyboardInputEvent(const InstanceHandle& instance, 203 PP_InputEvent_Type type, 204 PP_TimeTicks time_stamp, 205 uint32_t modifiers, 206 uint32_t key_code, 207 const Var& character_text) { 208 // Type check the input event before setting it. 209 if (!has_interface<PPB_KeyboardInputEvent_1_0>()) 210 return; 211 PassRefFromConstructor(get_interface<PPB_KeyboardInputEvent_1_0>()->Create( 212 instance.pp_instance(), type, time_stamp, modifiers, key_code, 213 character_text.pp_var())); 214} 215 216uint32_t KeyboardInputEvent::GetKeyCode() const { 217 if (!has_interface<PPB_KeyboardInputEvent_1_0>()) 218 return 0; 219 return get_interface<PPB_KeyboardInputEvent_1_0>()->GetKeyCode(pp_resource()); 220} 221 222Var KeyboardInputEvent::GetCharacterText() const { 223 if (!has_interface<PPB_KeyboardInputEvent_1_0>()) 224 return Var(); 225 return Var(PASS_REF, 226 get_interface<PPB_KeyboardInputEvent_1_0>()->GetCharacterText( 227 pp_resource())); 228} 229 230// TouchInputEvent ------------------------------------------------------------ 231TouchInputEvent::TouchInputEvent() : InputEvent() { 232} 233 234TouchInputEvent::TouchInputEvent(const InputEvent& event) : InputEvent() { 235 if (!has_interface<PPB_TouchInputEvent_1_0>()) 236 return; 237 // Type check the input event before setting it. 238 if (get_interface<PPB_TouchInputEvent_1_0>()->IsTouchInputEvent( 239 event.pp_resource())) { 240 Module::Get()->core()->AddRefResource(event.pp_resource()); 241 PassRefFromConstructor(event.pp_resource()); 242 } 243} 244 245TouchInputEvent::TouchInputEvent(const InstanceHandle& instance, 246 PP_InputEvent_Type type, 247 PP_TimeTicks time_stamp, 248 uint32_t modifiers) { 249 // Type check the input event before setting it. 250 if (!has_interface<PPB_TouchInputEvent_1_0>()) 251 return; 252 PassRefFromConstructor(get_interface<PPB_TouchInputEvent_1_0>()->Create( 253 instance.pp_instance(), type, time_stamp, modifiers)); 254} 255 256void TouchInputEvent::AddTouchPoint(PP_TouchListType list, 257 PP_TouchPoint point) { 258 if (!has_interface<PPB_TouchInputEvent_1_0>()) 259 return; 260 get_interface<PPB_TouchInputEvent_1_0>()->AddTouchPoint(pp_resource(), list, 261 &point); 262} 263 264uint32_t TouchInputEvent::GetTouchCount(PP_TouchListType list) const { 265 if (!has_interface<PPB_TouchInputEvent_1_0>()) 266 return 0; 267 return get_interface<PPB_TouchInputEvent_1_0>()->GetTouchCount(pp_resource(), 268 list); 269} 270 271TouchPoint TouchInputEvent::GetTouchById(PP_TouchListType list, 272 uint32_t id) const { 273 if (!has_interface<PPB_TouchInputEvent_1_0>()) 274 return TouchPoint(); 275 return TouchPoint(get_interface<PPB_TouchInputEvent_1_0>()-> 276 GetTouchById(pp_resource(), list, id)); 277} 278 279TouchPoint TouchInputEvent::GetTouchByIndex(PP_TouchListType list, 280 uint32_t index) const { 281 if (!has_interface<PPB_TouchInputEvent_1_0>()) 282 return TouchPoint(); 283 return TouchPoint(get_interface<PPB_TouchInputEvent_1_0>()-> 284 GetTouchByIndex(pp_resource(), list, index)); 285} 286 287// IMEInputEvent ------------------------------------------------------- 288 289IMEInputEvent::IMEInputEvent() : InputEvent() { 290} 291 292IMEInputEvent::IMEInputEvent(const InputEvent& event) : InputEvent() { 293 if (has_interface<PPB_IMEInputEvent_1_0>()) { 294 if (get_interface<PPB_IMEInputEvent_1_0>()->IsIMEInputEvent( 295 event.pp_resource())) { 296 Module::Get()->core()->AddRefResource(event.pp_resource()); 297 PassRefFromConstructor(event.pp_resource()); 298 } 299 } 300} 301 302IMEInputEvent::IMEInputEvent( 303 const InstanceHandle& instance, 304 PP_InputEvent_Type type, 305 PP_TimeTicks time_stamp, 306 const Var& text, 307 const std::vector<uint32_t>& segment_offsets, 308 int32_t target_segment, 309 const std::pair<uint32_t, uint32_t>& selection) : InputEvent() { 310 if (!has_interface<PPB_IMEInputEvent_1_0>()) 311 return; 312 uint32_t dummy = 0; 313 PassRefFromConstructor(get_interface<PPB_IMEInputEvent_1_0>()->Create( 314 instance.pp_instance(), type, time_stamp, text.pp_var(), 315 segment_offsets.empty() ? 0 : segment_offsets.size() - 1, 316 segment_offsets.empty() ? &dummy : &segment_offsets[0], 317 target_segment, selection.first, selection.second)); 318} 319 320 321Var IMEInputEvent::GetText() const { 322 if (has_interface<PPB_IMEInputEvent_1_0>()) { 323 return Var(PASS_REF, 324 get_interface<PPB_IMEInputEvent_1_0>()->GetText( 325 pp_resource())); 326 } 327 return Var(); 328} 329 330uint32_t IMEInputEvent::GetSegmentNumber() const { 331 if (has_interface<PPB_IMEInputEvent_1_0>()) { 332 return get_interface<PPB_IMEInputEvent_1_0>()->GetSegmentNumber( 333 pp_resource()); 334 } 335 return 0; 336} 337 338uint32_t IMEInputEvent::GetSegmentOffset(uint32_t index) const { 339 if (has_interface<PPB_IMEInputEvent_1_0>()) { 340 return get_interface<PPB_IMEInputEvent_1_0>()->GetSegmentOffset( 341 pp_resource(), index); 342 } 343 return 0; 344} 345 346int32_t IMEInputEvent::GetTargetSegment() const { 347 if (has_interface<PPB_IMEInputEvent_1_0>()) { 348 return get_interface<PPB_IMEInputEvent_1_0>()->GetTargetSegment( 349 pp_resource()); 350 } 351 return 0; 352} 353 354void IMEInputEvent::GetSelection(uint32_t* start, uint32_t* end) const { 355 if (has_interface<PPB_IMEInputEvent_1_0>()) { 356 get_interface<PPB_IMEInputEvent_1_0>()->GetSelection(pp_resource(), 357 start, 358 end); 359 } 360} 361 362} // namespace pp 363