diff --git a/guacamole-common-js/src/main/resources/guacamole.js b/guacamole-common-js/src/main/resources/guacamole.js index 6afc25212..cf8e00f57 100644 --- a/guacamole-common-js/src/main/resources/guacamole.js +++ b/guacamole-common-js/src/main/resources/guacamole.js @@ -143,6 +143,42 @@ function GuacamoleClient(display, tunnel) { clipboardHandler = handler; }; + var readyCallback = null; + var busyLayers = 0; + + function layerBusy() { busyLayers++; } + function layerReady() { + busyLayers--; + if (readyCallback != null) + readyCallback(); + } + + function sendReady() { + + // If ready, send ready message + if (busyLayers == 0) { + tunnel.sendMessage("ready;"); + } + + // If not ready, queue message for when ready + else if (readyCallback == null) { + readyCallback = function() { + tunnel.sendMessage("ready;"); + readyCallback = null; + } + } + + } + + function getTrackedLayer(w, h) { + var layer = new Layer(w, h); + + layer.setBusyHandler(layerBusy); + layer.setReadyHandler(layerReady); + + return layer; + } + // Layers var displayWidth = 0; var displayHeight = 0; @@ -165,7 +201,7 @@ function GuacamoleClient(display, tunnel) { // Create buffer if necessary if (buffer == null) { - buffer = new Layer(0, 0); + buffer = new Layer(0, 0); // Untracked buffer.setAutosize(1); buffers[index] = buffer; } @@ -180,7 +216,7 @@ function GuacamoleClient(display, tunnel) { if (layer == null) { // Add new layer - layer = new Layer(displayWidth, displayHeight); + layer = getTrackedLayer(displayWidth, displayHeight); layers[index] = layer; // (Re)-add existing layers in order @@ -220,6 +256,10 @@ function GuacamoleClient(display, tunnel) { if (errorHandler) errorHandler(tunnel.unescapeGuacamoleString(parameters[0])); }, + "ready": function(parameters) { + sendReady(); + }, + "name": function(parameters) { if (nameHandler) nameHandler(tunnel.unescapeGuacamoleString(parameters[0])); }, @@ -292,7 +332,7 @@ function GuacamoleClient(display, tunnel) { var data = parameters[2]; if (cursor == null) { - cursor = new Layer(displayWidth, displayHeight); + cursor = getTrackedLayer(displayWidth, displayHeight); display.appendChild(cursor); } diff --git a/guacamole-common-js/src/main/resources/layer.js b/guacamole-common-js/src/main/resources/layer.js index 8ace45238..b670e96ed 100644 --- a/guacamole-common-js/src/main/resources/layer.js +++ b/guacamole-common-js/src/main/resources/layer.js @@ -68,7 +68,9 @@ function Layer(width, height) { resize(width, height); + var busyHandler = null; var readyHandler = null; + var updates = new Array(); var autosize = 0; @@ -131,6 +133,10 @@ function Layer(width, height) { readyHandler = handler; }; + display.setBusyHandler = function(handler) { + busyHandler = handler; + }; + display.drawImage = function(x, y, image) { reserveJob(function() { @@ -141,6 +147,11 @@ function Layer(width, height) { display.draw = function(x, y, url) { + + // If about to become busy, call busy handler + if (display.isReady() && busyHandler != null) + busyHandler(); + var update = reserveJob(null); var image = new Image();