summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsamhed <samuel@cendio.se>2015-06-24 16:20:03 +0200
committersamhed <samuel@cendio.se>2015-06-24 16:20:03 +0200
commit31ddaa1c7a4f2a8f211f53da1b53bfe294ad6a38 (patch)
tree254b591115b250880ad776fb1f9b6f6bb5830980
parent29a0e6a8a3d091f075b1f1e941ee70651c245795 (diff)
downloadnovnc-31ddaa1c7a4f2a8f211f53da1b53bfe294ad6a38.tar.gz
Clarify code with regards to the viewport drag functionality
* Fixes #502 so that the viewport drag functionality can't get stuck
-rw-r--r--include/ui.js83
1 files changed, 52 insertions, 31 deletions
diff --git a/include/ui.js b/include/ui.js
index ba04a85..fafafdc 100644
--- a/include/ui.js
+++ b/include/ui.js
@@ -127,7 +127,7 @@ var UI;
Util.addEvent(window, 'resize', function () {
UI.onresize();
UI.setViewClip();
- UI.updateViewDragButton();
+ UI.updateViewDrag();
UI.setBarPosition();
} );
@@ -165,7 +165,7 @@ var UI;
'onXvpInit': UI.updateXvpVisualState,
'onClipboard': UI.clipReceive,
'onFBUComplete': UI.FBUComplete,
- 'onFBResize': UI.updateViewDragButton,
+ 'onFBResize': UI.updateViewDrag,
'onDesktopName': UI.updateDocumentTitle});
return true;
} catch (exc) {
@@ -176,7 +176,7 @@ var UI;
addMouseHandlers: function() {
// Setup interface handlers that can't be inline
- $D("noVNC_view_drag_button").onclick = UI.setViewDrag;
+ $D("noVNC_view_drag_button").onclick = UI.toggleViewDrag;
$D("noVNC_mouse_button0").onclick = function () { UI.setMouseButton(1); };
$D("noVNC_mouse_button1").onclick = function () { UI.setMouseButton(2); };
$D("noVNC_mouse_button2").onclick = function () { UI.setMouseButton(4); };
@@ -565,7 +565,7 @@ var UI;
WebUtil.selectStylesheet(UI.getSetting('stylesheet'));
WebUtil.init_logging(UI.getSetting('logging'));
UI.setViewClip();
- UI.setViewDrag(UI.rfb && UI.rfb.get_viewportDrag());
+ UI.updateViewDrag();
//Util.Debug("<< settingsApply");
},
@@ -696,8 +696,7 @@ var UI;
// State change disables viewport dragging.
// It is enabled (toggled) by direct click on the button
- UI.setViewDrag(false);
- UI.updateViewDragButton();
+ UI.updateViewDrag(false);
switch (UI.rfb_state) {
case 'fatal':
@@ -859,6 +858,7 @@ var UI;
// Turn clipping off
UI.updateSetting('clip', false);
display.set_viewport(false);
+ // Disable max dimensions
display.set_maxWidth(0);
display.set_maxHeight(0);
display.viewportChangeSize();
@@ -886,43 +886,64 @@ var UI;
}
},
- // Toggle/set/unset the viewport drag/move button
- setViewDrag: function(drag) {
+ // Update the viewport drag/move button
+ updateViewDrag: function(drag) {
if (!UI.rfb) return;
- if (typeof(drag) === "undefined" ||
- typeof(drag) === "object") {
- // If not specified, then toggle
- drag = !UI.rfb.get_viewportDrag();
- }
var vmb = $D('noVNC_view_drag_button');
- if (drag) {
- vmb.className = "noVNC_status_button_selected";
- UI.rfb.set_viewportDrag(true);
- } else {
- vmb.className = "noVNC_status_button";
- UI.rfb.set_viewportDrag(false);
- }
- },
- updateViewDragButton: function() {
- var vmb = $D('noVNC_view_drag_button');
+ // Check if viewport drag is possible
if (UI.rfb_state === 'normal' &&
UI.rfb.get_display().get_viewport() &&
UI.rfb.get_display().clippingDisplay()) {
- // Enable the viewport drag button
+
+ // Show and enable the drag button
vmb.style.display = "inline";
vmb.disabled = false;
- } else if (UI.rfb_state === 'normal' &&
- UI.isTouchDevice) {
- // Disable the viewport drag button
- vmb.style.display = "inline";
- vmb.disabled = true;
+ } else {
+ // The VNC content is the same size as
+ // or smaller than the display
+
+ if (UI.rfb.get_viewportDrag) {
+ // Turn off viewport drag when it's
+ // active since it can't be used here
+ vmb.className = "noVNC_status_button";
+ UI.rfb.set_viewportDrag(false);
+ }
+
+ // Disable or hide the drag button
+ if (UI.rfb_state === 'normal' && UI.isTouchDevice) {
+ vmb.style.display = "inline";
+ vmb.disabled = true;
+ } else {
+ vmb.style.display = "none";
+ }
+ return;
+ }
+
+ if (typeof(drag) !== "undefined" &&
+ typeof(drag) !== "object") {
+ if (drag) {
+ vmb.className = "noVNC_status_button_selected";
+ UI.rfb.set_viewportDrag(true);
+ } else {
+ vmb.className = "noVNC_status_button";
+ UI.rfb.set_viewportDrag(false);
+ }
+ }
+ },
+ toggleViewDrag: function() {
+ if (!UI.rfb) return;
+
+ var vmb = $D('noVNC_view_drag_button');
+ if (UI.rfb.get_viewportDrag()) {
+ vmb.className = "noVNC_status_button";
+ UI.rfb.set_viewportDrag(false);
} else {
- // Hide the viewport drag button
- vmb.style.display = "none";
+ vmb.className = "noVNC_status_button_selected";
+ UI.rfb.set_viewportDrag(true);
}
},