Merge remote branch 'upstream/master'

Conflicts:
	include/canvas.js
	include/rfb.js
	include/util.js
	vnc.html
This commit is contained in:
primalmotion 2010-08-03 10:11:03 +02:00
commit 5e5d81dd86
11 changed files with 1629 additions and 1526 deletions

View File

@ -195,7 +195,7 @@ The client is designed to be easily integrated with existing web
structure and style. structure and style.
At a minimum you must include the `vnc.js` and `default_controls.js` At a minimum you must include the `vnc.js` and `default_controls.js`
scripts and call their load() functions. For example: scripts and call DefaultControls.load(). For example:
<head> <head>
<script src='include/vnc.js'></script> <script src='include/vnc.js'></script>
@ -203,12 +203,13 @@ scripts and call their load() functions. For example:
</head> </head>
<body> <body>
<div id='vnc'>Loading</div> <div id='vnc'>Loading</div>
</body>
<script> <script>
window.onload = function () { window.onload = function () {
DefaultControls.load('vnc'); DefaultControls.load('vnc');
RFB.load(); }; }
</script> </script>
</body>
See `vnc.html` and `vnc_auto.html` for examples. The file See `vnc.html` and `vnc_auto.html` for examples. The file
`include/plain.css` has a list of stylable elements. `include/plain.css` has a list of stylable elements.

View File

@ -10,38 +10,22 @@ Short Term:
- Test on IE 9 preview 3. - Test on IE 9 preview 3.
- Possibly support IE <= 8.0 using excanvas or fxcanvas:
http://excanvas.sourceforge.net/
http://code.google.com/p/fxcanvas/
- Fix cursor URI detection in Arora: - Fix cursor URI detection in Arora:
- allows data URI, but doesn't actually work - allows data URI, but doesn't actually work
Medium Term: Medium Term:
- Viewport and/or scaling support. - Viewport support
- Status bar buttons: - Status bar menu/buttons:
- Isolate menu UI in DefaultControls.js
- Icons in status area upper left
- Dialogs float over canvas
- Turn off events while menu open (but still update display)
- Explanatory hover text over buttons - Explanatory hover text over buttons
- Connect/disconnect button
- Configuration menu: - Configuration menu:
- Store in cookies - Tunable: speed vs. bandwidth selection
- Items (move to public settings): - Tunable: CPU use versus latency.
- Host
- Port
- Password
- Encrypt
- TrueColor
- speed vs. bandwidth selection
- b64encoding
- shared mode - shared mode
- Scaling
- Keyboard menu: - Keyboard menu:
- Ctrl Lock, Alt Lock, SysRq Lock - Ctrl Lock, Alt Lock, SysRq Lock
@ -50,10 +34,6 @@ Medium Term:
- Clipboard button -> popup: - Clipboard button -> popup:
- text, clear and send buttons - text, clear and send buttons
- password popup:
- when none set, but password required
- session only, should not store in cookie
Longer Term: Longer Term:

File diff suppressed because it is too large Load Diff

View File

