Merge pull request #951 from rigrig/qmsched-clean

Move Quiet Mode LCD options from global settings to the Quiet Mode Schedule app
master
Gordon Williams 2021-12-03 08:13:52 +00:00 committed by GitHub
commit e2ae57faa4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 216 additions and 185 deletions

View File

@ -16,7 +16,7 @@
{ {
"id": "boot", "id": "boot",
"name": "Bootloader", "name": "Bootloader",
"version": "0.36", "version": "0.37",
"description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings", "description": "This is needed by Bangle.js to automatically load the clock, menu, widgets and settings",
"icon": "bootloader.png", "icon": "bootloader.png",
"type": "bootloader", "type": "bootloader",
@ -119,7 +119,7 @@
{ {
"id": "setting", "id": "setting",
"name": "Settings", "name": "Settings",
"version": "0.33", "version": "0.34",
"description": "A menu for setting up Bangle.js", "description": "A menu for setting up Bangle.js",
"icon": "settings.png", "icon": "settings.png",
"tags": "tool,system", "tags": "tool,system",
@ -3797,10 +3797,11 @@
"id": "qmsched", "id": "qmsched",
"name": "Quiet Mode Schedule and Widget", "name": "Quiet Mode Schedule and Widget",
"shortName": "Quiet Mode", "shortName": "Quiet Mode",
"version": "0.03", "version": "0.04",
"description": "Automatically turn Quiet Mode on or off at set times", "description": "Automatically turn Quiet Mode on or off at set times, and change LCD options while Quiet Mode is active.",
"icon": "app.png", "icon": "app.png",
"screenshots": [{"url":"screenshot_edit.png"},{"url":"screenshot_main.png"},{"url":"screenshot_widget_alarms.png"},{"url":"screenshot_widget_silent.png"}], "screenshots": [{"url":"screenshot_b1_main.png"},{"url":"screenshot_b1_edit.png"},{"url":"screenshot_b1_lcd.png"},
{"url":"screenshot_b2_main.png"},{"url":"screenshot_b2_edit.png"},{"url":"screenshot_b2_lcd.png"}],
"tags": "tool,widget", "tags": "tool,widget",
"supports": ["BANGLEJS","BANGLEJS2"], "supports": ["BANGLEJS","BANGLEJS2"],
"readme": "README.md", "readme": "README.md",

View File

@ -40,3 +40,4 @@
0.35: Add Bangle.appRect polyfill 0.35: Add Bangle.appRect polyfill
Don't set beep vibration up on Bangle.js 2 (built in) Don't set beep vibration up on Bangle.js 2 (built in)
0.36: Add comments to .boot0 to make debugging a bit easier 0.36: Add comments to .boot0 to make debugging a bit easier
0.37: Remove Quiet Mode settings: now handled by Quiet Mode Schedule app

View File

@ -78,13 +78,7 @@ boot += `E.on('errorFlag', function(errorFlags) {
if (global.save) boot += `global.save = function() { throw new Error("You can't use save() on Bangle.js without overwriting the bootloader!"); }\n`; if (global.save) boot += `global.save = function() { throw new Error("You can't use save() on Bangle.js without overwriting the bootloader!"); }\n`;
// Apply any settings-specific stuff // Apply any settings-specific stuff
if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`; if (s.options) boot+=`Bangle.setOptions(${E.toJS(s.options)});\n`;
if (s.quiet && s.qmOptions) boot+=`Bangle.setOptions(${E.toJS(s.qmOptions)});\n`; if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`;
if (s.quiet && s.qmBrightness) {
if (s.qmBrightness!=1) boot+=`Bangle.setLCDBrightness(${s.qmBrightness});\n`;
} else {
if (s.brightness && s.brightness!=1) boot+=`Bangle.setLCDBrightness(${s.brightness});\n`;
}
if (s.quiet && s.qmTimeout) boot+=`Bangle.setLCDTimeout(${s.qmTimeout});\n`;
if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${s.passkey}, mitm:1, display:1});\n`; if (s.passkey!==undefined && s.passkey.length==6) boot+=`NRF.setSecurity({passkey:${s.passkey}, mitm:1, display:1});\n`;
if (s.whitelist) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.includes(addr)) NRF.disconnect(); });\n`; if (s.whitelist) boot+=`NRF.on('connect', function(addr) { if (!(require('Storage').readJSON('setting.json',1)||{}).whitelist.includes(addr)) NRF.disconnect(); });\n`;
// Pre-2v10 firmwares without a theme/setUI // Pre-2v10 firmwares without a theme/setUI

View File

@ -1,3 +1,4 @@
0.01: First version 0.01: First version
0.02: Add widget 0.02: Add widget
0.03: Bangle.js 2 support 0.03: Bangle.js 2 support
0.04: Move Quiet Mode LCD options from global settings to this app

View File

@ -1,9 +1,14 @@
# Quiet Mode Schedule and Widget # Quiet Mode Schedule and Widget
Automatically turn Quiet Mode on or off at set times, and display a widget when enabled. Automatically turn Quiet Mode on or off at set times, and display a widget when Quiet Mode is active.
### Edit Schedule: | Bangle.js 1 | Bangle.js 2 |
![Main menu](screenshot_main.png) ![Edit Schedule menu](screenshot_edit.png) |:---------------------------------------------:|:---------------------------------------------:|
| (widget: Silent mode) | (widget: Alarms mode) |
| ![Main menu](screenshot_b1_main.png) | ![Main menu](screenshot_b2_main.png) |
| ![Edit Schedule menu](screenshot_b1_edit.png) | ![Edit Schedule menu](screenshot_b2_edit.png) |
| ![LCD Options menu](screenshot_b1_lcd.png) | ![LCD Options menu](screenshot_b2_lcd.png) |
### Widget: ### LCD Settings:
![Widget, quiet mode: silent](screenshot_widget_silent.png) ![Widget, quiet mode: alarms](screenshot_widget_alarms.png)
If set, these override the default LCD settings while Quiet Mode is active.

View File

@ -2,27 +2,74 @@ Bangle.loadWidgets();
Bangle.drawWidgets(); Bangle.drawWidgets();
const modeNames = ["Off", "Alarms", "Silent"]; const modeNames = ["Off", "Alarms", "Silent"];
let scheds = require("Storage").readJSON("qmsched.json", 1);
/*scheds = [ // load global brightness setting
{ hr : 6.5, // hours + minutes/60 let bSettings = require('Storage').readJSON('setting.json',true)||{};
mode : 1, // quiet mode (0/1/2) let current = 0|bSettings.quiet;
} delete bSettings; // we don't need any other global settings
];*/
if (!scheds) {
// set default schedule on first load of app
scheds = [
{"hr": 8, "mode": 0},
{"hr": 22, "mode": 1},
]; /**
require("Storage").writeJSON("qmsched.json", scheds); * Save settings to qmsched.json
*/
function save() {
require('Storage').writeJSON('qmsched.json', settings);
} }
if (scheds.length && scheds.some(s => "last" in s)) { function get(key, def) {
// cleanup: remove "last" values (used by old versions) return (key in settings) ? settings[key] : def;
scheds = scheds.map(s => { }
delete s.last; function set(key, val) {
return s; settings[key] = val; save();
}); scheds = settings.scheds; options = settings.options; // update references
require("Storage").writeJSON("qmsched.json", scheds); }
function unset(key) {
delete settings[key]; save();
}
let settings,
scheds, options; // references for convenience
/**
* Load settings file, check if we need to migrate old setting formats to new
*/
function loadSettings() {
settings = require('Storage').readJSON("qmsched.json", true) || {};
if (Array.isArray(settings)) {
// migrate old file (plain array of schedules, qmOptions stored in global settings file)
require("Storage").erase("qmsched.json"); // need to erase old file, or Things Break, somehow...
let bOptions = require('Storage').readJSON('setting.json',true)||{};
settings = {
options: bOptions.qmOptions || {},
scheds: settings,
};
// store new format
save();
// and clean up qmOptions from global settings file
delete bOptions.qmOptions;
require('Storage').writeJSON('setting.json',bOptions);
}
// apply defaults
settings = Object.assign({
options: {}, // Bangle options to override during quiet mode, default = none
scheds: [
// default schedule:
{"hr": 8, "mode": 0},
{"hr": 22, "mode": 1},
],
}, settings);
scheds = settings.scheds; options = settings.options;
if (scheds.length && scheds.some(s => "last" in s)) {
// cleanup: remove "last" values (used by older versions)
set('scheds', scheds.map(s => {
delete s.last;
return s;
}));
}
} }
function formatTime(t) { function formatTime(t) {
@ -32,29 +79,35 @@ function formatTime(t) {
} }
function showMainMenu() { function showMainMenu() {
let menu = {"": {"title": "Quiet Mode"}}; let _m, menu = {
"": {"title": "Quiet Mode"},
"< Exit": () => load()
};
// "Current Mode""Silent" won't fit on Bangle.js 2 // "Current Mode""Silent" won't fit on Bangle.js 2
menu["Current" + ((process.env.HWVERSION===2)?"":" Mode")]= { menu["Current"+((process.env.HWVERSION===2) ? "" : " Mode")] = {
value: (require("Storage").readJSON("setting.json", 1) || {}).quiet|0, value: current,
format: v => modeNames[v], format: v => modeNames[v],
onchange: function(v) { onchange: function(v) {
if (v<0) {v = 2;} if (v<0) {v = 2;}
if (v>2) {v = 0;} if (v>2) {v = 0;}
require("qmsched").setMode(v); require("qmsched").setMode(v);
current = v;
this.value = v; this.value = v;
}, },
}; };
scheds.sort((a, b) => (a.hr-b.hr)); scheds.sort((a, b) => (a.hr-b.hr));
scheds.forEach((sched, idx) => { scheds.forEach((sched, idx) => {
const name = modeNames[sched.mode]; menu[formatTime(sched.hr)] = {
const txt = formatTime(sched.hr)+" ".repeat(14-name.length)+name; format: () => modeNames[sched.mode], // abuse format to right-align text
menu[txt] = function() { onchange: function() {
showEditMenu(idx); _m.draw = ()=> {}; // prevent redraw of main menu over edit menu
showEditMenu(idx);
}
}; };
}); });
menu["Add Schedule"] = () => showEditMenu(-1); menu["Add Schedule"] = () => showEditMenu(-1);
menu["< Back"] = () => {load();}; menu["LCD Settings"] = () => showOptionsMenu();
return E.showMenu(menu); _m = E.showMenu(menu);
} }
function showEditMenu(index) { function showEditMenu(index) {
@ -69,6 +122,7 @@ function showEditMenu(index) {
} }
const menu = { const menu = {
"": {"title": (isNew ? "Add" : "Edit")+" Schedule"}, "": {"title": (isNew ? "Add" : "Edit")+" Schedule"},
"< Cancel": () => showMainMenu(),
"Hours": { "Hours": {
value: hrs, value: hrs,
onchange: function(v) { onchange: function(v) {
@ -110,18 +164,88 @@ function showEditMenu(index) {
} else { } else {
scheds[index] = getSched(); scheds[index] = getSched();
} }
require("Storage").writeJSON("qmsched.json", scheds); save();
showMainMenu(); showMainMenu();
}; };
if (!isNew) { if (!isNew) {
menu["> Delete"] = function() { menu["> Delete"] = function() {
scheds.splice(index, 1); scheds.splice(index, 1);
require("Storage").writeJSON("qmsched.json", scheds); save();
showMainMenu(); showMainMenu();
}; };
} }
menu["< Cancel"] = showMainMenu;
return E.showMenu(menu); return E.showMenu(menu);
} }
function showOptionsMenu() {
const disabledFormat = v => v ? "Off" : "-";
function toggle(option) {
// we disable wakeOn* events by setting them to `false` in options
// not disabled = not present in options at all
if (option in options) {
delete options[option];
} else {
options[option] = false;
}
save();
}
let resetTimeout;
const oMenu = {
"": {"title": "LCD Settings"},
"< Back": () => showMainMenu(),
"LCD Brightness": {
value: get("brightness", 0),
min: 0, // 0 = use default
max: 1,
step: 0.1,
format: v => (v>0.05) ? v : "-",
onchange: v => {
if (v>0.05) { // prevent v=0.000000000000001 bugs
set("brightness", v);
Bangle.setLCDBrightness(v); // show result, even if not quiet right now
// restore brightness after half a second
if (resetTimeout) clearTimeout(resetTimeout);
resetTimeout = setTimeout(() => {
resetTimeout = undefined;
require("qmsched").setMode(current);
}, 500);
} else {
unset("brightness");
require("qmsched").setMode(current);
}
},
},
"LCD Timeout": {
value: get("timeout", 0),
min: 0, // 0 = use default (no constant on for quiet mode)
max: 60,
step: 5,
format: v => v>1 ? v : "-",
onchange: v => {
if (v>1) set("timeout", v);
else unset("timeout");
},
},
// we disable wakeOn* events by overwriting them as false in options
// not disabled = not present in options at all
"Wake on FaceUp": {
value: "wakeOnFaceUp" in options,
format: disabledFormat,
onchange: () => {toggle("wakeOnFaceUp");},
},
"Wake on Touch": {
value: "wakeOnTouch" in options,
format: disabledFormat,
onchange: () => {toggle("wakeOnTouch");},
},
"Wake on Twist": {
value: "wakeOnTwist" in options,
format: disabledFormat,
onchange: () => {toggle("wakeOnTwist");},
},
};
return E.showMenu(oMenu);
}
loadSettings();
showMainMenu(); showMainMenu();

View File

@ -1,7 +1,13 @@
// apply Quiet Mode schedules // apply Quiet Mode schedules
(function qm() { (function qm() {
let scheds = require("Storage").readJSON("qmsched.json", 1) || []; let bSettings = require('Storage').readJSON('setting.json',true)||{};
if (!scheds.length) { return;} const curr = 0|bSettings.quiet;
delete bSettings;
if (curr) require("qmsched").applyOptions(curr); // no need to re-apply default options
let settings = require('Storage').readJSON('qmsched.json',true)||{};
let scheds = settings.scheds||[];
if (!scheds.length) {return;}
const now = new Date(), const now = new Date(),
hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour hr = now.getHours()+(now.getMinutes()/60)+(now.getSeconds()/3600); // current (decimal) hour
scheds.sort((a, b) => a.hr-b.hr); scheds.sort((a, b) => a.hr-b.hr);

View File

@ -1,18 +1,23 @@
/**
* Apply LCD options for given mode
* @param {int} mode Quiet Mode
*/
exports.applyOptions = function(mode) {
const s = require("Storage").readJSON(mode ? "qmsched.json" : "setting.json", 1) || {};
const get = (k, d) => k in s ? s[k] : d;
Bangle.setOptions(get("options", {}));
Bangle.setLCDBrightness(get("brightness", 1));
Bangle.setLCDTimeout(get("timeout", 10));
};
/** /**
* Set new Quiet Mode and apply Bangle options * Set new Quiet Mode and apply Bangle options
* @param {int} mode Quiet Mode * @param {int} mode Quiet Mode
*/ */
exports.setMode = function(mode) { exports.setMode = function(mode) {
let s = require("Storage").readJSON("setting.json", 1) || {}; require("Storage").writeJSON("setting.json", Object.assign(
s.quiet = mode; require("Storage").readJSON("setting.json", 1) || {},
require("Storage").writeJSON("setting.json", s); {quiet:mode}
if (s.options) Bangle.setOptions(s.options); ));
if (mode && s.qmOptions) Bangle.setOptions(s.qmOptions); exports.applyOptions(mode);
if (mode && s.qmBrightness) { if (WIDGETS && "qmsched" in WIDGETS) WIDGETS["qmsched"].draw();
if (s.qmBrightness!=1) Bangle.setLCDBrightness(s.qmBrightness);
} else {
if (s.brightness && s.brightness!=1) Bangle.setLCDBrightness(s.brightness);
}
if (mode && s.qmTimeout) Bangle.setLCDTimeout(s.qmTimeout);
if (typeof (WIDGETS)!=="undefined" && "qmsched" in WIDGETS) {WIDGETS["qmsched"].draw();}
}; };

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -16,9 +16,9 @@ WIDGETS["qmsched"] = {
} }
let x = this.x, y = this.y; let x = this.x, y = this.y;
g.clearRect(x, y, x+23, y+23); g.clearRect(x, y, x+23, y+23);
// quiet mode: draw dim red one-way-street sign // quiet mode: draw red one-way-street sign (dim red on Bangle.js 1)
x = this.x+11;y = this.y+11; // center of widget x = this.x+11;y = this.y+11; // center of widget
g.setColor(0.8, 0, 0).fillCircle(x, y, 8); g.setColor(process.env.HWVERSION===2 ? 1 : 0.8, 0, 0).fillCircle(x, y, 8);
g.setColor(g.theme.bg).fillRect(x-6, y-2, x+6, y+2); g.setColor(g.theme.bg).fillRect(x-6, y-2, x+6, y+2);
if (mode>1) {return;} // no alarms if (mode>1) {return;} // no alarms
// alarms still on: draw alarm icon in bottom-right corner // alarms still on: draw alarm icon in bottom-right corner

View File

@ -36,3 +36,4 @@
0.31: Remove Bangle 1 settings when running on Bangle 2 0.31: Remove Bangle 1 settings when running on Bangle 2
0.32: Fix 'beep' menu on Bangle.js 2 0.32: Fix 'beep' menu on Bangle.js 2
0.33: Really fix 'beep' menu on Bangle.js 2 this time 0.33: Really fix 'beep' menu on Bangle.js 2 this time
0.34: Remove Quiet Mode LCD settings: now handled by Quiet Mode Schedule app

View File

@ -44,6 +44,4 @@ The exact effects depend on the app. In general the watch will not wake up by i
- Off: Normal operation - Off: Normal operation
- Alarms: Stops notifications, but "alarm" apps will still work - Alarms: Stops notifications, but "alarm" apps will still work
- Silent: Blocks even alarms - Silent: Blocks even alarms
* **LCD Brightness**, **LCD Timeout**, **Wake on X**:
Override default settings while Quit Mode is active (either as *Alarms* or *Silent*)

View File

@ -7,17 +7,12 @@ let settings;
function updateSettings() { function updateSettings() {
//storage.erase('setting.json'); // - not needed, just causes extra writes if settings were the same //storage.erase('setting.json'); // - not needed, just causes extra writes if settings were the same
if (Object.keys(settings.qmOptions).length === 0) delete settings.qmOptions;
storage.write('setting.json', settings); storage.write('setting.json', settings);
if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in this file
} }
function updateOptions() { function updateOptions() {
updateSettings(); updateSettings();
Bangle.setOptions(settings.options) Bangle.setOptions(settings.options)
if (settings.quiet) {
Bangle.setOptions(settings.qmOptions)
}
} }
function gToInternal(g) { function gToInternal(g) {
@ -56,18 +51,12 @@ function resetSettings() {
twistMaxY: -800, twistMaxY: -800,
twistTimeout: 1000 twistTimeout: 1000
}, },
// Quiet Mode options:
// we only set these if we want to override the default value
// qmOptions: {},
// qmBrightness: undefined,
// qmTimeout: undefined,
}; };
updateSettings(); updateSettings();
} }
settings = storage.readJSON('setting.json', 1); settings = storage.readJSON('setting.json', 1);
if (!settings) resetSettings(); if (!settings) resetSettings();
if (!('qmOptions' in settings)) settings.qmOptions = {}; // easier if this always exists in here
const boolFormat = v => v ? "On" : "Off"; const boolFormat = v => v ? "On" : "Off";
@ -130,7 +119,16 @@ function showMainMenu() {
} }
} }
}, },
"Quiet Mode": ()=>showQuietModeMenu(), "Quiet Mode": {
value: settings.quiet|0,
format: v => ["Off", "Alarms", "Silent"][v%3],
onchange: v => {
settings.quiet = v%3;
updateSettings();
updateOptions();
if ("qmsched" in WIDGETS) WIDGETS["qmsched"].draw();
},
},
'Locale': ()=>showLocaleMenu(), 'Locale': ()=>showLocaleMenu(),
'Select Clock': ()=>showClockMenu(), 'Select Clock': ()=>showClockMenu(),
'Set Time': ()=>showSetTimeMenu(), 'Set Time': ()=>showSetTimeMenu(),
@ -352,9 +350,7 @@ function showLCDMenu() {
onchange: v => { onchange: v => {
settings.brightness = v || 1; settings.brightness = v || 1;
updateSettings(); updateSettings();
if (!(settings.quiet && "qmBrightness" in settings)) { Bangle.setLCDBrightness(settings.brightness);
Bangle.setLCDBrightness(settings.brightness);
}
} }
}, },
'LCD Timeout': { 'LCD Timeout': {
@ -365,9 +361,7 @@ function showLCDMenu() {
onchange: v => { onchange: v => {
settings.timeout = 0 | v; settings.timeout = 0 | v;
updateSettings(); updateSettings();
if (!(settings.quiet && "qmTimeout" in settings)) { Bangle.setLCDTimeout(settings.timeout);
Bangle.setLCDTimeout(settings.timeout);
}
} }
}, },
'Wake on BTN1': { 'Wake on BTN1': {
@ -455,105 +449,6 @@ function showLCDMenu() {
}); });
return E.showMenu(lcdMenu) return E.showMenu(lcdMenu)
} }
function showQuietModeMenu() {
// we always keep settings.quiet and settings.qmOptions
// other qm values are deleted when not set
const modes = ["Off", "Alarms", "Silent"];
const qmDisabledFormat = v => v ? "Off" : "-";
const qmMenu = {
"": {"title": "Quiet Mode"},
"< Back": () => showMainMenu(),
"Quiet Mode": {
value: settings.quiet|0,
format: v => modes[v%3],
onchange: v => {
settings.quiet = v%3;
updateSettings();
updateOptions();
if ("qmsched" in WIDGETS) {WIDGETS["qmsched"].draw();}
},
},
"LCD Brightness": {
value: settings.qmBrightness || 0,
min: 0, // 0 = use default
max: 1,
step: 0.1,
format: v => (v>0.05) ? v : "-",
onchange: v => {
if (v>0.05) { // prevent v=0.000000000000001 bugs
settings.qmBrightness = v;
} else {
delete settings.qmBrightness;
}
updateSettings();
if (settings.qmBrightness) { // show result, even if not quiet right now
Bangle.setLCDBrightness(v);
} else {
Bangle.setLCDBrightness(settings.brightness);
}
},
},
"LCD Timeout": {
value: settings.qmTimeout || 0,
min: 0, // 0 = use default (no constant on for quiet mode)
max: 60,
step: 5,
format: v => v>1 ? v : "-",
onchange: v => {
if (v>1) {
settings.qmTimeout = v;
} else {
delete settings.qmTimeout;
}
updateSettings();
if (settings.quiet && v>1) {
Bangle.setLCDTimeout(v);
} else {
Bangle.setLCDTimeout(settings.timeout);
}
},
},
// we disable wakeOn* events by overwriting them as false in qmOptions
// not disabled = not present in qmOptions at all
"Wake on FaceUp": {
value: "wakeOnFaceUp" in settings.qmOptions,
format: qmDisabledFormat,
onchange: () => {
if ("wakeOnFaceUp" in settings.qmOptions) {
delete settings.qmOptions.wakeOnFaceUp;
} else {
settings.qmOptions.wakeOnFaceUp = false;
}
updateOptions();
},
},
"Wake on Touch": {
value: "wakeOnTouch" in settings.qmOptions,
format: qmDisabledFormat,
onchange: () => {
if ("wakeOnTouch" in settings.qmOptions) {
delete settings.qmOptions.wakeOnTouch;
} else {
settings.qmOptions.wakeOnTouch = false;
}
updateOptions();
},
},
"Wake on Twist": {
value: "wakeOnTwist" in settings.qmOptions,
format: qmDisabledFormat,
onchange: () => {
if ("wakeOnTwist" in settings.qmOptions) {
delete settings.qmOptions.wakeOnTwist;
} else {
settings.qmOptions.wakeOnTwist = false;
}
updateOptions();
},
},
};
return E.showMenu(qmMenu);
}
function showLocaleMenu() { function showLocaleMenu() {
const localemenu = { const localemenu = {