Chromium Code Reviews| Index: runtime/embedders/openglui/common/gl.dart |
| =================================================================== |
| --- runtime/embedders/openglui/common/gl.dart (revision 19665) |
| +++ runtime/embedders/openglui/common/gl.dart (working copy) |
| @@ -67,8 +67,24 @@ |
| // Event handling. This is very kludgy for now, especially the |
| // bare-bones Stream stuff! |
| +class EventTarget extends Object { |
|
vsm
2013/03/08 17:49:35
Nit: Don't need "extends Object".
gram
2013/03/11 21:25:08
Done.
|
| + bool dispatchEvent(Event event) { |
| + if (!_listeners.containsKey(this)) return false; |
| + var listeners = _listeners[this]; |
| + if (!listeners.containsKey(event.type)) return false; |
| + var event_listeners = listeners[event.type]; |
|
vsm
2013/03/08 17:49:35
event_listeners -> eventListeners per style guide
|
| + for (var i = 0; i < event_listeners.length; i++) { |
|
vsm
2013/03/08 17:49:35
Just iterate directly:
for (var eventListener in e
gram
2013/03/11 21:25:08
Will do, but is there a perf implication? I know t
|
| + if (event_listeners[i] != null) { |
| + event_listeners[i](event); |
| + } |
| + } |
| + return true; |
| + } |
| +} |
| + |
| class Event { |
| final String type; |
| + EventTarget target; |
| Event(String type) : this.type = type; |
| } |
| @@ -102,11 +118,11 @@ |
| typedef void EventListener(Event event); |
| -Map<String,List<Function>> _listeners = new Map(); |
| +Map<EventTarget, Map<String, List<Function>>> _listeners = new Map(); |
|
vsm
2013/03/08 17:49:35
Function -> EventListener ?
This might also be cl
gram
2013/03/11 21:25:08
Done.
|
| class _EventStreamSubscription<T extends Event> extends StreamSubscription<T> { |
| int _pauseCount = 0; |
| - Object _target; |
| + EventTarget _target; |
| final String _eventType; |
| var _onData; |
| @@ -171,10 +187,14 @@ |
| void _tryResume() { |
| if (_onData != null && !_paused) { |
| - if (!_listeners.containsKey(_eventType)) { |
| - _listeners[_eventType] = new List(); |
| + if (!_listeners.containsKey(_target)) { |
| + _listeners[_target] = new Map(); |
| } |
| - var event_listeners = _listeners[_eventType]; |
| + var listeners = _listeners[_target]; |
| + if (!listeners.containsKey(_eventType)) { |
| + listeners[_eventType] = new List(); |
| + } |
| + var event_listeners = listeners[_eventType]; |
| for (var i = 0; i < event_listeners.length; i++) { |
| if (event_listeners[i] == null) { |
| event_listeners[i] = _onData; |
| @@ -187,12 +207,15 @@ |
| void _unlisten() { |
| if (_onData != null) { |
| - if (!_listeners.containsKey(_eventType)) { |
| - var event_listeners = _listeners[_eventType]; |
| - for (var i = 0; i < event_listeners.length; i++) { |
| - if (event_listeners[i] == _onData) { |
| - event_listeners[i] = null; |
| - break; |
| + if (_listeners.containsKey(_target)) { |
| + var listeners = _listeners[_target]; |
| + if (listeners.containsKey(_eventType)) { |
| + var event_listeners = listeners[_eventType]; |
| + for (var i = 0; i < event_listeners.length; i++) { |
| + if (event_listeners[i] == _onData) { |
| + event_listeners[i] = null; |
| + break; |
| + } |
| } |
| } |
| } |
| @@ -220,7 +243,7 @@ |
| } |
| } |
| -class Node { |
| +class Node extends EventTarget { |
| Stream<KeyEvent> get onKeyDown => new _EventStream(this, 'keydown'); |
| Stream<KeyEvent> get onKeyUp => new _EventStream(this, 'keyup'); |
| Stream<MouseEvent> get onMouseDown => new _EventStream(this, 'mousedown'); |
| @@ -229,22 +252,25 @@ |
| } |
| // TODO(gram): If we support more than one on-screen canvas, we will |
| -// need to filter dispatched events by the target Node. |
| -_dispatchEvent(String event_type, Event e) { |
| - if (!_listeners.containsKey(event_type)) return; |
| - var event_listeners = _listeners[event_type]; |
| - for (var i = 0; i < event_listeners.length; i++) { |
| - if (event_listeners[i] != null) { |
| - event_listeners[i](e); |
| +// need to filter dispatched mouse and key events by the target Node |
| +// with more granularity; right now we just iterate through DOM nodes which should |
|
vsm
2013/03/08 17:49:35
line len
gram
2013/03/11 21:25:08
Done.
|
| +// just be the one canvas. |
|
vsm
2013/03/08 17:49:35
Should the code assert that there is just one canv
gram
2013/03/11 21:25:08
Done.
|
| +_dispatchEvent(Event event) { |
| + for (var target in document.body.nodes) { |
| + event.target = target; |
| + if (target.dispatchEvent(event)) { |
| + break; |
| } |
| } |
| } |
| -_dispatchKeyEvent(String type, int keyCode, bool alt, bool ctrl, bool shift) => |
| - _dispatchEvent(type, new KeyEvent(type, keyCode, alt, ctrl, shift)); |
| +_dispatchKeyEvent(String type, int keyCode, bool alt, bool ctrl, bool shift) { |
| + _dispatchEvent(new KeyEvent(type, keyCode, alt, ctrl, shift)); |
| +} |
| -_dispatchMouseEvent(String type, double x, double y) => |
| - _dispatchEvent(type, new MouseEvent(type, x.toInt(), y.toInt())); |
| +_dispatchMouseEvent(String type, double x, double y) { |
| + _dispatchEvent(new MouseEvent(type, x.toInt(), y.toInt())); |
| +} |
| // These next few are called by vmglue.cc. |
| onKeyDown_(int when, int keyCode, bool alt, bool ctrl, bool shift, int repeat) |
| @@ -607,15 +633,9 @@ |
| void C2DCreateNativeContext(int handle, int width, int height) |
| native "C2DCreateNativeContext"; |
| -class ElementEvents { |
| - final List load; |
| - ElementEvents() |
| - : load =new List() { |
| - } |
| -} |
| +class ImageElement extends Node { |
| + Stream<Event> get onLoad => new _EventStream(this, 'load'); |
| -class ImageElement { |
| - ElementEvents on; |
| String _src; |
| int _width; |
| int _height; |
| @@ -623,9 +643,9 @@ |
| get src => _src; |
| set src(String v) { |
| _src = v; |
| - for (var e in on.load) { |
| - e(this); |
| - } |
| + var e = new Event('load'); |
| + e.target = this; |
| + dispatchEvent(e); |
| } |
| get width => _width; |
| @@ -635,8 +655,7 @@ |
| set height(int heightp) => _height = heightp; |
| ImageElement({String srcp, int widthp, int heightp}) |
| - : on = new ElementEvents(), |
| - _src = srcp, |
| + : _src = srcp, |
| _width = widthp, |
| _height = heightp { |
| } |