blob: 93385bfc4d21dea1a4933da0a6476d7e489da4d3 [file] [log] [blame]
Torne (Richard Coles)58218062012-11-14 11:43:16 +00001// 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
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +000022template <> const char* interface_name<PPB_KeyboardInputEvent_1_2>() {
23 return PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_2;
24}
25
Torne (Richard Coles)58218062012-11-14 11:43:16 +000026template <> const char* interface_name<PPB_KeyboardInputEvent_1_0>() {
27 return PPB_KEYBOARD_INPUT_EVENT_INTERFACE_1_0;
28}
29
30template <> const char* interface_name<PPB_MouseInputEvent_1_1>() {
31 return PPB_MOUSE_INPUT_EVENT_INTERFACE_1_1;
32}
33
34template <> const char* interface_name<PPB_WheelInputEvent_1_0>() {
35 return PPB_WHEEL_INPUT_EVENT_INTERFACE_1_0;
36}
37
38template <> const char* interface_name<PPB_TouchInputEvent_1_0>() {
39 return PPB_TOUCH_INPUT_EVENT_INTERFACE_1_0;
40}
41
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +010042template <> const char* interface_name<PPB_IMEInputEvent_1_0>() {
43 return PPB_IME_INPUT_EVENT_INTERFACE_1_0;
44}
45
Torne (Richard Coles)58218062012-11-14 11:43:16 +000046} // namespace
47
48// InputEvent ------------------------------------------------------------------
49
50InputEvent::InputEvent() : Resource() {
51}
52
53InputEvent::InputEvent(PP_Resource input_event_resource) : Resource() {
54 // Type check the input event before setting it.
55 if (!has_interface<PPB_InputEvent_1_0>())
56 return;
57 if (get_interface<PPB_InputEvent_1_0>()->IsInputEvent(input_event_resource)) {
58 Module::Get()->core()->AddRefResource(input_event_resource);
59 PassRefFromConstructor(input_event_resource);
60 }
61}
62
63InputEvent::~InputEvent() {
64}
65
66PP_InputEvent_Type InputEvent::GetType() const {
67 if (!has_interface<PPB_InputEvent_1_0>())
68 return PP_INPUTEVENT_TYPE_UNDEFINED;
69 return get_interface<PPB_InputEvent_1_0>()->GetType(pp_resource());
70}
71
72PP_TimeTicks InputEvent::GetTimeStamp() const {
73 if (!has_interface<PPB_InputEvent_1_0>())
74 return 0.0f;
75 return get_interface<PPB_InputEvent_1_0>()->GetTimeStamp(pp_resource());
76}
77
78uint32_t InputEvent::GetModifiers() const {
79 if (!has_interface<PPB_InputEvent_1_0>())
80 return 0;
81 return get_interface<PPB_InputEvent_1_0>()->GetModifiers(pp_resource());
82}
83
84// MouseInputEvent -------------------------------------------------------------
85
86MouseInputEvent::MouseInputEvent() : InputEvent() {
87}
88
89MouseInputEvent::MouseInputEvent(const InputEvent& event) : InputEvent() {
90 // Type check the input event before setting it.
91 if (!has_interface<PPB_MouseInputEvent_1_1>())
92 return;
93 if (get_interface<PPB_MouseInputEvent_1_1>()->IsMouseInputEvent(
94 event.pp_resource())) {
95 Module::Get()->core()->AddRefResource(event.pp_resource());
96 PassRefFromConstructor(event.pp_resource());
97 }
98}
99
100MouseInputEvent::MouseInputEvent(const InstanceHandle& instance,
101 PP_InputEvent_Type type,
102 PP_TimeTicks time_stamp,
103 uint32_t modifiers,
104 PP_InputEvent_MouseButton mouse_button,
105 const Point& mouse_position,
106 int32_t click_count,
107 const Point& mouse_movement) {
108 // Type check the input event before setting it.
109 if (!has_interface<PPB_MouseInputEvent_1_1>())
110 return;
111 PassRefFromConstructor(get_interface<PPB_MouseInputEvent_1_1>()->Create(
112 instance.pp_instance(), type, time_stamp, modifiers, mouse_button,
113 &mouse_position.pp_point(), click_count, &mouse_movement.pp_point()));
114}
115
116PP_InputEvent_MouseButton MouseInputEvent::GetButton() const {
117 if (!has_interface<PPB_MouseInputEvent_1_1>())
118 return PP_INPUTEVENT_MOUSEBUTTON_NONE;
119 return get_interface<PPB_MouseInputEvent_1_1>()->GetButton(pp_resource());
120}
121
122Point MouseInputEvent::GetPosition() const {
123 if (!has_interface<PPB_MouseInputEvent_1_1>())
124 return Point();
125 return get_interface<PPB_MouseInputEvent_1_1>()->GetPosition(pp_resource());
126}
127
128int32_t MouseInputEvent::GetClickCount() const {
129 if (!has_interface<PPB_MouseInputEvent_1_1>())
130 return 0;
131 return get_interface<PPB_MouseInputEvent_1_1>()->GetClickCount(pp_resource());
132}
133
134Point MouseInputEvent::GetMovement() const {
135 if (!has_interface<PPB_MouseInputEvent_1_1>())
136 return Point();
137 return get_interface<PPB_MouseInputEvent_1_1>()->GetMovement(pp_resource());
138}
139
140// WheelInputEvent -------------------------------------------------------------
141
142WheelInputEvent::WheelInputEvent() : InputEvent() {
143}
144
145WheelInputEvent::WheelInputEvent(const InputEvent& event) : InputEvent() {
146 // Type check the input event before setting it.
147 if (!has_interface<PPB_WheelInputEvent_1_0>())
148 return;
149 if (get_interface<PPB_WheelInputEvent_1_0>()->IsWheelInputEvent(
150 event.pp_resource())) {
151 Module::Get()->core()->AddRefResource(event.pp_resource());
152 PassRefFromConstructor(event.pp_resource());
153 }
154}
155
156WheelInputEvent::WheelInputEvent(const InstanceHandle& instance,
157 PP_TimeTicks time_stamp,
158 uint32_t modifiers,
159 const FloatPoint& wheel_delta,
160 const FloatPoint& wheel_ticks,
161 bool scroll_by_page) {
162 // Type check the input event before setting it.
163 if (!has_interface<PPB_WheelInputEvent_1_0>())
164 return;
165 PassRefFromConstructor(get_interface<PPB_WheelInputEvent_1_0>()->Create(
166 instance.pp_instance(), time_stamp, modifiers,
167 &wheel_delta.pp_float_point(), &wheel_ticks.pp_float_point(),
168 PP_FromBool(scroll_by_page)));
169}
170
171FloatPoint WheelInputEvent::GetDelta() const {
172 if (!has_interface<PPB_WheelInputEvent_1_0>())
173 return FloatPoint();
174 return get_interface<PPB_WheelInputEvent_1_0>()->GetDelta(pp_resource());
175}
176
177FloatPoint WheelInputEvent::GetTicks() const {
178 if (!has_interface<PPB_WheelInputEvent_1_0>())
179 return FloatPoint();
180 return get_interface<PPB_WheelInputEvent_1_0>()->GetTicks(pp_resource());
181}
182
183bool WheelInputEvent::GetScrollByPage() const {
184 if (!has_interface<PPB_WheelInputEvent_1_0>())
185 return false;
186 return PP_ToBool(
187 get_interface<PPB_WheelInputEvent_1_0>()->GetScrollByPage(pp_resource()));
188}
189
190// KeyboardInputEvent ----------------------------------------------------------
191
192KeyboardInputEvent::KeyboardInputEvent() : InputEvent() {
193}
194
195KeyboardInputEvent::KeyboardInputEvent(const InputEvent& event) : InputEvent() {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000196 PP_Bool is_keyboard_event = PP_FALSE;
197
198 if (has_interface<PPB_KeyboardInputEvent_1_2>()) {
199 is_keyboard_event =
200 get_interface<PPB_KeyboardInputEvent_1_2>()->IsKeyboardInputEvent(
201 event.pp_resource());
202 } else if (has_interface<PPB_KeyboardInputEvent_1_0>()) {
203 is_keyboard_event =
204 get_interface<PPB_KeyboardInputEvent_1_0>()->IsKeyboardInputEvent(
205 event.pp_resource());
206 }
207
208 if (PP_ToBool(is_keyboard_event)) {
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000209 Module::Get()->core()->AddRefResource(event.pp_resource());
210 PassRefFromConstructor(event.pp_resource());
211 }
212}
213
214KeyboardInputEvent::KeyboardInputEvent(const InstanceHandle& instance,
215 PP_InputEvent_Type type,
216 PP_TimeTicks time_stamp,
217 uint32_t modifiers,
218 uint32_t key_code,
219 const Var& character_text) {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000220 if (has_interface<PPB_KeyboardInputEvent_1_2>()) {
221 PassRefFromConstructor(get_interface<PPB_KeyboardInputEvent_1_2>()->Create(
222 instance.pp_instance(), type, time_stamp, modifiers, key_code,
223 character_text.pp_var(), Var().pp_var()));
224 } else if (has_interface<PPB_KeyboardInputEvent_1_0>()) {
225 PassRefFromConstructor(get_interface<PPB_KeyboardInputEvent_1_0>()->Create(
226 instance.pp_instance(), type, time_stamp, modifiers, key_code,
227 character_text.pp_var()));
228 }
229}
230
231KeyboardInputEvent::KeyboardInputEvent(const InstanceHandle& instance,
232 PP_InputEvent_Type type,
233 PP_TimeTicks time_stamp,
234 uint32_t modifiers,
235 uint32_t key_code,
236 const Var& character_text,
237 const Var& code) {
238 if (has_interface<PPB_KeyboardInputEvent_1_2>()) {
239 PassRefFromConstructor(get_interface<PPB_KeyboardInputEvent_1_2>()->Create(
240 instance.pp_instance(), type, time_stamp, modifiers, key_code,
241 character_text.pp_var(), code.pp_var()));
242 } else if (has_interface<PPB_KeyboardInputEvent_1_0>()) {
243 PassRefFromConstructor(get_interface<PPB_KeyboardInputEvent_1_0>()->Create(
244 instance.pp_instance(), type, time_stamp, modifiers, key_code,
245 character_text.pp_var()));
246 }
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000247}
248
249uint32_t KeyboardInputEvent::GetKeyCode() const {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000250 if (has_interface<PPB_KeyboardInputEvent_1_2>()) {
251 return get_interface<PPB_KeyboardInputEvent_1_2>()->GetKeyCode(
252 pp_resource());
253 } else if (has_interface<PPB_KeyboardInputEvent_1_0>()) {
254 return get_interface<PPB_KeyboardInputEvent_1_0>()->GetKeyCode(
255 pp_resource());
256 }
257 return 0;
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000258}
259
260Var KeyboardInputEvent::GetCharacterText() const {
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000261 if (has_interface<PPB_KeyboardInputEvent_1_2>()) {
262 return Var(PASS_REF,
263 get_interface<PPB_KeyboardInputEvent_1_2>()->GetCharacterText(
264 pp_resource()));
265 } else if (has_interface<PPB_KeyboardInputEvent_1_0>()) {
266 return Var(PASS_REF,
267 get_interface<PPB_KeyboardInputEvent_1_0>()->GetCharacterText(
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000268 pp_resource()));
Torne (Richard Coles)5d1f7b12014-02-21 12:16:55 +0000269 }
270 return Var();
271}
272
273Var KeyboardInputEvent::GetCode() const {
274 if (has_interface<PPB_KeyboardInputEvent_1_2>()) {
275 return Var(PASS_REF,
276 get_interface<PPB_KeyboardInputEvent_1_2>()->GetCode(
277 pp_resource()));
278 }
279 return Var();
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000280}
281
282// TouchInputEvent ------------------------------------------------------------
283TouchInputEvent::TouchInputEvent() : InputEvent() {
284}
285
286TouchInputEvent::TouchInputEvent(const InputEvent& event) : InputEvent() {
287 if (!has_interface<PPB_TouchInputEvent_1_0>())
288 return;
289 // Type check the input event before setting it.
290 if (get_interface<PPB_TouchInputEvent_1_0>()->IsTouchInputEvent(
291 event.pp_resource())) {
292 Module::Get()->core()->AddRefResource(event.pp_resource());
293 PassRefFromConstructor(event.pp_resource());
294 }
295}
296
297TouchInputEvent::TouchInputEvent(const InstanceHandle& instance,
298 PP_InputEvent_Type type,
299 PP_TimeTicks time_stamp,
300 uint32_t modifiers) {
301 // Type check the input event before setting it.
302 if (!has_interface<PPB_TouchInputEvent_1_0>())
303 return;
304 PassRefFromConstructor(get_interface<PPB_TouchInputEvent_1_0>()->Create(
305 instance.pp_instance(), type, time_stamp, modifiers));
306}
307
308void TouchInputEvent::AddTouchPoint(PP_TouchListType list,
309 PP_TouchPoint point) {
310 if (!has_interface<PPB_TouchInputEvent_1_0>())
311 return;
312 get_interface<PPB_TouchInputEvent_1_0>()->AddTouchPoint(pp_resource(), list,
313 &point);
314}
315
316uint32_t TouchInputEvent::GetTouchCount(PP_TouchListType list) const {
317 if (!has_interface<PPB_TouchInputEvent_1_0>())
318 return 0;
319 return get_interface<PPB_TouchInputEvent_1_0>()->GetTouchCount(pp_resource(),
320 list);
321}
322
323TouchPoint TouchInputEvent::GetTouchById(PP_TouchListType list,
324 uint32_t id) const {
325 if (!has_interface<PPB_TouchInputEvent_1_0>())
326 return TouchPoint();
327 return TouchPoint(get_interface<PPB_TouchInputEvent_1_0>()->
328 GetTouchById(pp_resource(), list, id));
329}
330
331TouchPoint TouchInputEvent::GetTouchByIndex(PP_TouchListType list,
332 uint32_t index) const {
333 if (!has_interface<PPB_TouchInputEvent_1_0>())
334 return TouchPoint();
335 return TouchPoint(get_interface<PPB_TouchInputEvent_1_0>()->
336 GetTouchByIndex(pp_resource(), list, index));
337}
338
Torne (Richard Coles)a36e5922013-08-05 13:57:33 +0100339// IMEInputEvent -------------------------------------------------------
340
341IMEInputEvent::IMEInputEvent() : InputEvent() {
342}
343
344IMEInputEvent::IMEInputEvent(const InputEvent& event) : InputEvent() {
345 if (has_interface<PPB_IMEInputEvent_1_0>()) {
346 if (get_interface<PPB_IMEInputEvent_1_0>()->IsIMEInputEvent(
347 event.pp_resource())) {
348 Module::Get()->core()->AddRefResource(event.pp_resource());
349 PassRefFromConstructor(event.pp_resource());
350 }
351 }
352}
353
354IMEInputEvent::IMEInputEvent(
355 const InstanceHandle& instance,
356 PP_InputEvent_Type type,
357 PP_TimeTicks time_stamp,
358 const Var& text,
359 const std::vector<uint32_t>& segment_offsets,
360 int32_t target_segment,
361 const std::pair<uint32_t, uint32_t>& selection) : InputEvent() {
362 if (!has_interface<PPB_IMEInputEvent_1_0>())
363 return;
364 uint32_t dummy = 0;
365 PassRefFromConstructor(get_interface<PPB_IMEInputEvent_1_0>()->Create(
366 instance.pp_instance(), type, time_stamp, text.pp_var(),
367 segment_offsets.empty() ? 0 : segment_offsets.size() - 1,
368 segment_offsets.empty() ? &dummy : &segment_offsets[0],
369 target_segment, selection.first, selection.second));
370}
371
372
373Var IMEInputEvent::GetText() const {
374 if (has_interface<PPB_IMEInputEvent_1_0>()) {
375 return Var(PASS_REF,
376 get_interface<PPB_IMEInputEvent_1_0>()->GetText(
377 pp_resource()));
378 }
379 return Var();
380}
381
382uint32_t IMEInputEvent::GetSegmentNumber() const {
383 if (has_interface<PPB_IMEInputEvent_1_0>()) {
384 return get_interface<PPB_IMEInputEvent_1_0>()->GetSegmentNumber(
385 pp_resource());
386 }
387 return 0;
388}
389
390uint32_t IMEInputEvent::GetSegmentOffset(uint32_t index) const {
391 if (has_interface<PPB_IMEInputEvent_1_0>()) {
392 return get_interface<PPB_IMEInputEvent_1_0>()->GetSegmentOffset(
393 pp_resource(), index);
394 }
395 return 0;
396}
397
398int32_t IMEInputEvent::GetTargetSegment() const {
399 if (has_interface<PPB_IMEInputEvent_1_0>()) {
400 return get_interface<PPB_IMEInputEvent_1_0>()->GetTargetSegment(
401 pp_resource());
402 }
403 return 0;
404}
405
406void IMEInputEvent::GetSelection(uint32_t* start, uint32_t* end) const {
407 if (has_interface<PPB_IMEInputEvent_1_0>()) {
408 get_interface<PPB_IMEInputEvent_1_0>()->GetSelection(pp_resource(),
409 start,
410 end);
411 }
412}
413
Torne (Richard Coles)58218062012-11-14 11:43:16 +0000414} // namespace pp