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