From 248312703b915ece090f7584405a44ab2a97bd82 Mon Sep 17 00:00:00 2001 From: NotSirius-A Date: Sat, 15 Nov 2025 18:26:03 +0100 Subject: [PATCH 1/5] Fixed an xlet-settings issue causing invalid callback/signal triggers with some setting types --- js/ui/settings.js | 55 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/js/ui/settings.js b/js/ui/settings.js index f347ad5c76..b283589ce1 100644 --- a/js/ui/settings.js +++ b/js/ui/settings.js @@ -592,14 +592,19 @@ XletSettingsBase.prototype = { for (let key in this.settingsData) { if (!this.settingsData[key] || this.settingsData[key].value === undefined + || this.settingsData[key].type === undefined || !oldSettings[key] - || oldSettings[key].value === undefined) continue; + || oldSettings[key].value === undefined + || oldSettings[key].type === undefined) continue; let oldValue = oldSettings[key].value; let value = this.settingsData[key].value; - if (value == oldValue) continue; - + let oldValueType = oldSettings[key].type; + let valueType = this.settingsData[key].type; + if (this._isValueChanged(value, valueType, oldValue, oldValueType)) continue; + changed = true; + if (key in this.bindings) { for (let info of this.bindings[key]) { // if the property had a save function, it is gone now and we need to re-add it @@ -632,6 +637,50 @@ XletSettingsBase.prototype = { } }, + /** + * _isValueChanged: + * @value: current value + * @valueType: current value setting type + * @oldValue: previous value + * @oldValueType: previous value setting type + * + * Checks whether two setting values are the same + */ + _isValueChanged: function(value, valueType, oldValue, oldValueType) { + let equal = false; + // Some setting values are objects, in such case every property needs to be checked + + if(oldValueType === valueType + && (valueType === "timechooser" || valueType === "datechooser")) { + + if (value.length !== oldValue.length) return false; + + equal = Object.keys(value).every( + key => oldValue.hasOwnProperty(key) + && value[key] === oldValue[key]); + + + } else if (valueType === "list" && oldValueType === valueType) { + + if (value.length !== oldValue.length) return false; + + // Each row of the list needs to be checked + equal = Object.keys(value).every(row => { + if(value[row].length === oldValue[row].length) { + return Object.keys(value[row]).every( + key => oldValue[row].hasOwnProperty(key) + && value[row][key] === oldValue[row][key] + ); + }; + }); + + } else { + equal = value === oldValue; + } + + return equal; + }, + _loadTemplate: function(checksum) { let xletDir = Extension.getExtension(this.uuid).dir; let templateFile = xletDir.get_child("settings-schema.json"); From 32f7a09dfdccbd47d4d2e94888a0ff9335c7b1f2 Mon Sep 17 00:00:00 2001 From: NotSirius-A Date: Sat, 15 Nov 2025 22:26:44 +0100 Subject: [PATCH 2/5] Changed function name --- js/ui/settings.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/js/ui/settings.js b/js/ui/settings.js index b283589ce1..07a93e2223 100644 --- a/js/ui/settings.js +++ b/js/ui/settings.js @@ -601,7 +601,7 @@ XletSettingsBase.prototype = { let value = this.settingsData[key].value; let oldValueType = oldSettings[key].type; let valueType = this.settingsData[key].type; - if (this._isValueChanged(value, valueType, oldValue, oldValueType)) continue; + if (this._isValueUnchanged(value, valueType, oldValue, oldValueType)) continue; changed = true; @@ -638,7 +638,7 @@ XletSettingsBase.prototype = { }, /** - * _isValueChanged: + * _isValueUnchanged: * @value: current value * @valueType: current value setting type * @oldValue: previous value @@ -646,11 +646,11 @@ XletSettingsBase.prototype = { * * Checks whether two setting values are the same */ - _isValueChanged: function(value, valueType, oldValue, oldValueType) { + _isValueUnchanged: function(value, valueType, oldValue, oldValueType) { let equal = false; // Some setting values are objects, in such case every property needs to be checked - if(oldValueType === valueType + if (oldValueType === valueType && (valueType === "timechooser" || valueType === "datechooser")) { if (value.length !== oldValue.length) return false; @@ -675,7 +675,7 @@ XletSettingsBase.prototype = { }); } else { - equal = value === oldValue; + equal = (value === oldValue); } return equal; From d5c15fc53459c3289e5ecd781fbbab3f01a1a42d Mon Sep 17 00:00:00 2001 From: NotSirius-A Date: Mon, 17 Nov 2025 11:48:44 +0100 Subject: [PATCH 3/5] readability improvements --- js/ui/settings.js | 36 +++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/js/ui/settings.js b/js/ui/settings.js index 07a93e2223..d0ae7c61a1 100644 --- a/js/ui/settings.js +++ b/js/ui/settings.js @@ -579,6 +579,12 @@ XletSettingsBase.prototype = { } }, + + /** + * _checkSettings: + * + * Checks whether any settings have been changed and handles callbacks/signals if they have. + */ _checkSettings: function() { let oldSettings = this.settingsData; try { @@ -601,7 +607,8 @@ XletSettingsBase.prototype = { let value = this.settingsData[key].value; let oldValueType = oldSettings[key].type; let valueType = this.settingsData[key].type; - if (this._isValueUnchanged(value, valueType, oldValue, oldValueType)) continue; + + if (!this._hasSettingChanged(value, valueType, oldValue, oldValueType)) continue; changed = true; @@ -638,31 +645,30 @@ XletSettingsBase.prototype = { }, /** - * _isValueUnchanged: + * _hasSettingChanged: * @value: current value * @valueType: current value setting type * @oldValue: previous value * @oldValueType: previous value setting type * - * Checks whether two setting values are the same + * Checks whether a setting has changed by comparing is current value to the previous one */ - _isValueUnchanged: function(value, valueType, oldValue, oldValueType) { + _hasSettingChanged: function(value, valueType, oldValue, oldValueType) { + // It's easy to evaluate whether strings or ints changes, but + // some settings are objects in such case every property needs to be checked + + // If settings differ in length or are somehow different types they definitely changed + if (oldValueType !== valueType) return true; + if (value.length !== oldValue.length) return true; + let equal = false; - // Some setting values are objects, in such case every property needs to be checked - - if (oldValueType === valueType - && (valueType === "timechooser" || valueType === "datechooser")) { - - if (value.length !== oldValue.length) return false; + if (valueType === "timechooser" || valueType === "datechooser") { equal = Object.keys(value).every( key => oldValue.hasOwnProperty(key) && value[key] === oldValue[key]); - - - } else if (valueType === "list" && oldValueType === valueType) { - if (value.length !== oldValue.length) return false; + } else if (valueType === "list") { // Each row of the list needs to be checked equal = Object.keys(value).every(row => { @@ -678,7 +684,7 @@ XletSettingsBase.prototype = { equal = (value === oldValue); } - return equal; + return !equal; }, _loadTemplate: function(checksum) { From 712250fe0ac93b5ff65c6222da461cd1cd807467 Mon Sep 17 00:00:00 2001 From: NotSirius-A Date: Tue, 18 Nov 2025 18:18:59 +0100 Subject: [PATCH 4/5] deleted unnecessary setting type validation --- js/ui/settings.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/js/ui/settings.js b/js/ui/settings.js index d0ae7c61a1..b223a67f71 100644 --- a/js/ui/settings.js +++ b/js/ui/settings.js @@ -600,15 +600,13 @@ XletSettingsBase.prototype = { || this.settingsData[key].value === undefined || this.settingsData[key].type === undefined || !oldSettings[key] - || oldSettings[key].value === undefined - || oldSettings[key].type === undefined) continue; + || oldSettings[key].value === undefined) continue; let oldValue = oldSettings[key].value; let value = this.settingsData[key].value; - let oldValueType = oldSettings[key].type; let valueType = this.settingsData[key].type; - if (!this._hasSettingChanged(value, valueType, oldValue, oldValueType)) continue; + if (!this._hasSettingChanged(value, valueType, oldValue)) continue; changed = true; @@ -649,16 +647,14 @@ XletSettingsBase.prototype = { * @value: current value * @valueType: current value setting type * @oldValue: previous value - * @oldValueType: previous value setting type * * Checks whether a setting has changed by comparing is current value to the previous one */ - _hasSettingChanged: function(value, valueType, oldValue, oldValueType) { + _hasSettingChanged: function(value, valueType, oldValue) { // It's easy to evaluate whether strings or ints changes, but // some settings are objects in such case every property needs to be checked - // If settings differ in length or are somehow different types they definitely changed - if (oldValueType !== valueType) return true; + // If settings differ in length they definitely changed if (value.length !== oldValue.length) return true; let equal = false; From bf5903bcb4e0d6fa3d384504c129d5dc2aeda72e Mon Sep 17 00:00:00 2001 From: NotSirius-A Date: Wed, 19 Nov 2025 15:21:29 +0100 Subject: [PATCH 5/5] moved value.length evaluation to only check "list" type settings --- js/ui/settings.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/ui/settings.js b/js/ui/settings.js index b223a67f71..f025eb2ee8 100644 --- a/js/ui/settings.js +++ b/js/ui/settings.js @@ -654,9 +654,6 @@ XletSettingsBase.prototype = { // It's easy to evaluate whether strings or ints changes, but // some settings are objects in such case every property needs to be checked - // If settings differ in length they definitely changed - if (value.length !== oldValue.length) return true; - let equal = false; if (valueType === "timechooser" || valueType === "datechooser") { @@ -666,6 +663,9 @@ XletSettingsBase.prototype = { } else if (valueType === "list") { + // If lists differ in length they definitely changed + if (value.length !== oldValue.length) return true; + // Each row of the list needs to be checked equal = Object.keys(value).every(row => { if(value[row].length === oldValue[row].length) {