Commit 480c5ae4 authored by Jason Simmons's avatar Jason Simmons

Receive pointer events through PointerPackets

parent fa414714
...@@ -72,4 +72,32 @@ class PointerInputEvent extends InputEvent { ...@@ -72,4 +72,32 @@ class PointerInputEvent extends InputEvent {
final double tilt; final double tilt;
ui.Point get position => new ui.Point(x, y); ui.Point get position => new ui.Point(x, y);
String toString() => 'PointerInputEvent(x: $x, y:$y)';
String toStringFull() {
return "PointerInputEvent(" +
"pointer: $pointer, " +
"kind: $kind, " +
"x: $x, " +
"y: $y, " +
"dx: $dx, " +
"dy: $dy, " +
"buttons: $buttons, " +
"down: $down, " +
"primary: $primary, " +
"obscured: $obscured, " +
"pressure: $pressure, " +
"pressureMin: $pressureMin, " +
"pressureMax: $pressureMax, " +
"distance: $distance, " +
"distanceMin: $distanceMin, " +
"distanceMax: $distanceMax, " +
"radiusMajor: $radiusMajor, " +
"radiusMinor: $radiusMinor, " +
"radiusMin: $radiusMin, " +
"radiusMax: $radiusMax, " +
"orientation: $orientation, " +
"tilt: $tilt)";
}
} }
...@@ -2,11 +2,15 @@ ...@@ -2,11 +2,15 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:typed_data';
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/animation.dart'; import 'package:flutter/animation.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:mojo/bindings.dart' as bindings;
import 'package:mojo/core.dart' as core;
import 'package:sky_services/pointer/pointer.mojom.dart';
import 'box.dart'; import 'box.dart';
import 'hit_test.dart'; import 'hit_test.dart';
...@@ -35,46 +39,42 @@ class BindingHitTestEntry extends HitTestEntry { ...@@ -35,46 +39,42 @@ class BindingHitTestEntry extends HitTestEntry {
final HitTestResult result; final HitTestResult result;
} }
/// State used in converting ui.Event to InputEvent /// State used in converting PointerPackets to PointerInputEvents
class _PointerState { class _PointerState {
_PointerState({ this.pointer, this.lastPosition }); _PointerState({ this.pointer, this.lastPosition });
int pointer; int pointer;
Point lastPosition; Point lastPosition;
} }
class _UiEventConverter { class _PointerEventConverter {
static InputEvent convert(ui.Event event) {
if (event is ui.PointerEvent)
return convertPointerEvent(event);
// Default event
return new InputEvent(
type: event.type,
timeStamp: event.timeStamp
);
}
// Map actual input pointer value to a unique value // Map actual input pointer value to a unique value
// Since events are serialized we can just use a counter // Since events are serialized we can just use a counter
static Map<int, _PointerState> _stateForPointer = new Map<int, _PointerState>(); static Map<int, _PointerState> _stateForPointer = new Map<int, _PointerState>();
static int _pointerCount = 0; static int _pointerCount = 0;
static PointerInputEvent convertPointerEvent(ui.PointerEvent event) { static List<PointerInputEvent> convertPointerPacket(PointerPacket packet) {
Point position = new Point(event.x, event.y); return packet.pointers.map(_convertPointer).toList();
}
_PointerState state = _stateForPointer[event.pointer]; static PointerInputEvent _convertPointer(Pointer pointer) {
Point position = new Point(pointer.x, pointer.y);
_PointerState state = _stateForPointer[pointer.pointer];
double dx = 0.0; double dx = 0.0;
double dy = 0.0; double dy = 0.0;
switch (event.type) { String eventType;
case 'pointerdown': switch (pointer.type) {
case PointerType.DOWN:
eventType = 'pointerdown';
if (state == null) { if (state == null) {
state = new _PointerState(lastPosition: position); state = new _PointerState(lastPosition: position);
_stateForPointer[event.pointer] = state; _stateForPointer[pointer.pointer] = state;
} }
state.pointer = _pointerCount; state.pointer = _pointerCount;
_pointerCount++; _pointerCount++;
break; break;
case 'pointermove': case PointerType.MOVE:
eventType = 'pointermove';
// state == null means the pointer is hovering // state == null means the pointer is hovering
if (state != null) { if (state != null) {
dx = position.x - state.lastPosition.x; dx = position.x - state.lastPosition.x;
...@@ -82,47 +82,58 @@ class _UiEventConverter { ...@@ -82,47 +82,58 @@ class _UiEventConverter {
state.lastPosition = position; state.lastPosition = position;
} }
break; break;
case 'pointerup': case PointerType.UP:
case 'pointercancel': case PointerType.CANCEL:
eventType = (pointer.type == PointerType.UP) ? 'pointerup' : 'pointercancel';
// state == null indicates spurious events // state == null indicates spurious events
if (state != null) { if (state != null) {
// Only remove the pointer state when the last button has been released. // Only remove the pointer state when the last button has been released.
if (_hammingWeight(event.buttons) <= 1) if (_hammingWeight(pointer.buttons) <= 1)
_stateForPointer.remove(event.pointer); _stateForPointer.remove(pointer.pointer);
} }
break; break;
} }
int pointer = (state == null) ? event.pointer : state.pointer; int pointerIndex = (state == null) ? pointer.pointer : state.pointer;
return new PointerInputEvent( return new PointerInputEvent(
type: event.type, type: eventType,
timeStamp: event.timeStamp, timeStamp: pointer.timeStamp.toDouble(),
pointer: pointer, pointer: pointerIndex,
kind: event.kind, kind: _mapPointerKindToString(pointer.kind),
x: event.x, x: pointer.x,
y: event.y, y: pointer.y,
dx: dx, dx: dx,
dy: dy, dy: dy,
buttons: event.buttons, buttons: pointer.buttons,
down: event.down, down: pointer.down,
primary: event.primary, primary: pointer.primary,
obscured: event.obscured, obscured: pointer.obscured,
pressure: event.pressure, pressure: pointer.pressure,
pressureMin: event.pressureMin, pressureMin: pointer.pressureMin,
pressureMax: event.pressureMax, pressureMax: pointer.pressureMax,
distance: event.distance, distance: pointer.distance,
distanceMin: event.distanceMin, distanceMin: pointer.distanceMin,
distanceMax: event.distanceMax, distanceMax: pointer.distanceMax,
radiusMajor: event.radiusMajor, radiusMajor: pointer.radiusMajor,
radiusMinor: event.radiusMinor, radiusMinor: pointer.radiusMinor,
radiusMin: event.radiusMin, radiusMin: pointer.radiusMin,
radiusMax: event.radiusMax, radiusMax: pointer.radiusMax,
orientation: event.orientation, orientation: pointer.orientation,
tilt: event.tilt tilt: pointer.tilt
); );
} }
static String _mapPointerKindToString(PointerKind kind) {
switch (kind) {
case PointerKind.TOUCH:
return 'touch';
case PointerKind.MOUSE:
return 'mouse';
case PointerKind.STYLUS:
return 'stylus';
}
}
} }
/// The glue between the render tree and the Flutter engine /// The glue between the render tree and the Flutter engine
...@@ -133,6 +144,7 @@ class FlutterBinding extends HitTestTarget { ...@@ -133,6 +144,7 @@ class FlutterBinding extends HitTestTarget {
_instance = this; _instance = this;
ui.window.onEvent = _handleEvent; ui.window.onEvent = _handleEvent;
ui.window.onPointerPacket = _handlePointerPacket;
ui.window.onMetricsChanged = _handleMetricsChanged; ui.window.onMetricsChanged = _handleMetricsChanged;
if (renderViewOverride == null) { if (renderViewOverride == null) {
...@@ -192,14 +204,22 @@ class FlutterBinding extends HitTestTarget { ...@@ -192,14 +204,22 @@ class FlutterBinding extends HitTestTarget {
/// Stops calling listener for every event that isn't localized to a given view coordinate /// Stops calling listener for every event that isn't localized to a given view coordinate
bool removeEventListener(EventListener listener) => _eventListeners.remove(listener); bool removeEventListener(EventListener listener) => _eventListeners.remove(listener);
void _handleEvent(ui.Event event) { void _handleEvent(String eventType, double timeStamp) {
InputEvent ourEvent = _UiEventConverter.convert(event); assert(eventType == 'back');
if (ourEvent is PointerInputEvent) { InputEvent ourEvent = new InputEvent(
_handlePointerInputEvent(ourEvent); type: eventType,
} else { timeStamp: timeStamp
assert(event.type == 'back'); );
for (EventListener listener in _eventListeners) for (EventListener listener in _eventListeners)
listener(ourEvent); listener(ourEvent);
}
void _handlePointerPacket(ByteData serializedPacket) {
bindings.Message message = new bindings.Message(
serializedPacket, <core.MojoHandle>[]);
PointerPacket packet = PointerPacket.deserialize(message);
for (PointerInputEvent event in _PointerEventConverter.convertPointerPacket(packet)) {
_handlePointerInputEvent(event);
} }
} }
......
...@@ -6,8 +6,8 @@ homepage: http://flutter.io ...@@ -6,8 +6,8 @@ homepage: http://flutter.io
dependencies: dependencies:
intl: '>=0.12.4+2 <0.13.0' intl: '>=0.12.4+2 <0.13.0'
material_design_icons: '>=0.0.3 <0.1.0' material_design_icons: '>=0.0.3 <0.1.0'
sky_engine: 0.0.49 sky_engine: 0.0.50
sky_services: 0.0.50 sky_services: 0.0.51
vector_math: '>=1.4.3 <2.0.0' vector_math: '>=1.4.3 <2.0.0'
cassowary: cassowary:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment