diff --git a/include/rfb.js b/include/rfb.js index b7aa3f62..9dceea72 100644 --- a/include/rfb.js +++ b/include/rfb.js @@ -131,6 +131,7 @@ Util.conf_defaults(conf, that, defaults, [ ['true_color', 'rw', 'bool', true, 'Request true color pixel data'], ['local_cursor', 'rw', 'bool', false, 'Request locally rendered cursor'], ['shared', 'rw', 'bool', true, 'Request shared mode'], + ['view_only', 'rw', 'bool', false, 'Disable client mouse/keyboard'], ['connectTimeout', 'rw', 'int', def_con_timeout, 'Time (s) to wait for connection'], ['disconnectTimeout', 'rw', 'int', 3, 'Time (s) to wait for disconnection'], @@ -565,6 +566,9 @@ checkEvents = function() { keyPress = function(keysym, down) { var arr; + + if (conf.view_only) { return; } // View only, skip keyboard events + arr = keyEvent(keysym, down); arr = arr.concat(fbUpdateRequests()); ws.send(arr); @@ -586,9 +590,12 @@ mouseButton = function(x, y, down, bmask) { return; } else { viewportDragging = false; + ws.send(fbUpdateRequests()); // Force immediate redraw } } + if (conf.view_only) { return; } // View only, skip mouse events + mouse_arr = mouse_arr.concat( pointerEvent(display.absX(x), display.absY(y)) ); flushClient(); @@ -611,6 +618,8 @@ mouseMove = function(x, y) { return; } + if (conf.view_only) { return; } // View only, skip mouse events + mouse_arr = mouse_arr.concat( pointerEvent(display.absX(x), display.absY(y)) ); }; @@ -1556,7 +1565,7 @@ that.sendPassword = function(passwd) { }; that.sendCtrlAltDel = function() { - if (rfb_state !== "normal") { return false; } + if (rfb_state !== "normal" || conf.view_only) { return false; } Util.Info("Sending Ctrl-Alt-Del"); var arr = []; arr = arr.concat(keyEvent(0xFFE3, 1)); // Control @@ -1572,7 +1581,7 @@ that.sendCtrlAltDel = function() { // Send a key press. If 'down' is not specified then send a down key // followed by an up key. that.sendKey = function(code, down) { - if (rfb_state !== "normal") { return false; } + if (rfb_state !== "normal" || conf.view_only) { return false; } var arr = []; if (typeof down !== 'undefined') { Util.Info("Sending key code (" + (down ? "down" : "up") + "): " + code); diff --git a/include/ui.js b/include/ui.js index 74a0005c..21779e1a 100644 --- a/include/ui.js +++ b/include/ui.js @@ -52,6 +52,7 @@ load: function() { UI.initSetting('true_color', true); UI.initSetting('cursor', false); UI.initSetting('shared', true); + UI.initSetting('view_only', false); UI.initSetting('connectTimeout', 2); UI.initSetting('path', ''); @@ -252,6 +253,7 @@ toggleSettingsPanel: function() { } UI.updateSetting('clip'); UI.updateSetting('shared'); + UI.updateSetting('view_only'); UI.updateSetting('connectTimeout'); UI.updateSetting('path'); UI.updateSetting('stylesheet'); @@ -292,6 +294,7 @@ settingsApply: function() { } UI.saveSetting('clip'); UI.saveSetting('shared'); + UI.saveSetting('view_only'); UI.saveSetting('connectTimeout'); UI.saveSetting('path'); UI.saveSetting('stylesheet'); @@ -404,6 +407,7 @@ updateVisualState: function() { $D('noVNC_cursor').disabled = true; } $D('noVNC_shared').disabled = connected; + $D('noVNC_view_only').disabled = connected; $D('noVNC_connectTimeout').disabled = connected; $D('noVNC_path').disabled = connected; @@ -464,6 +468,7 @@ connect: function() { UI.rfb.set_true_color(UI.getSetting('true_color')); UI.rfb.set_local_cursor(UI.getSetting('cursor')); UI.rfb.set_shared(UI.getSetting('shared')); + UI.rfb.set_view_only(UI.getSetting('view_only')); UI.rfb.set_connectTimeout(UI.getSetting('connectTimeout')); UI.rfb.connect(host, port, password, path); diff --git a/vnc.html b/vnc.html index 281b4d3b..104d0791 100644 --- a/vnc.html +++ b/vnc.html @@ -118,8 +118,9 @@