@ -6,6 +6,7 @@
* See README.md for usage and integration instructions. * See README.md for usage and integration instructions.
*/ */
"use strict"; "use strict";
/*jslint white: false */
/*global $, Util, RFB, Canvas, VNC_uri_prefix, Element, Fx */ /*global $, Util, RFB, Canvas, VNC_uri_prefix, Element, Fx */
var DefaultControls = { var DefaultControls = {
@ -16,10 +17,6 @@ settingsOpen : false,
load: function(target) { load: function(target) {
var html, i, DC = DefaultControls, sheet, sheets, llevels; var html, i, DC = DefaultControls, sheet, sheets, llevels;
/* Handle state updates */
RFB.setUpdateState(DC.updateState);
RFB.setClipboardReceive(DC.clipReceive);
/* Populate the 'target' DOM element with default controls */ /* Populate the 'target' DOM element with default controls */
if (!target) { target = 'vnc'; } if (!target) { target = 'vnc'; }
@ -61,7 +58,7 @@ load: function(target) {
html += ' <option value="default">default</option>'; html += ' <option value="default">default</option>';
sheet = Util.selectStylesheet(); sheet = Util.selectStylesheet();
sheets = Util.getStylesheets(); sheets = Util.getStylesheets();
for (i = 0; i < sheets.length; i++) { for (i = 0; i < sheets.length; i += 1) {
html += '<option value="' + sheets[i].title + '">' + sheets[i].title + '</option>'; html += '<option value="' + sheets[i].title + '">' + sheets[i].title + '</option>';
} }
html += ' </select> Style</li>'; html += ' </select> Style</li>';
@ -69,7 +66,7 @@ load: function(target) {
// Logging selection dropdown // Logging selection dropdown
html += ' <li><select id="VNC_logging" name="vncLogging">'; html += ' <li><select id="VNC_logging" name="vncLogging">';
llevels = ['error', 'warn', 'info', 'debug']; llevels = ['error', 'warn', 'info', 'debug'];
for (i = 0; i < llevels.length; i++) { for (i = 0; i < llevels.length; i += 1) {
html += '<option value="' + llevels[i] + '">' + llevels[i] + '</option>'; html += '<option value="' + llevels[i] + '">' + llevels[i] + '</option>';
} }
html += ' </select> Logging</li>'; html += ' </select> Logging</li>';
@ -107,6 +104,8 @@ load: function(target) {
DC.initSetting('logging', 'warn'); DC.initSetting('logging', 'warn');
Util.init_logging(DC.getSetting('logging')); Util.init_logging(DC.getSetting('logging'));
DC.initSetting('stylesheet', 'default'); DC.initSetting('stylesheet', 'default');
Util.selectStylesheet(null); // call twice to get around webkit bug
Util.selectStylesheet(DC.getSetting('stylesheet')); Util.selectStylesheet(DC.getSetting('stylesheet'));
/* Populate the controls if defaults are provided in the URL */ /* Populate the controls if defaults are provided in the URL */
@ -118,12 +117,19 @@ load: function(target) {
DC.initSetting('true_color', true); DC.initSetting('true_color', true);
DC.initSetting('cursor', true); DC.initSetting('cursor', true);
$('VNC_screen').onmousemove = function () { DC.rfb = RFB({'target': 'VNC_canvas',
'updateState': DC.updateState,
'clipboardReceive': DC.clipReceive});
DC.rfb.init();
// Unfocus clipboard when over the VNC area // Unfocus clipboard when over the VNC area
if (! Canvas.focused) { $('VNC_screen').onmousemove = function () {
var canvas = DC.rfb.get_canvas();
if ((! canvas) || (! canvas.get_focused())) {
$('VNC_clipboard_text').blur(); $('VNC_clipboard_text').blur();
} }
}; };
}, },
// Read form control compatible setting from cookie // Read form control compatible setting from cookie
@ -154,7 +160,7 @@ updateSetting: function(name, value) {
if (ctrl.type === 'checkbox') { if (ctrl.type === 'checkbox') {
ctrl.checked = value; ctrl.checked = value;
} else if (typeof ctrl.options !== 'undefined') { } else if (typeof ctrl.options !== 'undefined') {
for (i = 0; i < ctrl.options.length; i++) { for (i = 0; i < ctrl.options.length; i += 1) {
if (ctrl.options[i].value === value) { if (ctrl.options[i].value === value) {
ctrl.selectedIndex = i; ctrl.selectedIndex = i;
break; break;
@ -176,7 +182,7 @@ saveSetting: function(name) {
val = ctrl.value; val = ctrl.value;
} }
Util.createCookie(name, val); Util.createCookie(name, val);
Util.Debug("Setting saved '" + name + "=" + val + "'"); //Util.Debug("Setting saved '" + name + "=" + val + "'");
return val; return val;
}, },
@ -190,7 +196,7 @@ initSetting: function(name, defVal) {
val = Util.readCookie(name, defVal); val = Util.readCookie(name, defVal);
} }
DefaultControls.updateSetting(name, val); DefaultControls.updateSetting(name, val);
Util.Debug("Setting '" + name + "' initialized to '" + val + "'"); //Util.Debug("Setting '" + name + "' initialized to '" + val + "'");
return val; return val;
}, },
@ -208,7 +214,7 @@ clickSettingsMenu: function() {
DC.updateSetting('encrypt'); DC.updateSetting('encrypt');
DC.updateSetting('base64'); DC.updateSetting('base64');
DC.updateSetting('true_color'); DC.updateSetting('true_color');
if (Canvas.isCursor()) { if (DC.rfb.get_canvas().get_cursor_uri()) {
DC.updateSetting('cursor'); DC.updateSetting('cursor');
} else { } else {
DC.updateSetting('cursor', false); DC.updateSetting('cursor', false);
@ -235,10 +241,11 @@ closeSettingsMenu: function() {
// Disable/enable controls depending on connection state // Disable/enable controls depending on connection state
settingsDisabled: function(disabled) { settingsDisabled: function(disabled) {
var DC = DefaultControls;
$('VNC_encrypt').disabled = disabled; $('VNC_encrypt').disabled = disabled;
$('VNC_base64').disabled = disabled; $('VNC_base64').disabled = disabled;
$('VNC_true_color').disabled = disabled; $('VNC_true_color').disabled = disabled;
if (Canvas.isCursor()) { if (DC.rfb && DC.rfb.get_canvas().get_cursor_uri()) {
$('VNC_cursor').disabled = disabled; $('VNC_cursor').disabled = disabled;
} else { } else {
DefaultControls.updateSetting('cursor', false); DefaultControls.updateSetting('cursor', false);
@ -248,12 +255,12 @@ settingsDisabled: function(disabled) {
// Save/apply settings when 'Apply' button is pressed // Save/apply settings when 'Apply' button is pressed
settingsApply: function() { settingsApply: function() {
Util.Debug(">> settingsApply"); //Util.Debug(">> settingsApply");
var DC = DefaultControls; var DC = DefaultControls;
DC.saveSetting('encrypt'); DC.saveSetting('encrypt');
DC.saveSetting('base64'); DC.saveSetting('base64');
DC.saveSetting('true_color'); DC.saveSetting('true_color');
if (Canvas.isCursor()) { if (DC.rfb.get_canvas().get_cursor_uri()) {
DC.saveSetting('cursor'); DC.saveSetting('cursor');
} }
DC.saveSetting('stylesheet'); DC.saveSetting('stylesheet');
@ -263,21 +270,21 @@ settingsApply: function() {
Util.selectStylesheet(DC.getSetting('stylesheet')); Util.selectStylesheet(DC.getSetting('stylesheet'));
Util.init_logging(DC.getSetting('logging')); Util.init_logging(DC.getSetting('logging'));
Util.Debug("<< settingsApply"); //Util.Debug("<< settingsApply");
}, },
setPassword: function() { setPassword: function() {
RFB.sendPassword($('VNC_password').value); DefaultControls.rfb.sendPassword($('VNC_password').value);
return false; return false;
}, },
sendCtrlAltDel: function() { sendCtrlAltDel: function() {
RFB.sendCtrlAltDel(); DefaultControls.rfb.sendCtrlAltDel();
}, },
updateState: function(state, msg) { updateState: function(rfb, state, oldstate, msg) {
var s, sb, c, cad, klass; var s, sb, c, cad, klass;
s = $('VNC_status'); s = $('VNC_status');
sb = $('VNC_status_bar'); sb = $('VNC_status_bar');
@ -334,6 +341,13 @@ updateState: function(state, msg) {
}, },
clipReceive: function(rfb, text) {
Util.Debug(">> DefaultControls.clipReceive: " + text.substr(0,40) + "...");
$('VNC_clipboard_text').value = text;
Util.Debug("<< DefaultControls.clipReceive");
},
connect: function() { connect: function() {
var host, port, password, DC = DefaultControls; var host, port, password, DC = DefaultControls;
@ -346,43 +360,37 @@ connect: function() {
throw("Must set host and port"); throw("Must set host and port");
} }
RFB.setEncrypt(DC.getSetting('encrypt')); DC.rfb.set_encrypt(DC.getSetting('encrypt'));
RFB.setBase64(DC.getSetting('base64')); DC.rfb.set_b64encode(DC.getSetting('base64'));
RFB.setTrueColor(DC.getSetting('true_color')); DC.rfb.set_true_color(DC.getSetting('true_color'));
RFB.setCursor(DC.getSetting('cursor')); DC.rfb.set_local_cursor(DC.getSetting('cursor'));
RFB.connect(host, port, password); DC.rfb.connect(host, port, password);
}, },
disconnect: function() { disconnect: function() {
DefaultControls.closeSettingsMenu(); DefaultControls.closeSettingsMenu();
RFB.disconnect(); DefaultControls.rfb.disconnect();
}, },
canvasBlur: function() { canvasBlur: function() {
Canvas.focused = false; DefaultControls.rfb.get_canvas().set_focused(false);
}, },
canvasFocus: function() { canvasFocus: function() {
Canvas.focused = true; DefaultControls.rfb.get_canvas().set_focused(true);
}, },
clipClear: function() { clipClear: function() {
$('VNC_clipboard_text').value = ""; $('VNC_clipboard_text').value = "";
RFB.clipboardPasteFrom(""); DefaultControls.rfb.clipboardPasteFrom("");
},
clipReceive: function(text) {
Util.Debug(">> DefaultControls.clipReceive: " + text.substr(0,40) + "...");
$('VNC_clipboard_text').value = text;
Util.Debug("<< DefaultControls.clipReceive");
}, },
clipSend: function() { clipSend: function() {
var text = $('VNC_clipboard_text').value; var text = $('VNC_clipboard_text').value;
Util.Debug(">> DefaultControls.clipSend: " + text.substr(0,40) + "..."); Util.Debug(">> DefaultControls.clipSend: " + text.substr(0,40) + "...");
RFB.clipboardPasteFrom(text); DefaultControls.rfb.clipboardPasteFrom(text);
Util.Debug("<< DefaultControls.clipSend"); Util.Debug("<< DefaultControls.clipSend");
} }

File diff suppressed because it is too large Load Diff

View File

@ -6,7 +6,7 @@
* See README.md for usage and integration instructions. * See README.md for usage and integration instructions.
*/ */
//"use strict"; "use strict";
/*jslint bitwise: false, white: false */ /*jslint bitwise: false, white: false */
/*global window, document, navigator, ActiveXObject*/ /*global window, document, navigator, ActiveXObject*/
@ -14,38 +14,6 @@
Util = {}; Util = {};
/*
* Logging/debug routines
*/
Util.init_logging = function (level) {
if (typeof window.console === "undefined") {
if (typeof window.opera !== "undefined") {
window.console = {
'log' : window.opera.postError,
'warn' : window.opera.postError,
'error': window.opera.postError };
} else {
window.console = {
'log' : function(m) {},
'warn' : function(m) {},
'error': function(m) {}};
}
}
Util.Debug = Util.Info = Util.Warn = Util.Error = function (msg) {};
switch (level) {
case 'none': break;
case 'debug': Util.Debug = function (msg) { console.log(msg); };
case 'info': Util.Info = function (msg) { console.log(msg); };
case 'warn': Util.Warn = function (msg) { console.warn(msg); };
case 'error': Util.Error = function (msg) { console.error(msg); };
break;
default:
throw("invalid logging type '" + level + "'");
}
}
/* /*
* Simple DOM selector by ID * Simple DOM selector by ID
*/ */
@ -135,6 +103,42 @@ Array.prototype.shiftBytes = function (len) {
* ------------------------------------------------------ * ------------------------------------------------------
*/ */
/*
* Logging/debug routines
*/
Util.init_logging = function (level) {
if (typeof window.console === "undefined") {
if (typeof window.opera !== "undefined") {
window.console = {
'log' : window.opera.postError,
'warn' : window.opera.postError,
'error': window.opera.postError };
} else {
window.console = {
'log' : function(m) {},
'warn' : function(m) {},
'error': function(m) {}};
}
}
Util.Debug = Util.Info = Util.Warn = Util.Error = function (msg) {};
switch (level) {
case 'debug': Util.Debug = function (msg) { console.log(msg); };
case 'info': Util.Info = function (msg) { console.log(msg); };
case 'warn': Util.Warn = function (msg) { console.warn(msg); };
case 'error': Util.Error = function (msg) { console.error(msg); };
case 'none':
break;
default:
throw("invalid logging type '" + level + "'");
}
};
// Initialize logging level
Util.init_logging( (document.location.href.match(
/logging=([A-Za-z0-9\._\-]*)/) ||
['', 'warn'])[1] );
Util.dirObj = function (obj, depth, parent) { Util.dirObj = function (obj, depth, parent) {
var i, msg = "", val = ""; var i, msg = "", val = "";
if (! depth) { depth=2; } if (! depth) { depth=2; }
@ -157,6 +161,41 @@ Util.dirObj = function (obj, depth, parent) {
return msg; return msg;
}; };
// Read a query string variable
Util.getQueryVar = function(name, defVal) {
var re = new RegExp('[?][^#]*' + name + '=([^&#]*)');
if (typeof defVal === 'undefined') { defVal = null; }
return (document.location.href.match(re) || ['',defVal])[1];
};
// Set defaults for Crockford style function namespaces
Util.conf_default = function(cfg, api, v, val, force_bool) {
if (typeof cfg[v] === 'undefined') {
cfg[v] = val;
}
// Default getter
if (typeof api['get_' + v] === 'undefined') {
api['get_' + v] = function () {
return cfg[v];
};
}
// Default setter
if (typeof api['set_' + v] === 'undefined') {
api['set_' + v] = function (val) {
if (force_bool) {
if ((!val) || (val in {'0':1, 'no':1, 'false':1})) {
val = false;
} else {
val = true;
}
}
cfg[v] = val;
};
}
};
/* /*
* Cross-browser routines * Cross-browser routines
*/ */
@ -276,12 +315,11 @@ Util.createCookie = function(name,value,days) {
}; };
Util.readCookie = function(name, defaultValue) { Util.readCookie = function(name, defaultValue) {
var nameEQ = name + "="; var i, c, nameEQ = name + "=", ca = document.cookie.split(';');
var ca = document.cookie.split(';'); for(i=0; i < ca.length; i += 1) {
for(var i=0;i < ca.length;i++) { c = ca[i];
var c = ca[i]; while (c.charAt(0) === ' ') { c = c.substring(1,c.length); }
while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) === 0) { return c.substring(nameEQ.length,c.length); }
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
} }
return (typeof defaultValue !== 'undefined') ? defaultValue : null; return (typeof defaultValue !== 'undefined') ? defaultValue : null;
}; };
@ -294,8 +332,8 @@ Util.eraseCookie = function(name) {
* Alternate stylesheet selection * Alternate stylesheet selection
*/ */
Util.getStylesheets = function() { var i, links, sheets = []; Util.getStylesheets = function() { var i, links, sheets = [];
links = document.getElementsByTagName("link") links = document.getElementsByTagName("link");
for (i = 0; i < links.length; i++) { for (i = 0; i < links.length; i += 1) {
if (links[i].title && if (links[i].title &&
links[i].rel.toUpperCase().indexOf("STYLESHEET") > -1) { links[i].rel.toUpperCase().indexOf("STYLESHEET") > -1) {
sheets.push(links[i]); sheets.push(links[i]);
@ -311,17 +349,15 @@ Util.selectStylesheet = function(sheet) {
if (typeof sheet === 'undefined') { if (typeof sheet === 'undefined') {
sheet = 'default'; sheet = 'default';
} }
for (i=0; i < sheets.length; i++) { for (i=0; i < sheets.length; i += 1) {
link = sheets[i]; link = sheets[i];
if (link.title === sheet) { if (link.title === sheet) {
Util.Debug("Using stylesheet " + sheet); Util.Debug("Using stylesheet " + sheet);
link.disabled = false; link.disabled = false;
} else { } else {
Util.Debug("Skipping stylesheet " + link.title); //Util.Debug("Skipping stylesheet " + link.title);
link.disabled = true; link.disabled = true;
} }
} }
return sheet; return sheet;
}; };

View File

@ -46,14 +46,16 @@
} }
function test_functions () { function test_functions () {
var img, x, y; var img, x, y, w, h, ctx = canvas.getContext();
Canvas.fillRect(0, 0, Canvas.c_wx, Canvas.c_wy, [240,240,240]); w = canvas.get_width();
h = canvas.get_height();
canvas.fillRect(0, 0, w, h, [240,240,240]);
Canvas.blitStringImage("data:image/png;base64," + face64, 150, 10); canvas.blitStringImage("data:image/png;base64," + face64, 150, 10);
var himg = new Image(); var himg = new Image();
himg.onload = function () { himg.onload = function () {
Canvas.ctx.drawImage(himg, 200, 40); }; ctx.drawImage(himg, 200, 40); };
himg.src = "face.png"; himg.src = "face.png";
/* Test array image data */ /* Test array image data */
@ -66,15 +68,14 @@
data[(y*50 + x)*4 + 3] = 255; data[(y*50 + x)*4 + 3] = 255;
} }
} }
Canvas.blitImage(30, 10, 50, 50, data, 0); canvas.blitImage(30, 10, 50, 50, data, 0);
//Canvas.prefer_js = false; img = canvas.getTile(5,5,16,16,[0,128,128]);
img = Canvas.getTile(5,5,16,16,[0,128,128]); canvas.putTile(img);
Canvas.putTile(img);
img = Canvas.getTile(90,15,16,16,[0,0,0]); img = canvas.getTile(90,15,16,16,[0,0,0]);
Canvas.setSubTile(img, 0,0,16,16,[128,128,0]); canvas.setSubTile(img, 0,0,16,16,[128,128,0]);
Canvas.putTile(img); canvas.putTile(img);
} }
function begin () { function begin () {
@ -85,30 +86,35 @@
} }
function start_delayed () { function start_delayed () {
var ret;
message("Running test: prefer Javascript"); ret = canvas.set_prefer_js(true);
Canvas.prefer_js = true; if (ret) {
message("Running test: prefer Javascript ops");
var time1 = run_test(); var time1 = run_test();
message("prefer Javascript: " + time1 + "ms total, " + message("prefer Javascript ops: " + time1 + "ms total, " +
(time1 / iterations) + "ms per frame"); (time1 / iterations) + "ms per frame");
} else {
message("Could not run: prefer Javascript ops");
}
canvas.set_prefer_js(false);
message("Running test: prefer Canvas ops"); message("Running test: prefer Canvas ops");
Canvas.prefer_js = false;
var time2 = run_test(); var time2 = run_test();
message("prefer Canvas ops: " + time2 + "ms total, " + message("prefer Canvas ops: " + time2 + "ms total, " +
(time2 / iterations) + "ms per frame"); (time2 / iterations) + "ms per frame");
Canvas.resize(start_width, start_height, true); canvas.resize(start_width, start_height, true);
test_functions(); test_functions();
$('startButton').disabled = false; $('startButton').disabled = false;
$('startButton').value = "Start"; $('startButton').value = "Do Performance Test";
} }
function run_test () { function run_test () {
var width, height; var width, height;
width = $('width').value; width = $('width').value;
height = $('height').value; height = $('height').value;
Canvas.resize(width, height); canvas.resize(width, height);
var color, start_time = (new Date()).getTime(), w, h; var color, start_time = (new Date()).getTime(), w, h;
for (var i=0; i < iterations; i++) { for (var i=0; i < iterations; i++) {
color = [128, 128, (255 / iterations) * i, 0]; color = [128, 128, (255 / iterations) * i, 0];
@ -116,9 +122,9 @@
for (var y=0; y < height; y = y + 16) { for (var y=0; y < height; y = y + 16) {
w = Math.min(16, width - x); w = Math.min(16, width - x);
h = Math.min(16, height - y); h = Math.min(16, height - y);
var tile = Canvas.getTile(x, y, w, h, color); var tile = canvas.getTile(x, y, w, h, color);
Canvas.setSubTile(tile, 0, 0, w, h, color); canvas.setSubTile(tile, 0, 0, w, h, color);
Canvas.putTile(tile); canvas.putTile(tile);
} }
} }
} }
@ -129,8 +135,8 @@
window.onload = function() { window.onload = function() {
message("in onload"); message("in onload");
$('iterations').value = 10; $('iterations').value = 10;
Canvas.init('canvas'); canvas = Canvas({'target' : 'canvas'});
Canvas.resize(start_width, start_height, true); canvas.resize(start_width, start_height, true);
message("Canvas initialized"); message("Canvas initialized");
test_functions(); test_functions();
} }

View File

@ -105,10 +105,10 @@
window.onload = function() { window.onload = function() {
debug("onload"); debug("onload");
var cross, cursor, cursor64; var canvas, cross, cursor, cursor64;
Canvas.init("testcanvas"); canvas = new Canvas({'target' : "testcanvas"});
debug("Canvas.init() indicates Data URI cursor support is: " + Canvas.isCursor()); debug("canvas indicates Data URI cursor support is: " + canvas.get_cursor_uri());
$('button1').style.cursor="url(face.png), default"; $('button1').style.cursor="url(face.png), default";

View File

@ -19,6 +19,7 @@
src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
--> -->
<script src="include/util.js"></script> <script src="include/util.js"></script>
<script src="include/base64.js"></script>
<script src="include/canvas.js"></script> <script src="include/canvas.js"></script>
<script> <script>
var msg_cnt = 0; var msg_cnt = 0;
@ -51,9 +52,9 @@
} }
window.onload = function() { window.onload = function() {
Canvas.init('canvas'); var canvas = Canvas({'target' : 'canvas'});
Canvas.resize(width, height); canvas.resize(width, height, true);
Canvas.start(keyPress, mouseButton, mouseMove); canvas.start(keyPress, mouseButton, mouseMove);
message("Canvas initialized"); message("Canvas initialized");
} }
</script> </script>

View File

@ -16,13 +16,12 @@ noVNC example: simple example using default controls
<body> <body>
<div id='vnc'>Loading</div> <div id='vnc'>Loading</div>
</body>
<script> <script>
RFB.loadExtras();
window.onload = function () { window.onload = function () {
DefaultControls.load('vnc'); DefaultControls.load('vnc');
RFB.load(); };
}
</script> </script>
</body>
</html> </html>

View File

@ -7,8 +7,7 @@ Connect parameters are provided in query string:
<html> <html>
<head> <head>
<title>VNC Client</title> <title>VNC Client</title>
<link rel="stylesheet" href="include/plain.css" TITLE="plain"> <link rel="stylesheet" href="include/plain.css" title="plain">
<link rel="Alternate StyleSheet" href="include/black.css" TITLE="Black">
<!-- <!--
<script type='text/javascript' <script type='text/javascript'
src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script> src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
@ -20,31 +19,36 @@ Connect parameters are provided in query string:
<body style="margin: 0px;"> <body style="margin: 0px;">
<div id="VNC_screen"> <div id="VNC_screen">
<div id="VNC_status_bar" class="VNC_status_bar" style="margin-top: 0px;"> <div id="VNC_status_bar" class="VNC_status_bar" style="margin-top: 0px;">
<table border=0 width=100%><tr> <table border=0 width="100%"><tr>
<td><div id="VNC_status">Loading</div></td> <td><div id="VNC_status">Loading</div></td>
<td width=1%><div id="VNC_buttons"> <td width="1%"><div id="VNC_buttons">
<input type=button value="Send CtrlAltDel" <input type=button value="Send CtrlAltDel"
id="sendCtrlAltDelButton" id="sendCtrlAltDelButton">
onclick="sendCtrlAltDel();"></div></td> </div></td>
</tr></table> </tr></table>
</div> </div>
<canvas id="VNC_canvas" width="640px" height="20px"> <canvas id="VNC_canvas" width="640px" height="20px">
Canvas not supported. Canvas not supported.
</canvas> </canvas>
</div> </div>
</body>
<script> <script>
/*jslint white: false */
/*global window, $, Util, RFB, */
"use strict";
var rfb;
function setPassword() { function setPassword() {
RFB.sendPassword($('password_input').value); rfb.sendPassword($('password_input').value);
return false; return false;
} }
function sendCtrlAltDel() { function sendCtrlAltDel() {
RFB.sendCtrlAltDel(); rfb.sendCtrlAltDel();
return false; return false;
} }
function updateState(state, msg) { function updateState(rfb, state, oldstate, msg) {
var s, sb, klass, html; var s, sb, cad, klass;
s = $('VNC_status'); s = $('VNC_status');
sb = $('VNC_status_bar'); sb = $('VNC_status_bar');
cad = $('sendCtrlAltDelButton'); cad = $('sendCtrlAltDelButton');
@ -65,8 +69,9 @@ Connect parameters are provided in query string:
msg += ' style="margin-bottom: 0px">'; msg += ' style="margin-bottom: 0px">';
msg += 'Password Required: '; msg += 'Password Required: ';
msg += '<input type=password size=10 id="password_input" class="VNC_status">'; msg += '<input type=password size=10 id="password_input" class="VNC_status">';
msg += '</form>'; msg += '<\/form>';
// Fall through klass = "VNC_status_warn";
break;
default: default:
klass = "VNC_status_warn"; klass = "VNC_status_warn";
} }
@ -83,6 +88,8 @@ Connect parameters are provided in query string:
window.onload = function () { window.onload = function () {
var host, port, password; var host, port, password;
$('sendCtrlAltDelButton').onclick = sendCtrlAltDel;
host = Util.getQueryVar('host', null); host = Util.getQueryVar('host', null);
port = Util.getQueryVar('port', null); port = Util.getQueryVar('port', null);
password = Util.getQueryVar('password', ''); password = Util.getQueryVar('password', '');
@ -92,15 +99,15 @@ Connect parameters are provided in query string:
return; return;
} }
RFB.setEncrypt(Util.getQueryVar('encrypt', true)); rfb = new RFB({'encrypt': Util.getQueryVar('encrypt', true),
RFB.setBase64(Util.getQueryVar('base64', true)); 'b64encode': Util.getQueryVar('base64', true),
RFB.setTrueColor(Util.getQueryVar('true_color', true)); 'true_color': Util.getQueryVar('true_color', true),
RFB.setCursor(Util.getQueryVar('cursor', true)); 'local_cursor': Util.getQueryVar('cursor', true),
RFB.setUpdateState(updateState); 'updateState': updateState});
rfb.connect(host, port, password);
RFB.load(); };
RFB.connect(host, port, password);
}
</script> </script>
</body>
</html> </html>