From 2c51bc80e56aad4b3a5e8f5bcab5fec5094e7879 Mon Sep 17 00:00:00 2001 From: Rob Pilling Date: Wed, 23 Jul 2025 20:54:14 +0100 Subject: [PATCH] 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); }