diff --git a/include/canvas.js b/include/canvas.js
index 72af98eb00d927a26cdca03f3bade4b6778aa802..ad273fbbda834455f4b3e403d195167e7b54f14d 100644
--- a/include/canvas.js
+++ b/include/canvas.js
@@ -38,7 +38,7 @@ cdef('target',         'dom',  null, 'Canvas element for VNC viewport');
 cdef('focusContainer', 'dom',  document, 'DOM element that traps keyboard input');
 cdef('true_color',     'bool', true, 'Request true color pixel data');
 cdef('colourMap',      'raw',  [], 'Colour map array (not true color)');
-cdef('scale',          'float', 1, 'VNC viewport scale factor');
+cdef('scale',          'float', 1.0, 'Viewport scale factor 0.1 - 1.0');
 
 cdef('render_mode',    'str', '', 'Canvas rendering mode (read-only)');
 
@@ -70,6 +70,9 @@ that.set_colourMap = function(val, idx) {
 
 that.set_render_mode = function () { throw("render_mode is read-only"); };
 
+that.set_scale = function(scale) { that.rescale(scale); };
+
+
 // Add some other getters/setters
 that.get_width = function() {
     return c_width;
@@ -232,6 +235,12 @@ that.rescale = function(factor) {
         return;
     }
 
+    if (factor > 1.0) {
+        factor = 1.0;
+    } else if (factor < 0.1) {
+        factor = 0.1;
+    }
+
     if (conf.scale === factor) {
         //Util.Debug("Canvas already scaled to '" + factor + "'");
         return;
diff --git a/include/input.js b/include/input.js
index 56fa91dc4b2d92e9920c56179a7f58b6f7bc9239..f155594126d0da350eb4a8672ca19395777cac52 100644
--- a/include/input.js
+++ b/include/input.js
@@ -460,6 +460,7 @@ function cdef(v, type, defval, desc) {
 // Capability settings, default can be overridden
 cdef('target',         'dom',  document, 'DOM element that grabs mouse input');
 cdef('focused',        'bool', true, 'Capture and send mouse clicks/movement');
+cdef('scale',          'float', 1.0, 'Viewport scale factor 0.0 - 1.0');
 
 cdef('mouseButton',    'func', null, 'Handler for mouse button click/release');
 cdef('mouseMove',      'func', null, 'Handler for mouse movement');