From 79a8f8be470050a84c6b1c6a1eb78d1dea6740fe Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:04:49 +0100 Subject: [PATCH 1/9] promenu: E.showMenu() acts as Bangle.setUI() (i.e. reset) --- apps/promenu/bootb2.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index ab5444113..9ed29affc 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -13,7 +13,12 @@ const prosettings = (require("Storage").readJSON("promenu.settings.json", true) prosettings.naturalScroll ??= false; prosettings.wrapAround ??= true; -E.showMenu = (items?: Menu): MenuInstance => { +E.showMenu = ((items?: Menu): MenuInstance | void => { + if(items == null){ + g.clearRect(Bangle.appRect); + return Bangle.setUI(); + } + const RectRnd = (x1: number, y1: number, x2: number, y2: number, r: number) => { const pp = []; pp.push(...g.quadraticBezier([x2 - r, y1, x2, y1, x2, y1 + r])); @@ -269,4 +274,4 @@ E.showMenu = (items?: Menu): MenuInstance => { } as SetUIArg<"updown">, cb); return l; -}; +}) as typeof E.showMenu; From 7b5a7afb066500c380886f982851748b7d9729a4 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:05:19 +0100 Subject: [PATCH 2/9] promenu: typecheck `back()` --- apps/promenu/bootb2.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index 9ed29affc..55c45445c 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -259,7 +259,7 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { Bangle.setUI({ mode: "updown", - back, + back: back as () => void, remove: () => { if (nameScroller) clearInterval(nameScroller); Bangle.removeListener("swipe", onSwipe); From febeda3375a9de6d569d8e0e7ddcd2b26df4e223 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:06:02 +0100 Subject: [PATCH 3/9] promenu: pull out touch handler --- apps/promenu/bootb2.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index 55c45445c..9794a4f9e 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -257,6 +257,13 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { else l.select(evt); }; + const touchcb = ((_button, xy) => { + // since we've specified options.touch, + // we need to pass through all taps since the default + // touchHandler isn't installed in setUI + cb(void 0, xy); + }) satisfies TouchCallback; + Bangle.setUI({ mode: "updown", back: back as () => void, @@ -265,12 +272,7 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { Bangle.removeListener("swipe", onSwipe); options.remove?.(); }, - touch: ((_button, xy) => { - // since we've specified options.touch, - // we need to pass through all taps since the default - // touchHandler isn't installed in setUI - cb(void 0, xy); - }) satisfies TouchCallback, + touch: touchcb, } as SetUIArg<"updown">, cb); return l; From 25af19d98b207aa04bf88e513f16209b333316ae Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:07:11 +0100 Subject: [PATCH 4/9] promenu: pull out setUI() options --- apps/promenu/bootb2.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index 9794a4f9e..196db3404 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -264,7 +264,7 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { cb(void 0, xy); }) satisfies TouchCallback; - Bangle.setUI({ + const uiopts = { mode: "updown", back: back as () => void, remove: () => { @@ -273,7 +273,9 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { options.remove?.(); }, touch: touchcb, - } as SetUIArg<"updown">, cb); + } as SetUIArg<"updown">; + + Bangle.setUI(uiopts, cb); return l; }) as typeof E.showMenu; From 5ae472358e961f58c6175f1e9a6095aac19301a1 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:08:18 +0100 Subject: [PATCH 5/9] promenu: workaround 2v2[67] bug - use separate touch handler See: - 8b2e5a5 - https://github.com/orgs/espruino/discussions/7697#discussioncomment-13782299 - https://github.com/espruino/Espruino/issues/2648#issuecomment-3095831472 --- apps/promenu/bootb2.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index 196db3404..46fe112fc 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -270,12 +270,26 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { remove: () => { if (nameScroller) clearInterval(nameScroller); Bangle.removeListener("swipe", onSwipe); + if(is2v26_27) + Bangle.removeListener("touch", touchcb); options.remove?.(); }, - touch: touchcb, - } as SetUIArg<"updown">; + } satisfies SetUIArg<"updown">; + + const is2v26_27 = process.env.VERSION === "2v26" || process.env.VERSION === "2v27"; + if (!is2v26_27) { + // no need for workaround + (uiopts as any).touch = touchcb; + } Bangle.setUI(uiopts, cb); + if(is2v26_27){ + // work around: + // - https://github.com/espruino/Espruino/issues/2648 + // - https://github.com/orgs/espruino/discussions/7697#discussioncomment-13782299 + Bangle.on("touch", touchcb); + } + return l; }) as typeof E.showMenu; From 372dfed735f26b0ad0229f661b2c1f26e22d5662 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:10:19 +0100 Subject: [PATCH 6/9] promenu: generate js --- apps/promenu/bootb2.js | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/apps/promenu/bootb2.js b/apps/promenu/bootb2.js index 368bc623b..504f2d51b 100644 --- a/apps/promenu/bootb2.js +++ b/apps/promenu/bootb2.js @@ -2,7 +2,11 @@ var _a, _b; var prosettings = (require("Storage").readJSON("promenu.settings.json", true) || {}); (_a = prosettings.naturalScroll) !== null && _a !== void 0 ? _a : (prosettings.naturalScroll = false); (_b = prosettings.wrapAround) !== null && _b !== void 0 ? _b : (prosettings.wrapAround = true); -E.showMenu = function (items) { +E.showMenu = (function (items) { + if (items == null) { + g.clearRect(Bangle.appRect); + return Bangle.setUI(); + } var RectRnd = function (x1, y1, x2, y2, r) { var pp = []; pp.push.apply(pp, g.quadraticBezier([x2 - r, y1, x2, y1, x2, y1 + r])); @@ -204,7 +208,10 @@ E.showMenu = function (items) { else l.select(evt); }; - Bangle.setUI({ + var touchcb = (function (_button, xy) { + cb(void 0, xy); + }); + var uiopts = { mode: "updown", back: back, remove: function () { @@ -212,11 +219,18 @@ E.showMenu = function (items) { if (nameScroller) clearInterval(nameScroller); Bangle.removeListener("swipe", onSwipe); + if (is2v26_27) + Bangle.removeListener("touch", touchcb); (_a = options.remove) === null || _a === void 0 ? void 0 : _a.call(options); }, - touch: (function (_button, xy) { - cb(void 0, xy); - }), - }, cb); + }; + var is2v26_27 = process.env.VERSION === "2v26" || process.env.VERSION === "2v27"; + if (!is2v26_27) { + uiopts.touch = touchcb; + } + Bangle.setUI(uiopts, cb); + if (is2v26_27) { + Bangle.on("touch", touchcb); + } return l; -}; +}); From 65b9dbd3885e8174da9802bd7227d914e9e70455 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:11:14 +0100 Subject: [PATCH 7/9] promenu: bump version --- apps/promenu/ChangeLog | 1 + apps/promenu/metadata.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/promenu/ChangeLog b/apps/promenu/ChangeLog index 6cf4b09b8..174ff7e22 100644 --- a/apps/promenu/ChangeLog +++ b/apps/promenu/ChangeLog @@ -16,3 +16,4 @@ 0.12: Fix bug where settings would behave as if all were set to false 0.13: Update to new touch-event handling 0.14: Fix bug in handling changes to `Bangle.appRect` +0.15: Workaround bug in 2v26/2v27 firmware diff --git a/apps/promenu/metadata.json b/apps/promenu/metadata.json index cd7e66e99..cfbd1ebd8 100644 --- a/apps/promenu/metadata.json +++ b/apps/promenu/metadata.json @@ -1,7 +1,7 @@ { "id": "promenu", "name": "Pro Menu", - "version": "0.14", + "version": "0.15", "description": "Replace the built in menu function. Supports Bangle.js 1 and Bangle.js 2.", "icon": "icon.png", "type": "bootloader", From c0545cf2c2c83f96707c4350a0867c82ec07c7fc Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:33:47 +0100 Subject: [PATCH 8/9] promenu: remove redundant setColor --- apps/promenu/bootb2.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index 46fe112fc..dd92a9deb 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -172,7 +172,6 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { }, 300, name, v, item, idx, x, iy); } - g.setColor(g.theme.fg); iy += fontHeight; idx++; } From 2c51bc80e56aad4b3a5e8f5bcab5fec5094e7879 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:54:14 +0100 Subject: [PATCH 9/9] promenu: fix double-render from having two callbacks with "updown" --- apps/promenu/bootb2.js | 11 ++++++----- apps/promenu/bootb2.ts | 20 ++++++++++++++------ 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/apps/promenu/bootb2.js b/apps/promenu/bootb2.js index 504f2d51b..f458e426f 100644 --- a/apps/promenu/bootb2.js +++ b/apps/promenu/bootb2.js @@ -126,7 +126,6 @@ E.showMenu = (function (items) { nameScroll_1 = 0; }, 300, name, v, item, idx, x, iy); } - g.setColor(g.theme.fg); iy += fontHeight; idx++; }; @@ -219,17 +218,19 @@ E.showMenu = (function (items) { if (nameScroller) clearInterval(nameScroller); Bangle.removeListener("swipe", onSwipe); - if (is2v26_27) + if (setUITouch) Bangle.removeListener("touch", touchcb); (_a = options.remove) === null || _a === void 0 ? void 0 : _a.call(options); }, }; - var is2v26_27 = process.env.VERSION === "2v26" || process.env.VERSION === "2v27"; - if (!is2v26_27) { + var setUITouch = process.env.VERSION >= "2v26"; + if (!setUITouch) { uiopts.touch = touchcb; } Bangle.setUI(uiopts, cb); - if (is2v26_27) { + if (setUITouch) { + Bangle.removeListener("touch", Bangle.touchHandler); + delete Bangle.touchHandler; Bangle.on("touch", touchcb); } return l; diff --git a/apps/promenu/bootb2.ts b/apps/promenu/bootb2.ts index dd92a9deb..0306128f1 100644 --- a/apps/promenu/bootb2.ts +++ b/apps/promenu/bootb2.ts @@ -269,24 +269,32 @@ E.showMenu = ((items?: Menu): MenuInstance | void => { remove: () => { if (nameScroller) clearInterval(nameScroller); Bangle.removeListener("swipe", onSwipe); - if(is2v26_27) + if(setUITouch) Bangle.removeListener("touch", touchcb); options.remove?.(); }, } satisfies SetUIArg<"updown">; - const is2v26_27 = process.env.VERSION === "2v26" || process.env.VERSION === "2v27"; - if (!is2v26_27) { - // no need for workaround + // does setUI install its own touch handler? + const setUITouch = process.env.VERSION >= "2v26"; + if (!setUITouch) { + // old firmware, we can use its touch handler - no need for workaround (uiopts as any).touch = touchcb; } Bangle.setUI(uiopts, cb); - if(is2v26_27){ - // work around: + if(setUITouch){ + // new firmware, remove setUI's touch handler and use just our own to + // avoid `cb` drawing the menu (as part of setUI's touch handler) + // followed by us drawing the menu (as part of our touch handler) + // + // work around details: // - https://github.com/espruino/Espruino/issues/2648 // - https://github.com/orgs/espruino/discussions/7697#discussioncomment-13782299 + Bangle.removeListener("touch", (Bangle as any).touchHandler); + delete (Bangle as any).touchHandler; + Bangle.on("touch", touchcb); }