ppb_input_event_shared.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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/shared_impl/ppb_input_event_shared.h"
6
7#include "ppapi/shared_impl/var.h"
8
9using ppapi::thunk::PPB_InputEvent_API;
10
11namespace ppapi {
12
13InputEventData::InputEventData()
14    : is_filtered(false),
15      event_type(PP_INPUTEVENT_TYPE_UNDEFINED),
16      event_time_stamp(0.0),
17      event_modifiers(0),
18      mouse_button(PP_INPUTEVENT_MOUSEBUTTON_NONE),
19      mouse_position(PP_MakePoint(0, 0)),
20      mouse_click_count(0),
21      mouse_movement(PP_MakePoint(0, 0)),
22      wheel_delta(PP_MakeFloatPoint(0.0f, 0.0f)),
23      wheel_ticks(PP_MakeFloatPoint(0.0f, 0.0f)),
24      wheel_scroll_by_page(false),
25      key_code(0),
26      code(),
27      character_text(),
28      composition_target_segment(-1),
29      composition_selection_start(0),
30      composition_selection_end(0),
31      touches(),
32      changed_touches(),
33      target_touches() {}
34
35InputEventData::~InputEventData() {}
36
37PPB_InputEvent_Shared::PPB_InputEvent_Shared(ResourceObjectType type,
38                                             PP_Instance instance,
39                                             const InputEventData& data)
40    : Resource(type, instance), data_(data) {}
41
42PPB_InputEvent_API* PPB_InputEvent_Shared::AsPPB_InputEvent_API() {
43  return this;
44}
45
46const InputEventData& PPB_InputEvent_Shared::GetInputEventData() const {
47  return data_;
48}
49
50PP_InputEvent_Type PPB_InputEvent_Shared::GetType() { return data_.event_type; }
51
52PP_TimeTicks PPB_InputEvent_Shared::GetTimeStamp() {
53  return data_.event_time_stamp;
54}
55
56uint32_t PPB_InputEvent_Shared::GetModifiers() { return data_.event_modifiers; }
57
58PP_InputEvent_MouseButton PPB_InputEvent_Shared::GetMouseButton() {
59  return data_.mouse_button;
60}
61
62PP_Point PPB_InputEvent_Shared::GetMousePosition() {
63  return data_.mouse_position;
64}
65
66int32_t PPB_InputEvent_Shared::GetMouseClickCount() {
67  return data_.mouse_click_count;
68}
69
70PP_Point PPB_InputEvent_Shared::GetMouseMovement() {
71  return data_.mouse_movement;
72}
73
74PP_FloatPoint PPB_InputEvent_Shared::GetWheelDelta() {
75  return data_.wheel_delta;
76}
77
78PP_FloatPoint PPB_InputEvent_Shared::GetWheelTicks() {
79  return data_.wheel_ticks;
80}
81
82PP_Bool PPB_InputEvent_Shared::GetWheelScrollByPage() {
83  return PP_FromBool(data_.wheel_scroll_by_page);
84}
85
86uint32_t PPB_InputEvent_Shared::GetKeyCode() { return data_.key_code; }
87
88PP_Var PPB_InputEvent_Shared::GetCharacterText() {
89  return StringVar::StringToPPVar(data_.character_text);
90}
91
92PP_Var PPB_InputEvent_Shared::GetCode() {
93  return StringVar::StringToPPVar(data_.code);
94}
95
96uint32_t PPB_InputEvent_Shared::GetIMESegmentNumber() {
97  if (data_.composition_segment_offsets.empty())
98    return 0;
99  return static_cast<uint32_t>(data_.composition_segment_offsets.size() - 1);
100}
101
102uint32_t PPB_InputEvent_Shared::GetIMESegmentOffset(uint32_t index) {
103  if (index >= data_.composition_segment_offsets.size())
104    return 0;
105  return data_.composition_segment_offsets[index];
106}
107
108int32_t PPB_InputEvent_Shared::GetIMETargetSegment() {
109  return data_.composition_target_segment;
110}
111
112void PPB_InputEvent_Shared::GetIMESelection(uint32_t* start, uint32_t* end) {
113  if (start)
114    *start = data_.composition_selection_start;
115  if (end)
116    *end = data_.composition_selection_end;
117}
118
119void PPB_InputEvent_Shared::AddTouchPoint(PP_TouchListType list,
120                                          const PP_TouchPoint& point) {
121  switch (list) {
122    case PP_TOUCHLIST_TYPE_TOUCHES:
123      data_.touches.push_back(point);
124      break;
125    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
126      data_.changed_touches.push_back(point);
127      break;
128    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
129      data_.target_touches.push_back(point);
130      break;
131    default:
132      break;
133  }
134}
135
136uint32_t PPB_InputEvent_Shared::GetTouchCount(PP_TouchListType list) {
137  switch (list) {
138    case PP_TOUCHLIST_TYPE_TOUCHES:
139      return static_cast<uint32_t>(data_.touches.size());
140    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
141      return static_cast<uint32_t>(data_.changed_touches.size());
142    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
143      return static_cast<uint32_t>(data_.target_touches.size());
144  }
145
146  return 0;
147}
148
149PP_TouchPoint PPB_InputEvent_Shared::GetTouchByIndex(PP_TouchListType list,
150                                                     uint32_t index) {
151  std::vector<PP_TouchPoint>* points;
152  switch (list) {
153    case PP_TOUCHLIST_TYPE_TOUCHES:
154      points = &data_.touches;
155      break;
156    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
157      points = &data_.changed_touches;
158      break;
159    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
160      points = &data_.target_touches;
161      break;
162    default:
163      return PP_MakeTouchPoint();
164  }
165  if (index >= points->size()) {
166    return PP_MakeTouchPoint();
167  }
168  return points->at(index);
169}
170
171PP_TouchPoint PPB_InputEvent_Shared::GetTouchById(PP_TouchListType list,
172                                                  uint32_t id) {
173  const std::vector<PP_TouchPoint>* points;
174  switch (list) {
175    case PP_TOUCHLIST_TYPE_TOUCHES:
176      points = &data_.touches;
177      break;
178    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
179      points = &data_.changed_touches;
180      break;
181    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
182      points = &data_.target_touches;
183      break;
184    default:
185      return PP_MakeTouchPoint();
186  }
187  for (size_t i = 0; i < points->size(); i++) {
188    if (points->at(i).id == id)
189      return points->at(i);
190  }
191  return PP_MakeTouchPoint();
192}
193
194// static
195PP_Resource PPB_InputEvent_Shared::CreateIMEInputEvent(
196    ResourceObjectType type,
197    PP_Instance instance,
198    PP_InputEvent_Type event_type,
199    PP_TimeTicks time_stamp,
200    struct PP_Var text,
201    uint32_t segment_number,
202    const uint32_t* segment_offsets,
203    int32_t target_segment,
204    uint32_t selection_start,
205    uint32_t selection_end) {
206  if (event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_START &&
207      event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE &&
208      event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_END &&
209      event_type != PP_INPUTEVENT_TYPE_IME_TEXT)
210    return 0;
211
212  InputEventData data;
213  data.event_type = event_type;
214  data.event_time_stamp = time_stamp;
215  if (text.type == PP_VARTYPE_STRING) {
216    StringVar* text_str = StringVar::FromPPVar(text);
217    if (!text_str)
218      return 0;
219    data.character_text = text_str->value();
220  }
221  data.composition_target_segment = target_segment;
222  if (segment_number != 0) {
223    data.composition_segment_offsets.assign(
224        &segment_offsets[0], &segment_offsets[segment_number + 1]);
225  }
226  data.composition_selection_start = selection_start;
227  data.composition_selection_end = selection_end;
228
229  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
230}
231
232// static
233PP_Resource PPB_InputEvent_Shared::CreateKeyboardInputEvent(
234    ResourceObjectType type,
235    PP_Instance instance,
236    PP_InputEvent_Type event_type,
237    PP_TimeTicks time_stamp,
238    uint32_t modifiers,
239    uint32_t key_code,
240    struct PP_Var character_text,
241    struct PP_Var code) {
242  if (event_type != PP_INPUTEVENT_TYPE_RAWKEYDOWN &&
243      event_type != PP_INPUTEVENT_TYPE_KEYDOWN &&
244      event_type != PP_INPUTEVENT_TYPE_KEYUP &&
245      event_type != PP_INPUTEVENT_TYPE_CHAR)
246    return 0;
247
248  InputEventData data;
249  data.event_type = event_type;
250  data.event_time_stamp = time_stamp;
251  data.event_modifiers = modifiers;
252  data.key_code = key_code;
253  if (character_text.type == PP_VARTYPE_STRING) {
254    StringVar* text_str = StringVar::FromPPVar(character_text);
255    if (!text_str)
256      return 0;
257    data.character_text = text_str->value();
258  }
259  if (code.type == PP_VARTYPE_STRING) {
260    StringVar* code_str = StringVar::FromPPVar(code);
261    if (!code_str)
262      return 0;
263    data.code = code_str->value();
264  }
265
266  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
267}
268
269// static
270PP_Resource PPB_InputEvent_Shared::CreateMouseInputEvent(
271    ResourceObjectType type,
272    PP_Instance instance,
273    PP_InputEvent_Type event_type,
274    PP_TimeTicks time_stamp,
275    uint32_t modifiers,
276    PP_InputEvent_MouseButton mouse_button,
277    const PP_Point* mouse_position,
278    int32_t click_count,
279    const PP_Point* mouse_movement) {
280  if (event_type != PP_INPUTEVENT_TYPE_MOUSEDOWN &&
281      event_type != PP_INPUTEVENT_TYPE_MOUSEUP &&
282      event_type != PP_INPUTEVENT_TYPE_MOUSEMOVE &&
283      event_type != PP_INPUTEVENT_TYPE_MOUSEENTER &&
284      event_type != PP_INPUTEVENT_TYPE_MOUSELEAVE)
285    return 0;
286
287  InputEventData data;
288  data.event_type = event_type;
289  data.event_time_stamp = time_stamp;
290  data.event_modifiers = modifiers;
291  data.mouse_button = mouse_button;
292  data.mouse_position = *mouse_position;
293  data.mouse_click_count = click_count;
294  data.mouse_movement = *mouse_movement;
295
296  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
297}
298
299// static
300PP_Resource PPB_InputEvent_Shared::CreateWheelInputEvent(
301    ResourceObjectType type,
302    PP_Instance instance,
303    PP_TimeTicks time_stamp,
304    uint32_t modifiers,
305    const PP_FloatPoint* wheel_delta,
306    const PP_FloatPoint* wheel_ticks,
307    PP_Bool scroll_by_page) {
308  InputEventData data;
309  data.event_type = PP_INPUTEVENT_TYPE_WHEEL;
310  data.event_time_stamp = time_stamp;
311  data.event_modifiers = modifiers;
312  data.wheel_delta = *wheel_delta;
313  data.wheel_ticks = *wheel_ticks;
314  data.wheel_scroll_by_page = PP_ToBool(scroll_by_page);
315
316  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
317}
318
319// static
320PP_Resource PPB_InputEvent_Shared::CreateTouchInputEvent(
321    ResourceObjectType type,
322    PP_Instance instance,
323    PP_InputEvent_Type event_type,
324    PP_TimeTicks time_stamp,
325    uint32_t modifiers) {
326  if (event_type != PP_INPUTEVENT_TYPE_TOUCHSTART &&
327      event_type != PP_INPUTEVENT_TYPE_TOUCHMOVE &&
328      event_type != PP_INPUTEVENT_TYPE_TOUCHEND &&
329      event_type != PP_INPUTEVENT_TYPE_TOUCHCANCEL)
330    return 0;
331
332  InputEventData data;
333  data.event_type = event_type;
334  data.event_time_stamp = time_stamp;
335  data.event_modifiers = modifiers;
336  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
337}
338
339}  // namespace ppapi
340