From dceda58642a72384d9afaf46c79a4dd59bb5cf11 Mon Sep 17 00:00:00 2001
From: Samuel Mannehed <samuel@cendio.se>
Date: Mon, 23 Jan 2017 12:20:45 +0100
Subject: [PATCH] Save settings immediately

Retire the old settingsApply. This also allows UI logic to check the
state of things using the settings instead of having to look at the
values of HTML elements (we couldn't be sure if the changes were
applied yet or not).
---
 app/ui.js | 78 +++++++++++++++++++++++--------------------------------
 vnc.html  |  4 ---
 2 files changed, 32 insertions(+), 50 deletions(-)

diff --git a/app/ui.js b/app/ui.js
index 7212a75..5fda992 100644
--- a/app/ui.js
+++ b/app/ui.js
@@ -375,14 +375,35 @@ var UI;
                 .addEventListener('click', UI.clipboardClear);
         },
 
+        // Add a call to save settings when the element changes,
+        // unless the optional parameter changeFunc is used instead.
+        addSettingChangeHandler: function(name, changeFunc) {
+            var settingElem = document.getElementById("noVNC_setting_" + name);
+            if (changeFunc === undefined) {
+                changeFunc = function () { UI.saveSetting(name); };
+            }
+            settingElem.addEventListener('change', changeFunc);
+        },
+
         addSettingsHandlers: function() {
             document.getElementById("noVNC_settings_button")
                 .addEventListener('click', UI.toggleSettingsPanel);
-            document.getElementById("noVNC_settings_apply")
-                .addEventListener('click', UI.settingsApply);
 
-            document.getElementById("noVNC_setting_resize")
-                .addEventListener('change', UI.enableDisableViewClip);
+            UI.addSettingChangeHandler('encrypt');
+            UI.addSettingChangeHandler('true_color');
+            UI.addSettingChangeHandler('cursor');
+            UI.addSettingChangeHandler('resize');
+            UI.addSettingChangeHandler('clip');
+            UI.addSettingChangeHandler('shared');
+            UI.addSettingChangeHandler('view_only');
+            UI.addSettingChangeHandler('host');
+            UI.addSettingChangeHandler('port');
+            UI.addSettingChangeHandler('path');
+            UI.addSettingChangeHandler('repeaterID');
+            UI.addSettingChangeHandler('logging');
+            UI.addSettingChangeHandler('logging', UI.updateLogging);
+            UI.addSettingChangeHandler('reconnect');
+            UI.addSettingChangeHandler('reconnect_delay');
         },
 
         addFullscreenHandlers: function() {
@@ -841,39 +862,6 @@ var UI;
             return val;
         },
 
-        // Save/apply settings when 'Apply' button is pressed
-        settingsApply: function() {
-            //Util.Debug(">> settingsApply");
-            UI.saveSetting('encrypt');
-            UI.saveSetting('true_color');
-            if (Util.browserSupportsCursorURIs()) {
-                UI.saveSetting('cursor');
-            }
-
-            UI.saveSetting('resize');
-
-            if (UI.getSetting('resize') === 'downscale' || UI.getSetting('resize') === 'scale') {
-                UI.forceSetting('clip', false);
-            }
-
-            UI.saveSetting('clip');
-            UI.saveSetting('shared');
-            UI.saveSetting('view_only');
-            UI.saveSetting('host');
-            UI.saveSetting('port');
-            UI.saveSetting('path');
-            UI.saveSetting('repeaterID');
-            UI.saveSetting('logging');
-            UI.saveSetting('reconnect');
-            UI.saveSetting('reconnect_delay');
-
-            // Settings with immediate (non-connected related) effect
-            UI.updateLogging();
-            UI.updateViewClip();
-            UI.updateViewDrag();
-            //Util.Debug("<< settingsApply");
-        },
-
 /* ------^-------
  *   /SETTINGS
  * ==============
@@ -897,6 +885,7 @@ var UI;
             UI.closeAllPanels();
             UI.openControlbar();
 
+            // Refresh UI elements from saved cookies
             UI.updateSetting('encrypt');
             UI.updateSetting('true_color');
             if (Util.browserSupportsCursorURIs()) {
@@ -928,13 +917,9 @@ var UI;
                 .classList.remove("noVNC_selected");
         },
 
-        // Toggle the settings menu:
-        //   On open, settings are refreshed from saved cookies.
-        //   On close, settings are applied
         toggleSettingsPanel: function() {
             if (document.getElementById('noVNC_settings')
                 .classList.contains("noVNC_open")) {
-                UI.settingsApply();
                 UI.closeSettingsPanel();
             } else {
                 UI.openSettingsPanel();
@@ -1053,9 +1038,9 @@ var UI;
         },
 
         connect: function(event, password) {
-            var host = document.getElementById('noVNC_setting_host').value;
-            var port = document.getElementById('noVNC_setting_port').value;
-            var path = document.getElementById('noVNC_setting_path').value;
+            var host = UI.getSetting('host');
+            var port = UI.getSetting('port');
+            var path = UI.getSetting('path');
 
             if (typeof password === 'undefined') {
                 password = WebUtil.getConfigVar('password');
@@ -1329,15 +1314,16 @@ var UI;
 
         // Handle special cases where clipping is forced on/off or locked
         enableDisableViewClip: function() {
-            var resizeSetting = document.getElementById('noVNC_setting_resize');
+            var resizeSetting = UI.getSetting('resize');
 
             if (UI.isSafari) {
                 // Safari auto-hides the scrollbars which makes them
                 // impossible to use in most cases
                 UI.setViewClip(true);
                 document.getElementById('noVNC_setting_clip').disabled = true;
-            } else if (resizeSetting.value === 'downscale' || resizeSetting.value === 'scale') {
+            } else if (resizeSetting === 'downscale' || resizeSetting === 'scale') {
                 // Disable clipping if we are scaling
+                UI.forceSetting('clip', false);
                 UI.setViewClip(false);
                 document.getElementById('noVNC_setting_clip').disabled = true;
             } else if (document.msFullscreenElement) {
diff --git a/vnc.html b/vnc.html
index 5943aee..0048046 100644
--- a/vnc.html
+++ b/vnc.html
@@ -248,10 +248,6 @@
                             </li>
                         </ul></div>
                     </li>
-                    <li><hr></li>
-                    <li>
-                        <input type="button" id="noVNC_settings_apply" value="Apply" class="noVNC_submit" />
-                    </li>
                 </ul>
             </div>
             </div>
-- 
GitLab