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 14 namespace pp { 15 16 namespace { 17 18 template <> const char* interface_name<PPB_InputEvent_1_0>() { 19 return PPB_INPUT_EVENT_INTERFACE_1_0; 20 } 21 22 template <> const char* interface_name<PPB_KeyboardInputEvent_1_0>() { 23 return PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0; 24 } 25 26 template <> const char* interface_name<PPB_MouseInputEvent_1_1>() { 27 return PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1; 28 } 29 30 template <> const char* interface_name<PPB_WheelInputEvent_1_0>() { 31 return PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0; 32 } 33 34 template <> const char* interface_name<PPB_TouchInputEvent_1_0>() { 35 return PPB_TOUCH_INPUT_EVENT_INTERFACE_1_0; 36 } 37 38 template <> 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 46 InputEvent::InputEvent() : Resource() { 47 } 48 49 InputEvent::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 59 InputEvent::~InputEvent() { 60 } 61 62 PP_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 68 PP_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 74 uint32_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 82 MouseInputEvent::MouseInputEvent() : InputEvent() { 83 } 84 85 MouseInputEvent::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 96 MouseInputEvent::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 112 PP_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 118 Point 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 124 int32_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 130 Point 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 138 WheelInputEvent::WheelInputEvent() : InputEvent() { 139 } 140 141 WheelInputEvent::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 152 WheelInputEvent::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 167 FloatPoint 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 173 FloatPoint 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 179 bool 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 188 KeyboardInputEvent::KeyboardInputEvent() : InputEvent() { 189 } 190 191 KeyboardInputEvent::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 202 KeyboardInputEvent::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 216 uint32_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 222 Var 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 ------------------------------------------------------------ 231 TouchInputEvent::TouchInputEvent() : InputEvent() { 232 } 233 234 TouchInputEvent::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 245 TouchInputEvent::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 256 void 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 264 uint32_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 271 TouchPoint 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 279 TouchPoint 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 289 IMEInputEvent::IMEInputEvent() : InputEvent() { 290 } 291 292 IMEInputEvent::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 302 IMEInputEvent::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 321 Var 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 330 uint32_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 338 uint32_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 346 int32_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 354 void 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