hooks.dart 7.7 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
String _decodeUTF8(ByteData message) {
8
  return message != null ? utf8.decoder.convert(message.buffer.asUint8List()) : null;
9 10 11
}

dynamic _decodeJSON(String message) {
12
  return message != null ? json.decode(message) : null;
13 14
}

15
@pragma('vm:entry-point')
A
Adam Barth 已提交
16 17 18
void _updateWindowMetrics(double devicePixelRatio,
                          double width,
                          double height,
19 20 21 22 23 24 25 26
                          double paddingTop,
                          double paddingRight,
                          double paddingBottom,
                          double paddingLeft,
                          double viewInsetTop,
                          double viewInsetRight,
                          double viewInsetBottom,
                          double viewInsetLeft) {
A
Adam Barth 已提交
27 28
  window
    .._devicePixelRatio = devicePixelRatio
A
Adam Barth 已提交
29
    .._physicalSize = new Size(width, height)
30
    .._padding = new WindowPadding._(
31 32 33 34
        top: paddingTop,
        right: paddingRight,
        bottom: paddingBottom,
        left: paddingLeft)
35
    .._viewInsets = new WindowPadding._(
36 37 38 39
        top: viewInsetTop,
        right: viewInsetRight,
        bottom: viewInsetBottom,
        left: viewInsetLeft);
Y
Yegor 已提交
40
  _invoke(window.onMetricsChanged, window._onMetricsChangedZone);
A
Adam Barth 已提交
41 42
}

43
typedef _LocaleClosure = String Function();
44 45 46

String _localeClosure() => window._locale.toString();

47
@pragma('vm:entry-point')
48
_LocaleClosure _getLocaleClosure() => _localeClosure;
49

50
@pragma('vm:entry-point')
51
void _updateLocale(String languageCode, String countryCode, String scriptCode, String variantCode) {
52
  window._locale = new Locale(languageCode, countryCode);
Y
Yegor 已提交
53
  _invoke(window.onLocaleChanged, window._onLocaleChangedZone);
54 55
}

56
@pragma('vm:entry-point')
57 58
void _updateUserSettingsData(String jsonData) {
  final Map<String, dynamic> data = json.decode(jsonData);
59 60 61 62
  _updateTextScaleFactor(data['textScaleFactor'].toDouble());
  _updateAlwaysUse24HourFormat(data['alwaysUse24HourFormat']);
}

63 64 65 66 67
void _updateTextScaleFactor(double textScaleFactor) {
  window._textScaleFactor = textScaleFactor;
  _invoke(window.onTextScaleFactorChanged, window._onTextScaleFactorChangedZone);
}

68 69 70 71
void _updateAlwaysUse24HourFormat(bool alwaysUse24HourFormat) {
  window._alwaysUse24HourFormat = alwaysUse24HourFormat;
}

72
@pragma('vm:entry-point')
73 74
void _updateSemanticsEnabled(bool enabled) {
  window._semanticsEnabled = enabled;
Y
Yegor 已提交
75
  _invoke(window.onSemanticsEnabledChanged, window._onSemanticsEnabledChangedZone);
76 77
}

78
@pragma('vm:entry-point')
79 80 81 82 83 84
void _updateAccessibilityFeatures(int values) {
  final AccessibilityFeatures newFeatures = new AccessibilityFeatures._(values);
  if (newFeatures == window._accessibilityFeatures)
    return;
  window._accessibilityFeatures = newFeatures;
  _invoke(window.onAccessibilityFeaturesChanged, window._onAccessibilityFlagsChangedZone);
85 86
}

87
@pragma('vm:entry-point')
A
Adam Barth 已提交
88 89
void _dispatchPlatformMessage(String name, ByteData data, int responseId) {
  if (window.onPlatformMessage != null) {
Y
Yegor 已提交
90 91 92 93 94 95 96 97 98
    _invoke3<String, ByteData, PlatformMessageResponseCallback>(
      window.onPlatformMessage,
      window._onPlatformMessageZone,
      name,
      data,
      (ByteData responseData) {
        window._respondToPlatformMessage(responseId, responseData);
      },
    );
A
Adam Barth 已提交
99 100 101 102 103
  } else {
    window._respondToPlatformMessage(responseId, null);
  }
}

