hooks.dart 4.8 KB
Newer Older
A
Adam Barth 已提交
1 2 3 4
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

A
Adam Barth 已提交
5
part of dart.ui;
A
Adam Barth 已提交
6

7 8 9 10 11 12 13 14
String _decodeUTF8(ByteData message) {
  return message != null ? UTF8.decoder.convert(message.buffer.asUint8List()) : null;
}

dynamic _decodeJSON(String message) {
  return message != null ? JSON.decode(message) : null;
}

A
Adam Barth 已提交
15 16 17 18 19 20 21 22 23
void _updateWindowMetrics(double devicePixelRatio,
                          double width,
                          double height,
                          double top,
                          double right,
                          double bottom,
                          double left) {
  window
    .._devicePixelRatio = devicePixelRatio
A
Adam Barth 已提交
24
    .._physicalSize = new Size(width, height)
25
    .._padding = new WindowPadding._(
A
Adam Barth 已提交
26 27 28 29 30
      top: top, right: right, bottom: bottom, left: left);
  if (window.onMetricsChanged != null)
    window.onMetricsChanged();
}

31 32 33 34 35 36
void _updateLocale(String languageCode, String countryCode) {
  window._locale = new Locale(languageCode, countryCode);
  if (window.onLocaleChanged != null)
    window.onLocaleChanged();
}

37 38 39 40 41 42
void _updateSemanticsEnabled(bool enabled) {
  window._semanticsEnabled = enabled;
  if (window.onSemanticsEnabledChanged != null)
    window.onSemanticsEnabledChanged();
}

43 44 45 46 47 48 49 50 51 52 53 54 55
void _handleNavigationMessage(ByteData data) {
  if (window._defaultRouteName != null)
    return;
  try {
    final dynamic message = _decodeJSON(_decodeUTF8(data));
    final dynamic method = message['method'];
    if (method != 'pushRoute')
      return;
    final dynamic args = message['args'];
    window._defaultRouteName = args[0];
  } catch (e) {
    // We ignore any exception and just let the message be dispatched as usual.
  }
56 57
}

A
Adam Barth 已提交
58
void _dispatchPlatformMessage(String name, ByteData data, int responseId) {
59 60 61
  if (name == 'flutter/navigation')
    _handleNavigationMessage(data);

A
Adam Barth 已提交
62 63 64 65 66 67 68 69 70
  if (window.onPlatformMessage != null) {
    window.onPlatformMessage(name, data, (ByteData responseData) {
      window._respondToPlatformMessage(responseId, responseData);
    });
  } else {
    window._respondToPlatformMessage(responseId, null);
  }
}

71 72 73 74 75
void _dispatchPointerDataPacket(ByteData packet) {
  if (window.onPointerDataPacket != null)
    window.onPointerDataPacket(_unpackPointerDataPacket(packet));
}

76 77 78 79 80
void _dispatchSemanticsAction(int id, int action) {
  if (window.onSemanticsAction != null)
    window.onSemanticsAction(id, SemanticsAction.values[action]);
}

A
Adam Barth 已提交
81 82 83 84
void _beginFrame(int microseconds) {
  if (window.onBeginFrame != null)
    window.onBeginFrame(new Duration(microseconds: microseconds));
}
85

86 87 88 89
// If this value changes, update the encoding code in the following files:
//
//  * pointer_data.cc
//  * FlutterView.java
90 91 92 93 94 95 96
const int _kPointerDataFieldCount = 19;

PointerDataPacket _unpackPointerDataPacket(ByteData packet) {
  const int kStride = Int64List.BYTES_PER_ELEMENT;
  const int kBytesPerPointerData = _kPointerDataFieldCount * kStride;
  final int length = packet.lengthInBytes ~/ kBytesPerPointerData;
  assert(length * kBytesPerPointerData == packet.lengthInBytes);
97
  List<PointerData> data = new List<PointerData>(length);
98 99
  for (int i = 0; i < length; ++i) {
    int offset = i * _kPointerDataFieldCount;
100
    data[i] = new PointerData(
101 102 103
      timeStamp: new Duration(microseconds: packet.getInt64(kStride * offset++, _kFakeHostEndian)),
      change: PointerChange.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)],
      kind: PointerDeviceKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)],
104
      device: packet.getInt64(kStride * offset++, _kFakeHostEndian),
105 106 107 108 109 110 111 112 113 114 115 116 117 118
      physicalX: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      physicalY: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      buttons: packet.getInt64(kStride * offset++, _kFakeHostEndian),
      obscured: packet.getInt64(kStride * offset++, _kFakeHostEndian) != 0,
      pressure: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      pressureMin: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      pressureMax: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      distance: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      distanceMax: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      radiusMajor: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      radiusMinor: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      radiusMin: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      radiusMax: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
      orientation: packet.getFloat64(kStride * offset++, _kFakeHostEndian),
A
Adam Barth 已提交
119
      tilt: packet.getFloat64(kStride * offset++, _kFakeHostEndian)
120 121 122
    );
    assert(offset == (i + 1) * _kPointerDataFieldCount);
  }
123
  return new PointerDataPacket(data: data);
124
}