Index: sky/sdk/lib/framework/scheduler.dart |
diff --git a/sky/sdk/lib/framework/scheduler.dart b/sky/sdk/lib/framework/scheduler.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9c2f181c5c754d4a24ec70d7ae9949bc60b9be5d |
--- /dev/null |
+++ b/sky/sdk/lib/framework/scheduler.dart |
@@ -0,0 +1,61 @@ |
+// 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. |
+ |
+import 'dart:async'; |
+import 'dart:sky' as sky; |
+ |
+typedef void Callback(double timeStamp); |
+ |
+bool _haveScheduledVisualUpdate = false; |
+int _nextCallbackId = 1; |
+ |
+final List<Callback> _persistentCallbacks = new List<Callback>(); |
+Map<int, Callback> _transientCallbacks = new Map<int, Callback>(); |
+ |
+void _beginFrame(double timeStamp) { |
+ _haveScheduledVisualUpdate = false; |
+ |
+ Map<int, Callback> callbacks = _transientCallbacks; |
+ _transientCallbacks = new Map<int, Callback>(); |
+ |
+ callbacks.forEach((id, callback) { |
+ callback(timeStamp); |
+ }); |
+ |
+ for (Callback callback in _persistentCallbacks) |
+ callback(timeStamp); |
+} |
+ |
+void init() { |
+ assert(sky.window == null); |
+ sky.view.setBeginFrameCallback(_beginFrame); |
+} |
+ |
+void addPersistentFrameCallback(Callback callback) { |
+ assert(sky.window == null); |
+ _persistentCallbacks.add(callback); |
+} |
+ |
+int requestAnimationFrame(Callback callback) { |
+ if (sky.window != null) |
+ return sky.window.requestAnimationFrame(callback); |
+ int id = _nextCallbackId++; |
+ _transientCallbacks[id] = callback; |
+ ensureVisualUpdate(); |
+ return id; |
+} |
+ |
+void cancelAnimationFrame(int id) { |
+ if (sky.window != null) |
+ return sky.window.cancelAnimationFrame(id); |
+ _transientCallbacks.remove(id); |
+} |
+ |
+void ensureVisualUpdate() { |
+ assert(sky.window == null); |
+ if (_haveScheduledVisualUpdate) |
+ return; |
+ sky.view.scheduleFrame(); |
+ _haveScheduledVisualUpdate = true; |
+} |