104
@pragma('vm:entry-point')
105 106
void _dispatchPointerDataPacket(ByteData packet) {
  if (window.onPointerDataPacket != null)
Y
Yegor 已提交
107
    _invoke1<PointerDataPacket>(window.onPointerDataPacket, window._onPointerDataPacketZone, _unpackPointerDataPacket(packet));
108 109
}

110
@pragma('vm:entry-point')
111 112
void _dispatchSemanticsAction(int id, int action, ByteData args) {
  _invoke3<int, SemanticsAction, ByteData>(
Y
Yegor 已提交
113 114 115 116
    window.onSemanticsAction,
    window._onSemanticsActionZone,
    id,
    SemanticsAction.values[action],
117
    args,
Y
Yegor 已提交
118
  );
119 120
}

121
@pragma('vm:entry-point')
A
Adam Barth 已提交
122
void _beginFrame(int microseconds) {
Y
Yegor 已提交
123
  _invoke1<Duration>(window.onBeginFrame, window._onBeginFrameZone, new Duration(microseconds: microseconds));
A
Adam Barth 已提交
124
}
125

126
@pragma('vm:entry-point')
127
void _drawFrame() {
Y
Yegor 已提交
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
  _invoke(window.onDrawFrame, window._onDrawFrameZone);
}

/// Invokes [callback] inside the given [zone].
void _invoke(void callback(), Zone zone) {
  if (callback == null)
    return;

  assert(zone != null);

  if (identical(zone, Zone.current)) {
    callback();
  } else {
    zone.runGuarded(callback);
  }
}

/// Invokes [callback] inside the given [zone] passing it [arg].
void _invoke1<A>(void callback(A a), Zone zone, A arg) {
  if (callback == null)
    return;

  assert(zone != null);

  if (identical(zone, Zone.current)) {
    callback(arg);
  } else {
155
    zone.runUnaryGuarded<A>(callback, arg);
Y
Yegor 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168
  }
}

/// Invokes [callback] inside the given [zone] passing it [arg1] and [arg2].
void _invoke2<A1, A2>(void callback(A1 a1, A2 a2), Zone zone, A1 arg1, A2 arg2) {
  if (callback == null)
    return;

  assert(zone != null);

  if (identical(zone, Zone.current)) {
    callback(arg1, arg2);
  } else {
169
    zone.runBinaryGuarded<A1, A2>(callback, arg1, arg2);
Y
Yegor 已提交
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186
  }
}

/// Invokes [callback] inside the given [zone] passing it [arg1], [arg2] and [arg3].
void _invoke3<A1, A2, A3>(void callback(A1 a1, A2 a2, A3 a3), Zone zone, A1 arg1, A2 arg2, A3 arg3) {
  if (callback == null)
    return;

  assert(zone != null);

  if (identical(zone, Zone.current)) {
    callback(arg1, arg2, arg3);
  } else {
    zone.runGuarded(() {
      callback(arg1, arg2, arg3);
    });
  }
187 188
}

189 190 191 192
// If this value changes, update the encoding code in the following files:
//
//  * pointer_data.cc
//  * FlutterView.java
193 194 195
const int _kPointerDataFieldCount = 19;

PointerDataPacket _unpackPointerDataPacket(ByteData packet) {
196
  const int kStride = Int64List.bytesPerElement;
197 198 199
  const int kBytesPerPointerData = _kPointerDataFieldCount * kStride;
  final int length = packet.lengthInBytes ~/ kBytesPerPointerData;
  assert(length * kBytesPerPointerData == packet.lengthInBytes);
200
  final List<PointerData> data = new List<PointerData>(length);
201 202
  for (int i = 0; i < length; ++i) {
    int offset = i * _kPointerDataFieldCount;
203
    data[i] = new PointerData(
204 205 206
      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)],
207
      device: packet.getInt64(kStride * offset++, _kFakeHostEndian),
208 209 210 211 212 213 214 215 216 217 218 219 220 221
      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 已提交
222
      tilt: packet.getFloat64(kStride * offset++, _kFakeHostEndian)
223 224 225
    );
    assert(offset == (i + 1) * _kPointerDataFieldCount);
  }
226
  return new PointerDataPacket(data: data);
227
}