| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "sky/engine/config.h" | 31 #include "sky/engine/config.h" |
| 32 #include "sky/engine/web/WebInputEventConversion.h" | 32 #include "sky/engine/web/WebInputEventConversion.h" |
| 33 | 33 |
| 34 #include "sky/engine/core/dom/Touch.h" | |
| 35 #include "sky/engine/core/dom/TouchList.h" | |
| 36 #include "sky/engine/core/events/GestureEvent.h" | 34 #include "sky/engine/core/events/GestureEvent.h" |
| 37 #include "sky/engine/core/events/KeyboardEvent.h" | 35 #include "sky/engine/core/events/KeyboardEvent.h" |
| 38 #include "sky/engine/core/events/TouchEvent.h" | |
| 39 #include "sky/engine/core/frame/FrameHost.h" | 36 #include "sky/engine/core/frame/FrameHost.h" |
| 40 #include "sky/engine/core/frame/FrameView.h" | 37 #include "sky/engine/core/frame/FrameView.h" |
| 41 #include "sky/engine/core/page/Page.h" | 38 #include "sky/engine/core/page/Page.h" |
| 42 #include "sky/engine/core/rendering/RenderObject.h" | 39 #include "sky/engine/core/rendering/RenderObject.h" |
| 43 #include "sky/engine/platform/KeyboardCodes.h" | 40 #include "sky/engine/platform/KeyboardCodes.h" |
| 44 #include "sky/engine/platform/Widget.h" | 41 #include "sky/engine/platform/Widget.h" |
| 45 | 42 |
| 46 namespace blink { | 43 namespace blink { |
| 47 | 44 |
| 48 static const double millisPerSecond = 1000.0; | 45 static const double millisPerSecond = 1000.0; |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 257 bool PlatformKeyboardEventBuilder::isCharacterKey() const | 254 bool PlatformKeyboardEventBuilder::isCharacterKey() const |
| 258 { | 255 { |
| 259 switch (windowsVirtualKeyCode()) { | 256 switch (windowsVirtualKeyCode()) { |
| 260 case VKEY_BACK: | 257 case VKEY_BACK: |
| 261 case VKEY_ESCAPE: | 258 case VKEY_ESCAPE: |
| 262 return false; | 259 return false; |
| 263 } | 260 } |
| 264 return true; | 261 return true; |
| 265 } | 262 } |
| 266 | 263 |
| 267 inline PlatformEvent::Type toPlatformTouchEventType(const WebInputEvent::Type ty
pe) | |
| 268 { | |
| 269 switch (type) { | |
| 270 case WebInputEvent::TouchStart: | |
| 271 return PlatformEvent::TouchStart; | |
| 272 case WebInputEvent::TouchMove: | |
| 273 return PlatformEvent::TouchMove; | |
| 274 case WebInputEvent::TouchEnd: | |
| 275 return PlatformEvent::TouchEnd; | |
| 276 case WebInputEvent::TouchCancel: | |
| 277 return PlatformEvent::TouchCancel; | |
| 278 default: | |
| 279 ASSERT_NOT_REACHED(); | |
| 280 } | |
| 281 return PlatformEvent::TouchStart; | |
| 282 } | |
| 283 | |
| 284 inline PlatformTouchPoint::State toPlatformTouchPointState(const WebTouchPoint::
State state) | |
| 285 { | |
| 286 switch (state) { | |
| 287 case WebTouchPoint::StateReleased: | |
| 288 return PlatformTouchPoint::TouchReleased; | |
| 289 case WebTouchPoint::StatePressed: | |
| 290 return PlatformTouchPoint::TouchPressed; | |
| 291 case WebTouchPoint::StateMoved: | |
| 292 return PlatformTouchPoint::TouchMoved; | |
| 293 case WebTouchPoint::StateStationary: | |
| 294 return PlatformTouchPoint::TouchStationary; | |
| 295 case WebTouchPoint::StateCancelled: | |
| 296 return PlatformTouchPoint::TouchCancelled; | |
| 297 case WebTouchPoint::StateUndefined: | |
| 298 ASSERT_NOT_REACHED(); | |
| 299 } | |
| 300 return PlatformTouchPoint::TouchReleased; | |
| 301 } | |
| 302 | |
| 303 inline WebTouchPoint::State toWebTouchPointState(const AtomicString& type) | |
| 304 { | |
| 305 if (type == EventTypeNames::touchend) | |
| 306 return WebTouchPoint::StateReleased; | |
| 307 if (type == EventTypeNames::touchcancel) | |
| 308 return WebTouchPoint::StateCancelled; | |
| 309 if (type == EventTypeNames::touchstart) | |
| 310 return WebTouchPoint::StatePressed; | |
| 311 if (type == EventTypeNames::touchmove) | |
| 312 return WebTouchPoint::StateMoved; | |
| 313 return WebTouchPoint::StateUndefined; | |
| 314 } | |
| 315 | |
| 316 PlatformTouchPointBuilder::PlatformTouchPointBuilder(Widget* widget, const WebTo
uchPoint& point) | |
| 317 { | |
| 318 float scale = 1.0f / widgetInputEventsScaleFactor(widget); | |
| 319 IntSize offset = widgetInputEventsOffset(widget); | |
| 320 m_id = point.id; | |
| 321 m_state = toPlatformTouchPointState(point.state); | |
| 322 FloatPoint pos = (point.position - offset).scaledBy(scale); | |
| 323 IntPoint flooredPoint = flooredIntPoint(pos); | |
| 324 // This assumes convertFromContainingView does only translations, not scales
. | |
| 325 m_pos = widget->convertFromContainingView(flooredPoint) + (pos - flooredPoin
t); | |
| 326 m_screenPos = FloatPoint(point.screenPosition.x, point.screenPosition.y); | |
| 327 m_radius = FloatSize(point.radiusX, point.radiusY).scaledBy(scale); | |
| 328 m_rotationAngle = point.rotationAngle; | |
| 329 m_force = point.force; | |
| 330 } | |
| 331 | |
| 332 PlatformTouchEventBuilder::PlatformTouchEventBuilder(Widget* widget, const WebTo
uchEvent& event) | |
| 333 { | |
| 334 m_type = toPlatformTouchEventType(event.type); | |
| 335 | |
| 336 m_modifiers = 0; | |
| 337 if (event.modifiers & WebInputEvent::ShiftKey) | |
| 338 m_modifiers |= PlatformEvent::ShiftKey; | |
| 339 if (event.modifiers & WebInputEvent::ControlKey) | |
| 340 m_modifiers |= PlatformEvent::CtrlKey; | |
| 341 if (event.modifiers & WebInputEvent::AltKey) | |
| 342 m_modifiers |= PlatformEvent::AltKey; | |
| 343 if (event.modifiers & WebInputEvent::MetaKey) | |
| 344 m_modifiers |= PlatformEvent::MetaKey; | |
| 345 | |
| 346 m_timestamp = event.timeStampSeconds; | |
| 347 | |
| 348 for (unsigned i = 0; i < event.touchesLength; ++i) | |
| 349 m_touchPoints.append(PlatformTouchPointBuilder(widget, event.touches[i])
); | |
| 350 | |
| 351 m_cancelable = event.cancelable; | |
| 352 } | |
| 353 | |
| 354 static int getWebInputModifiers(const UIEventWithKeyState& event) | 264 static int getWebInputModifiers(const UIEventWithKeyState& event) |
| 355 { | 265 { |
| 356 int modifiers = 0; | 266 int modifiers = 0; |
| 357 if (event.ctrlKey()) | 267 if (event.ctrlKey()) |
| 358 modifiers |= WebInputEvent::ControlKey; | 268 modifiers |= WebInputEvent::ControlKey; |
| 359 if (event.shiftKey()) | 269 if (event.shiftKey()) |
| 360 modifiers |= WebInputEvent::ShiftKey; | 270 modifiers |= WebInputEvent::ShiftKey; |
| 361 if (event.altKey()) | 271 if (event.altKey()) |
| 362 modifiers |= WebInputEvent::AltKey; | 272 modifiers |= WebInputEvent::AltKey; |
| 363 if (event.metaKey()) | 273 if (event.metaKey()) |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 nativeKeyCode = event.nativeVirtualKeyCode(); | 362 nativeKeyCode = event.nativeVirtualKeyCode(); |
| 453 | 363 |
| 454 windowsKeyCode = windowsKeyCodeWithoutLocation(event.windowsVirtualKeyCode()
); | 364 windowsKeyCode = windowsKeyCodeWithoutLocation(event.windowsVirtualKeyCode()
); |
| 455 modifiers |= locationModifiersFromWindowsKeyCode(event.windowsVirtualKeyCode
()); | 365 modifiers |= locationModifiersFromWindowsKeyCode(event.windowsVirtualKeyCode
()); |
| 456 | 366 |
| 457 event.text().copyTo(text, 0, textLengthCap); | 367 event.text().copyTo(text, 0, textLengthCap); |
| 458 event.unmodifiedText().copyTo(unmodifiedText, 0, textLengthCap); | 368 event.unmodifiedText().copyTo(unmodifiedText, 0, textLengthCap); |
| 459 memcpy(keyIdentifier, event.keyIdentifier().ascii().data(), std::min(static_
cast<unsigned>(keyIdentifierLengthCap), event.keyIdentifier().length())); | 369 memcpy(keyIdentifier, event.keyIdentifier().ascii().data(), std::min(static_
cast<unsigned>(keyIdentifierLengthCap), event.keyIdentifier().length())); |
| 460 } | 370 } |
| 461 | 371 |
| 462 static void addTouchPoints(const Widget* widget, const AtomicString& touchType,
TouchList* touches, WebTouchPoint* touchPoints, unsigned* touchPointsLength, con
st RenderObject* renderObject) | |
| 463 { | |
| 464 unsigned numberOfTouches = std::min(touches->length(), static_cast<unsigned>
(WebTouchEvent::touchesLengthCap)); | |
| 465 for (unsigned i = 0; i < numberOfTouches; ++i) { | |
| 466 const Touch* touch = touches->item(i); | |
| 467 | |
| 468 WebTouchPoint point; | |
| 469 point.id = touch->identifier(); | |
| 470 point.screenPosition = touch->screenLocation(); | |
| 471 point.position = convertAbsoluteLocationForRenderObjectFloat(touch->abso
luteLocation(), *renderObject); | |
| 472 point.radiusX = touch->radiusX(); | |
| 473 point.radiusY = touch->radiusY(); | |
| 474 point.rotationAngle = touch->rotationAngle(); | |
| 475 point.force = touch->force(); | |
| 476 point.state = toWebTouchPointState(touchType); | |
| 477 | |
| 478 touchPoints[i] = point; | |
| 479 } | |
| 480 *touchPointsLength = numberOfTouches; | |
| 481 } | |
| 482 | |
| 483 WebTouchEventBuilder::WebTouchEventBuilder(const Widget* widget, const RenderObj
ect* renderObject, const TouchEvent& event) | |
| 484 { | |
| 485 if (event.type() == EventTypeNames::touchstart) | |
| 486 type = TouchStart; | |
| 487 else if (event.type() == EventTypeNames::touchmove) | |
| 488 type = TouchMove; | |
| 489 else if (event.type() == EventTypeNames::touchend) | |
| 490 type = TouchEnd; | |
| 491 else if (event.type() == EventTypeNames::touchcancel) | |
| 492 type = TouchCancel; | |
| 493 else { | |
| 494 ASSERT_NOT_REACHED(); | |
| 495 type = Undefined; | |
| 496 return; | |
| 497 } | |
| 498 | |
| 499 modifiers = getWebInputModifiers(event); | |
| 500 timeStampSeconds = event.timeStamp() / millisPerSecond; | |
| 501 cancelable = event.cancelable(); | |
| 502 | |
| 503 addTouchPoints(widget, event.type(), event.touches(), touches, &touchesLengt
h, renderObject); | |
| 504 addTouchPoints(widget, event.type(), event.changedTouches(), changedTouches,
&changedTouchesLength, renderObject); | |
| 505 addTouchPoints(widget, event.type(), event.targetTouches(), targetTouches, &
targetTouchesLength, renderObject); | |
| 506 } | |
| 507 | |
| 508 WebGestureEventBuilder::WebGestureEventBuilder(const Widget* widget, const Rende
rObject* renderObject, const GestureEvent& event) | 372 WebGestureEventBuilder::WebGestureEventBuilder(const Widget* widget, const Rende
rObject* renderObject, const GestureEvent& event) |
| 509 { | 373 { |
| 510 if (event.type() == EventTypeNames::gestureshowpress) | 374 if (event.type() == EventTypeNames::gestureshowpress) |
| 511 type = GestureShowPress; | 375 type = GestureShowPress; |
| 512 else if (event.type() == EventTypeNames::gesturetapdown) | 376 else if (event.type() == EventTypeNames::gesturetapdown) |
| 513 type = GestureTapDown; | 377 type = GestureTapDown; |
| 514 else if (event.type() == EventTypeNames::gesturescrollstart) | 378 else if (event.type() == EventTypeNames::gesturescrollstart) |
| 515 type = GestureScrollBegin; | 379 type = GestureScrollBegin; |
| 516 else if (event.type() == EventTypeNames::gesturescrollend) | 380 else if (event.type() == EventTypeNames::gesturescrollend) |
| 517 type = GestureScrollEnd; | 381 type = GestureScrollEnd; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 528 modifiers = getWebInputModifiers(event); | 392 modifiers = getWebInputModifiers(event); |
| 529 | 393 |
| 530 globalX = event.screenX(); | 394 globalX = event.screenX(); |
| 531 globalY = event.screenY(); | 395 globalY = event.screenY(); |
| 532 IntPoint localPoint = convertAbsoluteLocationForRenderObject(event.absoluteL
ocation(), *renderObject); | 396 IntPoint localPoint = convertAbsoluteLocationForRenderObject(event.absoluteL
ocation(), *renderObject); |
| 533 x = localPoint.x(); | 397 x = localPoint.x(); |
| 534 y = localPoint.y(); | 398 y = localPoint.y(); |
| 535 } | 399 } |
| 536 | 400 |
| 537 } // namespace blink | 401 } // namespace blink |
| OLD | NEW |