From d3ba5b8111861563f2ab219910446fe0ab23f18e Mon Sep 17 00:00:00 2001 From: Fabian Jakobs Date: Fri, 25 Nov 2011 17:20:33 +0100 Subject: [PATCH] fix embedding multiple ace editors fix #492 --- lib/ace/lib/event.js | 28 +++++++++++++++++++++++++--- lib/ace/renderloop.js | 33 ++++----------------------------- 2 files changed, 29 insertions(+), 32 deletions(-) diff --git a/lib/ace/lib/event.js b/lib/ace/lib/event.js index 9ac37b79..f8094417 100644 --- a/lib/ace/lib/event.js +++ b/lib/ace/lib/event.js @@ -183,9 +183,9 @@ exports.addMouseWheelListener = function(el, callback) { max = Math.abs(e.wheelDeltaY) if (max > 5000) - factor = 400; + var factor = 400; else - factor = 8; + var factor = 8; if (e.wheelDeltaX !== undefined) { e.wheelX = -e.wheelDeltaX / factor; @@ -259,7 +259,7 @@ function normalizeCommandKeys(callback, e, keyCode) { break; case "Shift": hashId = 4; - break + break; case "Ctrl": hashId = 1; break; @@ -321,4 +321,26 @@ exports.addCommandKeyListener = function(el, callback) { } }; +if (window.postMessage) { + var postMessageId = 1; + this.nextTick = function(callback, win) { + win = win || window; + var messageName = "zero-timeout-message-" + postMessageId; + exports.addListener(win, "message", function listener(e) { + if (e.data == messageName) { + exports.stopPropagation(e); + exports.removeListener(win, "message", listener); + callback(); + } + }); + win.postMessage(messageName, "*"); + }; +} +else { + this.nextTick = function(callback, win) { + win = win || window; + window.setTimeout(callback, 0); + }; +} + }); diff --git a/lib/ace/renderloop.js b/lib/ace/renderloop.js index de3cd496..4556f705 100644 --- a/lib/ace/renderloop.js +++ b/lib/ace/renderloop.js @@ -40,11 +40,11 @@ define(function(require, exports, module) { var event = require("./lib/event"); -var RenderLoop = function(onRender, window) { +var RenderLoop = function(onRender, win) { this.onRender = onRender; this.pending = false; this.changes = 0; - this.setTimeoutZero = this.setTimeoutZero.bind(window); + this.window = win || window; }; (function() { @@ -56,40 +56,15 @@ var RenderLoop = function(onRender, window) { if (!this.pending) { this.pending = true; var _self = this; - this.setTimeoutZero(function() { + event.nextTick(function() { _self.pending = false; var changes = _self.changes; _self.changes = 0; _self.onRender(changes); - }); + }, this.window); } }; - if (window.postMessage) { - this.setTimeoutZero = (function(messageName, attached, listener) { - return function setTimeoutZero(callback) { - // Set up listener if not listening already. - if (!attached) { - event.addListener(this, "message", function(e) { - if (listener && e.data == messageName) { - event.stopPropagation(e); - listener(); - } - }); - attached = true; - } - - listener = callback; - this.postMessage(messageName, "*"); - }; - })("zero-timeout-message", false, null); - } - else { - this.setTimeoutZero = function(callback) { - this.setTimeout(callback, 0); - }; - } - }).call(RenderLoop.prototype); exports.RenderLoop = RenderLoop;