From fbe1cf0fce3533cccfacfc855c4dd2504f4ecb4c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 29 Aug 2023 21:04:09 +0200 Subject: [PATCH 01/39] messagesoverlay - Autoclear messages after timeout --- apps/messagesoverlay/lib.js | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index feb9ff379..6f848a227 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -23,6 +23,8 @@ let settings = { fontMedium:"Vector:14", fontBig:"Vector:20", fontLarge:"Vector:30", + timeout: 10, + reemit: true }; let eventQueue = []; @@ -230,10 +232,11 @@ let next = function(ovr) { if (eventQueue.length == 0) { LOG("no element in queue - closing"); cleanup(); - return; + return false; } showMessage(ovr, eventQueue[0]); + return true; }; let callBuzzTimer = null; @@ -427,6 +430,7 @@ let main = function(ovr, event) { }; let ovr; +let clearingTimeout; exports.message = function(type, event) { LOG("Got message", type, event); @@ -434,6 +438,7 @@ exports.message = function(type, event) { if(!(type=="text" || type == "call")) return; if(type=="text" && event.id == "nav") return; if(event.handled) return; + if(event.messagesoverlayignore) return; bpp = 4; if (process.memory().free < LOW_MEM) @@ -460,6 +465,25 @@ exports.message = function(type, event) { ovr.theme = { fg:0, bg:1, fg2:1, bg2:0, fgH:1, bgH:0 }; main(ovr, event); + + + let updateClearingTimeout = ()=>{ + LOG("updateClearingTimeout"); + if (clearingTimeout) clearTimeout(clearingTimeout); + clearingTimeout = setTimeout(()=>{ + LOG("setNewTimeut"); + let current = eventQueue.pop(); + if (eventQueue.length > 0){ + LOG("still got elements"); + updateClearingTimeout(); + } else { + cleanup(); + } + }, settings.timeout * 1000); + }; + + updateClearingTimeout(); + if (!isQuiet()) Bangle.setLCDPower(1); event.handled = true; g = _g; From 9e44a13ccd338e644268eaae5b75f8a52f005594 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 28 Mar 2024 15:37:17 +0100 Subject: [PATCH 02/39] messagesoverlay - Add settings --- apps/messagesoverlay/default.json | 6 +++ apps/messagesoverlay/lib.js | 39 +++++++++-------- apps/messagesoverlay/metadata.json | 5 ++- apps/messagesoverlay/settings.js | 69 ++++++++++++++++++++++++++++++ 4 files changed, 100 insertions(+), 19 deletions(-) create mode 100644 apps/messagesoverlay/default.json create mode 100644 apps/messagesoverlay/settings.js diff --git a/apps/messagesoverlay/default.json b/apps/messagesoverlay/default.json new file mode 100644 index 000000000..be3838db6 --- /dev/null +++ b/apps/messagesoverlay/default.json @@ -0,0 +1,6 @@ +{ + "autoclear": 30, + "border": 10, + "minfreemem": 2, + "lowmem": 4 +} \ No newline at end of file diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 6f848a227..e0a414ac1 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -1,14 +1,26 @@ -const MIN_FREE_MEM = 1000; -const LOW_MEM = 2000; -const ovrx = 10; -const ovry = 10; -const ovrw = g.getWidth()-2*ovrx; -const ovrh = g.getHeight()-2*ovry; let _g = g; let lockListener; let quiet; +var settings = Object.assign( + require('Storage').readJSON("messagesoverlay.default.json", true) || {}, + require('Storage').readJSON("messagesoverlay.json", true) || {} +); + +settings = Object.assign({ + fontSmall:"6x8", + fontMedium:"Vector:14", + fontBig:"Vector:20", + fontLarge:"Vector:30", + reemit: true +}, settings); + +const ovrx = settings.border; +const ovry = ovrx; +const ovrw = g.getWidth()-2*ovrx; +const ovrh = g.getHeight()-2*ovry; + let LOG = function() { //print.apply(null, arguments); }; @@ -18,15 +30,6 @@ let isQuiet = function(){ return quiet; }; -let settings = { - fontSmall:"6x8", - fontMedium:"Vector:14", - fontBig:"Vector:20", - fontLarge:"Vector:30", - timeout: 10, - reemit: true -}; - let eventQueue = []; let callInProgress = false; @@ -441,10 +444,10 @@ exports.message = function(type, event) { if(event.messagesoverlayignore) return; bpp = 4; - if (process.memory().free < LOW_MEM) + if (process.memory().free < settings.lowmwm) bpp = 1; - while (process.memory().free < MIN_FREE_MEM && eventQueue.length > 0){ + while (process.memory().free < settings.minfreemem && eventQueue.length > 0){ let dropped = eventQueue.pop(); print("Dropped message because of memory constraints", dropped); } @@ -479,7 +482,7 @@ exports.message = function(type, event) { } else { cleanup(); } - }, settings.timeout * 1000); + }, settings.autoclear * 1000); }; updateClearingTimeout(); diff --git a/apps/messagesoverlay/metadata.json b/apps/messagesoverlay/metadata.json index c16a41f5c..a666ed7f0 100644 --- a/apps/messagesoverlay/metadata.json +++ b/apps/messagesoverlay/metadata.json @@ -11,7 +11,10 @@ "readme": "README.md", "storage": [ {"name":"messagesoverlay","url":"lib.js"}, - {"name":"messagesoverlay.0.boot.js","url":"boot.js"} + {"name":"messagesoverlay.0.boot.js","url":"boot.js"}, + {"name":"messagesoverlay.settings.js","url":"settings.js"}, + {"name":"messagesoverlay.default.json","url":"default.json"} ], + "data": [{"name":"bthrm.json"}], "screenshots": [{"url":"screen_call.png"} ,{"url":"screen_message.png"} ] } diff --git a/apps/messagesoverlay/settings.js b/apps/messagesoverlay/settings.js new file mode 100644 index 000000000..392398813 --- /dev/null +++ b/apps/messagesoverlay/settings.js @@ -0,0 +1,69 @@ +(function(back) { + function writeSettings(key, value) { + var s = require('Storage').readJSON(FILE, true) || {}; + s[key] = value; + require('Storage').writeJSON(FILE, s); + readSettings(); + } + + function readSettings(){ + settings = Object.assign( + require('Storage').readJSON("messagesoverlay.default.json", true) || {}, + require('Storage').readJSON(FILE, true) || {} + ); + } + + var FILE="messagesoverlay.json"; + var settings; + readSettings(); + + function buildMainMenu(){ + var mainmenu = { + '' : { title: "Messages Overlay"}, + '< Back': back, + 'Border': { + value: settings.border, + min: 0, + max: Math.floor(g.getWidth()/2-50), + step: 1, + format: v=>v + "px", + onchange: v => { + writeSettings("border",v); + } + }, + 'Autoclear after': { + value: settings.autoclear, + min: 0, + max: 3600, + step: 10, + format: v=>v>0?v+"s":"Off", + onchange: v => { + writeSettings("autoclear",v); + } + }, + 'Min. free RAM': { + value: settings.minfreemem, + min: 0, + max: process.memory().total/1000, + step: 1, + format: v=>v + "k free", + onchange: v => { + writeSettings("minfreemem",v); + } + }, + 'Low RAM mode': { + value: settings.lowmem, + min: 0, + max: process.memory().total/1000, + step: 1, + format: v=>v + "k free", + onchange: v => { + writeSettings("lowmem",v); + } + } + }; + return mainmenu; + } + + E.showMenu(buildMainMenu()); +}); From 78c048177028d03ccb2585574f232bd36302bb83 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 28 Mar 2024 16:43:01 +0100 Subject: [PATCH 03/39] messagesoverlay - Add indicator for multiple messages in the queue --- apps/messagesoverlay/lib.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index e0a414ac1..83cbfd704 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -300,7 +300,7 @@ let drawMessage = function(ovr, msg) { if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; let bodyFont = typeof msg.bodyFont === "undefined" ? settings.fontMedium : msg.bodyFont; - let Padding = 3; + let Padding = 3 + eventQueue.length > 1 ? 2 : 0; if (typeof msg.lines === "undefined") { ovr.setFont(bodyFont); msg.lines = MyWrapString(msg.body, ovr.getWidth() - (Padding * 2)); @@ -321,6 +321,16 @@ let drawMessage = function(ovr, msg) { ovr.setBgColor(ovr.theme.bg); ovr.setColor(ovr.theme.fg); ovr.clearRect(2, yText, ovrw-3, ovrh-3); + + if (eventQueue.length > 1){ + ovr.drawLine(ovr.getWidth()-4,ovr.getHeight()/2,ovr.getWidth()-4,ovr.getHeight()-4); + ovr.drawLine(ovr.getWidth()/2,ovr.getHeight()-4,ovr.getWidth()-4,ovr.getHeight()-4); + } + if (eventQueue.length > 3){ + ovr.drawLine(ovr.getWidth()-6,ovr.getHeight()*0.6,ovr.getWidth()-6,ovr.getHeight()-6); + ovr.drawLine(ovr.getWidth()*0.6,ovr.getHeight()-6,ovr.getWidth()-6,ovr.getHeight()-6); + } + let xText = Padding; yText += Padding; ovr.setFont(bodyFont); From ccdf14e3b6de2b70b55f74b75b5e997e6872958e Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 28 Mar 2024 20:30:17 +0100 Subject: [PATCH 04/39] messagesoverlay - Handle the auto clearing in lock events --- apps/messagesoverlay/lib.js | 40 +++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 83cbfd704..9432daa7b 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -419,7 +419,8 @@ let main = function(ovr, event) { LOG("Main", event, settings); if (!lockListener) { - lockListener = function (){ + lockListener = function (e){ + updateClearingTimeout(); drawBorder(); }; Bangle.on('lock', lockListener); @@ -445,6 +446,27 @@ let main = function(ovr, event) { let ovr; let clearingTimeout; +let updateClearingTimeout = ()=>{ + LOG("updateClearingTimeout"); + if (settings.autoclear >= 0) + return; + if (clearingTimeout) clearTimeout(clearingTimeout); + if (Bangle.isLocked()){ + clearingTimeout = setTimeout(()=>{ + LOG("setNewTimeut"); + let current = eventQueue.pop(); + if (eventQueue.length > 0){ + LOG("still got elements"); + updateClearingTimeout(); + } else { + cleanup(); + } + }, settings.autoclear * 1000); + } else { + clearingTimeout = undefined; + } +}; + exports.message = function(type, event) { LOG("Got message", type, event); // only handle some event types @@ -479,22 +501,6 @@ exports.message = function(type, event) { main(ovr, event); - - let updateClearingTimeout = ()=>{ - LOG("updateClearingTimeout"); - if (clearingTimeout) clearTimeout(clearingTimeout); - clearingTimeout = setTimeout(()=>{ - LOG("setNewTimeut"); - let current = eventQueue.pop(); - if (eventQueue.length > 0){ - LOG("still got elements"); - updateClearingTimeout(); - } else { - cleanup(); - } - }, settings.autoclear * 1000); - }; - updateClearingTimeout(); if (!isQuiet()) Bangle.setLCDPower(1); From 5485d270cf85632f9f84cb656503d08a70394055 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 28 Mar 2024 22:56:23 +0100 Subject: [PATCH 05/39] messagesoverlay - Refactor rendering code, only render short messages centered --- apps/messagesoverlay/lib.js | 75 +++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 9432daa7b..27a4e7569 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -11,7 +11,7 @@ var settings = Object.assign( settings = Object.assign({ fontSmall:"6x8", fontMedium:"Vector:14", - fontBig:"Vector:20", + fontBig:g.getFonts().includes("Vector") ? "Vector:20" : "6x8:3", fontLarge:"Vector:30", reemit: true }, settings); @@ -107,6 +107,8 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ ovr.setBgColor(ovr.theme.bg2); ovr.clearRect(2,2,ovr.getWidth()-3,37); + ovr.drawRect(2,38,ovr.getWidth()-2,39); + ovr.setColor(ovr.theme.fg2); ovr.setFont(settings.fontSmall); ovr.setFontAlign(0,-1); @@ -139,7 +141,6 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ let showMessage = function(ovr, msg) { LOG("showMessage"); - ovr.setBgColor(ovr.theme.bg); if (typeof msg.CanscrollDown === "undefined") msg.CanscrollDown = false; @@ -162,12 +163,12 @@ let showMessage = function(ovr, msg) { drawScreen(ovr, title, titleFont, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); + drawMessage(ovr, msg); + if (!isQuiet() && msg.new) { msg.new = false; Bangle.buzz(); } - - drawMessage(ovr, msg); }; let drawBorder = function(img) { @@ -251,12 +252,10 @@ let stopCallBuzz = function() { }; let drawTriangleUp = function(ovr) { - ovr.reset(); ovr.fillPoly([ovr.getWidth()-9, 46,ovr.getWidth()-14, 56,ovr.getWidth()-4, 56]); }; let drawTriangleDown = function(ovr) { - ovr.reset(); ovr.fillPoly([ovr.getWidth()-9, ovr.getHeight()-6, ovr.getWidth()-14, ovr.getHeight()-16, ovr.getWidth()-4, ovr.getHeight()-16]); }; @@ -292,35 +291,55 @@ let scrollDown = function(ovr) { }; let drawMessage = function(ovr, msg) { - let MyWrapString = function(str, maxWidth) { + let wrapString = function(str, maxWidth) { str = str.replace("\r\n", "\n").replace("\r", "\n"); return ovr.wrapString(str, maxWidth); }; if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; - let bodyFont = typeof msg.bodyFont === "undefined" ? settings.fontMedium : msg.bodyFont; - let Padding = 3 + eventQueue.length > 1 ? 2 : 0; + let padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; + + let yText = 40; + let yLine = yText + 3; + if (typeof msg.lines === "undefined") { + let bodyFont = settings.fontBig; ovr.setFont(bodyFont); - msg.lines = MyWrapString(msg.body, ovr.getWidth() - (Padding * 2)); - if (msg.lines.length <= 2) { - bodyFont = ovr.getFonts().includes("Vector") ? "Vector:20" : "6x8:3"; + msg.lines = wrapString(msg.body, ovr.getWidth() - 4 - padding); + if (msg.lines.length * (ovr.getFontHeight() + 1) > ovr.getHeight() - yLine - padding) { + bodyFont = settings.fontMedium; ovr.setFont(bodyFont); - msg.lines = MyWrapString(msg.body, ovr.getWidth() - (Padding * 2)); - msg.bodyFont = bodyFont; + msg.lines = wrapString(msg.body, ovr.getWidth() - 4 - padding); } + msg.bodyFont = bodyFont; } - let NumLines = 7; + ovr.setFont(msg.bodyFont); + + let textHeight = ovr.getFontHeight() + 1; - let linesToPrint = (msg.lines.length > NumLines) ? msg.lines.slice(msg.FirstLine, msg.FirstLine + NumLines) : msg.lines; + let numLines = Math.floor((ovr.getHeight() - yText - padding - 4)/textHeight); - let yText = 40; + let linesToPrint = (msg.lines.length > numLines) ? msg.lines.slice(msg.FirstLine, msg.FirstLine + numLines + 1) : msg.lines; ovr.setBgColor(ovr.theme.bg); ovr.setColor(ovr.theme.fg); - ovr.clearRect(2, yText, ovrw-3, ovrh-3); + ovr.clearRect(2, yText, ovr.getWidth()-3, ovr.getHeight()-3); + + let xText = 4; + + if (msg.bodyFont == settings.fontBig) { + ovr.setFontAlign(0, -1); + xText = Math.round(ovr.getWidth() / 2 - (padding - 3) / 2) + 1; + yLine = (ovr.getHeight() + yLine) / 2 - (textHeight * msg.lines.length / 2); + } else + ovr.setFontAlign(-1, -1); + + linesToPrint.forEach((line, i) => { + ovr.drawString(line, xText, yLine); + yLine += textHeight; + }); if (eventQueue.length > 1){ ovr.drawLine(ovr.getWidth()-4,ovr.getHeight()/2,ovr.getWidth()-4,ovr.getHeight()-4); @@ -331,24 +350,7 @@ let drawMessage = function(ovr, msg) { ovr.drawLine(ovr.getWidth()*0.6,ovr.getHeight()-6,ovr.getWidth()-6,ovr.getHeight()-6); } - let xText = Padding; - yText += Padding; - ovr.setFont(bodyFont); - let HText = ovr.getFontHeight(); - - yText = ((ovrh - yText) / 2) - (linesToPrint.length * HText / 2) + yText; - - if (linesToPrint.length <= 3) { - ovr.setFontAlign(0, -1); - xText = ovr.getWidth() / 2; - } else - ovr.setFontAlign(-1, -1); - - - linesToPrint.forEach((line, i) => { - ovr.drawString(line, xText, yText + HText * i); - }); - + ovr.setColor(ovr.theme.fg2); if (msg.FirstLine != 0) { msg.CanscrollUp = true; drawTriangleUp(ovr); @@ -360,6 +362,7 @@ let drawMessage = function(ovr, msg) { drawTriangleDown(ovr); } else msg.CanscrollDown = false; + show(ovr); if (!isQuiet()) Bangle.setLCDPower(1); }; From aff915cc203bf7da38829088323a35b223231918 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 08:57:53 +0100 Subject: [PATCH 06/39] messagesoverlay - Update README --- apps/messagesoverlay/README.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/apps/messagesoverlay/README.md b/apps/messagesoverlay/README.md index 8ce1cc64d..7579b35ac 100644 --- a/apps/messagesoverlay/README.md +++ b/apps/messagesoverlay/README.md @@ -10,12 +10,9 @@ Messages are ephemeral and not stored on the Bangle. Close app by tapping the X and scroll by swiping. The border of the pop up changes color if the Bangle is locked. The color depends on your currently active theme. -## Firmware hint -Current stable firmware draws incorrect colors for emojis. Nightly firmware builds correct this. - ## Low memory mode -If free memory is below 2000 blocks, the overlay automatically only uses 1 bit depth. Default uses roundabout 1300 blocks, while low memory mode uses about 600. +If free memory is below a configured number of blocks (default is 4000), the overlay automatically only uses 1 bit depth. Default mode uses roundabout 1300 blocks, while low memory mode uses about 600. ## Creator From 49c5730757bdc9a91d1c760462831e8079760049 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 09:00:28 +0100 Subject: [PATCH 07/39] messagesoverlay - Update ChangeLog --- apps/messagesoverlay/ChangeLog | 4 ++++ apps/messagesoverlay/metadata.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/messagesoverlay/ChangeLog b/apps/messagesoverlay/ChangeLog index 47aa51107..a1beec182 100644 --- a/apps/messagesoverlay/ChangeLog +++ b/apps/messagesoverlay/ChangeLog @@ -5,3 +5,7 @@ 0.05: Fix the overlay keeping the LCD on 0.06: Better low memory handling Fix first message beeing displayed again on unlock +0.07: Adds settings + Automatic discard of oldest messages + Indicator for multiple messages in queue + Some optimization in the rendering code \ No newline at end of file diff --git a/apps/messagesoverlay/metadata.json b/apps/messagesoverlay/metadata.json index a666ed7f0..8487aabf1 100644 --- a/apps/messagesoverlay/metadata.json +++ b/apps/messagesoverlay/metadata.json @@ -1,7 +1,7 @@ { "id": "messagesoverlay", "name": "Messages Overlay", - "version": "0.06", + "version": "0.07", "description": "An overlay based implementation of a messages UI (display notifications from iOS and Gadgetbridge/Android)", "icon": "app.png", "type": "bootloader", From e75c7563e0c4faca3d0479861c10c529c2da6b1b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 09:23:49 +0100 Subject: [PATCH 08/39] messagesoverlay - Do not manipulate global graphics object --- apps/messagesoverlay/lib.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 27a4e7569..d18d57b4d 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -1,5 +1,3 @@ -let _g = g; - let lockListener; let quiet; @@ -38,7 +36,7 @@ let show = function(ovr){ LOG("show", img.getBPP()); if (ovr.getBPP() == 1) { img = ovr.asImage(); - img.palette = new Uint16Array([_g.theme.fg,_g.theme.bg]); + img.palette = new Uint16Array([g.theme.fg,g.theme.bg]); } Bangle.setLCDOverlay(img, ovrx, ovry); }; @@ -386,7 +384,7 @@ let getTouchHandler = function(ovr){ }; let restoreHandler = function(event){ - LOG("Restore", event, backup[event]); + LOG("Restore", backup[event]); Bangle.removeAllListeners(event); Bangle["#on" + event]=backup[event]; backup[event] = undefined; @@ -419,7 +417,7 @@ let backup = {}; let backupDone = false; let main = function(ovr, event) { - LOG("Main", event, settings); + LOG("Main", event.t); if (!lockListener) { lockListener = function (e){ @@ -471,7 +469,7 @@ let updateClearingTimeout = ()=>{ }; exports.message = function(type, event) { - LOG("Got message", type, event); + LOG("Got message", type); // only handle some event types if(!(type=="text" || type == "call")) return; if(type=="text" && event.id == "nav") return; @@ -491,22 +489,19 @@ exports.message = function(type, event) { ovr = Graphics.createArrayBuffer(ovrw, ovrh, bpp, { msb: true }); - } else { - ovr.clear(); } - g = ovr; - if (bpp == 4) ovr.theme = g.theme; else ovr.theme = { fg:0, bg:1, fg2:1, bg2:0, fgH:1, bgH:0 }; + ovr.clear(); + main(ovr, event); updateClearingTimeout(); if (!isQuiet()) Bangle.setLCDPower(1); event.handled = true; - g = _g; }; From 1fffa9b30a342f854a0de2317e4d979db40257b3 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 09:27:40 +0100 Subject: [PATCH 09/39] messagesoverlay - Rework logging --- apps/messagesoverlay/lib.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index d18d57b4d..96903f132 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -19,9 +19,8 @@ const ovry = ovrx; const ovrw = g.getWidth()-2*ovrx; const ovrh = g.getHeight()-2*ovry; -let LOG = function() { - //print.apply(null, arguments); -}; +let LOG=()=>{}; +//LOG = function() { print.apply(null, arguments);}; let isQuiet = function(){ if (quiet == undefined) quiet = (require('Storage').readJSON('setting.json', 1) || {}).quiet; From f3c0991dfa5ad20970f253538bf327cf674b5ef9 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 17:51:46 +0100 Subject: [PATCH 10/39] messagesoverlay - Only switch backlight on for new messages --- apps/messagesoverlay/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 96903f132..807b26f3b 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -165,6 +165,7 @@ let showMessage = function(ovr, msg) { if (!isQuiet() && msg.new) { msg.new = false; Bangle.buzz(); + Bangle.setLCDPower(1); } }; @@ -361,7 +362,6 @@ let drawMessage = function(ovr, msg) { msg.CanscrollDown = false; show(ovr); - if (!isQuiet()) Bangle.setLCDPower(1); }; let getSwipeHandler = function(ovr){ From 5c8817e86a9c73d9c4ff5c462684247baf4160c7 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 17:52:24 +0100 Subject: [PATCH 11/39] messagesoverlay - Use correct color for border between title and message --- apps/messagesoverlay/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 807b26f3b..a501cf4ec 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -101,7 +101,7 @@ let roundedRect = function(ovr, x,y,w,h,filled){ }; let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ - ovr.setBgColor(ovr.theme.bg2); + ovr.setBgColor(ovr.theme.bg); ovr.clearRect(2,2,ovr.getWidth()-3,37); ovr.drawRect(2,38,ovr.getWidth()-2,39); From ab10887a18be8e64336061b6ce5b457160b6f656 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 17:53:10 +0100 Subject: [PATCH 12/39] messagesoverlay - Fix auto discard setting interpretation --- apps/messagesoverlay/lib.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index a501cf4ec..d0c3c3e9f 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -448,13 +448,15 @@ let clearingTimeout; let updateClearingTimeout = ()=>{ LOG("updateClearingTimeout"); - if (settings.autoclear >= 0) + if (settings.autoclear <= 0) return; + LOG("Remove clearing timeout", clearingTimeout); if (clearingTimeout) clearTimeout(clearingTimeout); if (Bangle.isLocked()){ + LOG("Set new clearing timeout"); clearingTimeout = setTimeout(()=>{ - LOG("setNewTimeut"); - let current = eventQueue.pop(); + LOG("setNewTimeout"); + eventQueue.pop(); if (eventQueue.length > 0){ LOG("still got elements"); updateClearingTimeout(); From 56330543ec18dfe7a1627415c9389abd15facfae Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 18:09:26 +0100 Subject: [PATCH 13/39] messagesoverlay - Shift some colors around --- apps/messagesoverlay/lib.js | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index d0c3c3e9f..14e25b6b7 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -101,10 +101,9 @@ let roundedRect = function(ovr, x,y,w,h,filled){ }; let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ + ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); ovr.clearRect(2,2,ovr.getWidth()-3,37); - - ovr.drawRect(2,38,ovr.getWidth()-2,39); ovr.setColor(ovr.theme.fg2); ovr.setFont(settings.fontSmall); @@ -123,7 +122,7 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ ovr.setFont(titleFont); if (title) ovr.drawString(title, textCenter, 38/2 + 5); - ovr.setColor(ovr.theme.fg2); + ovr.setColor(ovr.theme.fg); ovr.setFont(settings.fontMedium); roundedRect(ovr, ovr.getWidth()-26,5,22,30,false); @@ -171,13 +170,15 @@ let showMessage = function(ovr, msg) { let drawBorder = function(img) { LOG("drawBorder", isQuiet()); + ovr.setBgColor(ovr.theme.bg); if (img) ovr=img; if (Bangle.isLocked()) - ovr.setColor(ovr.theme.fgH); - else ovr.setColor(ovr.theme.fg); + else + ovr.setColor(ovr.theme.fgH); ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); + ovr.drawRect(2,38,ovr.getWidth()-2,39); show(ovr); }; @@ -294,6 +295,9 @@ let drawMessage = function(ovr, msg) { return ovr.wrapString(str, maxWidth); }; + ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); + if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; let padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; @@ -492,6 +496,8 @@ exports.message = function(type, event) { }); } + ovr.reset(); + if (bpp == 4) ovr.theme = g.theme; else From e0a9d2680c31084ca70bfa9602072d633bd856d8 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 18:14:55 +0100 Subject: [PATCH 14/39] messagesoverlay - Only buzz once per 2 seconds --- apps/messagesoverlay/lib.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 14e25b6b7..548f6eee1 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -29,6 +29,7 @@ let isQuiet = function(){ let eventQueue = []; let callInProgress = false; +let buzzing = false; let show = function(ovr){ let img = ovr; @@ -163,7 +164,10 @@ let showMessage = function(ovr, msg) { if (!isQuiet() && msg.new) { msg.new = false; - Bangle.buzz(); + if (!buzzing){ + buzzing = true; + Bangle.buzz().then(()=>{setTimeout(()=>{buzzing = false;},2000)}); + } Bangle.setLCDPower(1); } }; From 5a83e1b8fab3b12b770e0adcdc22a8201a7ecbaf Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 29 Mar 2024 23:12:53 +0100 Subject: [PATCH 15/39] messagesoverlay - Take image height into consideration for lines --- apps/messagesoverlay/lib.js | 70 ++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 25 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 548f6eee1..d86b4e36b 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -262,7 +262,6 @@ let drawTriangleDown = function(ovr) { ovr.fillPoly([ovr.getWidth()-9, ovr.getHeight()-6, ovr.getWidth()-14, ovr.getHeight()-16, ovr.getWidth()-4, ovr.getHeight()-16]); }; -let linesScroll = 6; let scrollUp = function(ovr) { msg = eventQueue[0]; @@ -274,7 +273,7 @@ let scrollUp = function(ovr) { if (!msg.CanscrollUp) return; - msg.FirstLine = msg.FirstLine > 0 ? msg.FirstLine - linesScroll : 0; + msg.FirstLine = msg.FirstLine > 0 ? msg.FirstLine - 1 : 0; drawMessage(ovr, msg); }; @@ -289,7 +288,7 @@ let scrollDown = function(ovr) { if (!msg.CanscrollDown) return; - msg.FirstLine = msg.FirstLine + linesScroll; + msg.FirstLine = msg.FirstLine + 1; drawMessage(ovr, msg); }; @@ -298,6 +297,14 @@ let drawMessage = function(ovr, msg) { str = str.replace("\r\n", "\n").replace("\r", "\n"); return ovr.wrapString(str, maxWidth); }; + let wrappedStringHeight = function(strArray){ + let r = 0; + strArray.forEach((line, i) => { + let metrics = ovr.stringMetrics(line); + r += Math.max(metrics.height, metrics.maxImageHeight); + }); + return r; + } ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); @@ -309,28 +316,29 @@ let drawMessage = function(ovr, msg) { let yText = 40; let yLine = yText + 3; + let maxTextHeight = ovr.getHeight() - yLine - padding; + if (typeof msg.lines === "undefined") { let bodyFont = settings.fontBig; ovr.setFont(bodyFont); msg.lines = wrapString(msg.body, ovr.getWidth() - 4 - padding); - if (msg.lines.length * (ovr.getFontHeight() + 1) > ovr.getHeight() - yLine - padding) { + + if (wrappedStringHeight(msg.lines) > maxTextHeight) { bodyFont = settings.fontMedium; ovr.setFont(bodyFont); msg.lines = wrapString(msg.body, ovr.getWidth() - 4 - padding); } msg.bodyFont = bodyFont; - } + msg.lineHeights = []; + msg.lines.forEach((line, i) => { + let metrics = ovr.stringMetrics(line); + msg.lineHeights[i] = Math.max(metrics.height, metrics.maxImageHeight); + }); + } ovr.setFont(msg.bodyFont); - - let textHeight = ovr.getFontHeight() + 1; - - let numLines = Math.floor((ovr.getHeight() - yText - padding - 4)/textHeight); - - let linesToPrint = (msg.lines.length > numLines) ? msg.lines.slice(msg.FirstLine, msg.FirstLine + numLines + 1) : msg.lines; - - ovr.setBgColor(ovr.theme.bg); ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); ovr.clearRect(2, yText, ovr.getWidth()-3, ovr.getHeight()-3); let xText = 4; @@ -338,14 +346,26 @@ let drawMessage = function(ovr, msg) { if (msg.bodyFont == settings.fontBig) { ovr.setFontAlign(0, -1); xText = Math.round(ovr.getWidth() / 2 - (padding - 3) / 2) + 1; - yLine = (ovr.getHeight() + yLine) / 2 - (textHeight * msg.lines.length / 2); - } else + yLine = (ovr.getHeight() + yLine) / 2 - (wrappedStringHeight(msg.lines) / 2); + ovr.drawString(msg.lines.join("\n"), xText, yLine); + } else { ovr.setFontAlign(-1, -1); + } - linesToPrint.forEach((line, i) => { - ovr.drawString(line, xText, yLine); - yLine += textHeight; - }); + let currentLine = msg.FirstLine; + + let drawnHeight = 0; + + while(drawnHeight < maxTextHeight) { + let lineHeight = msg.lineHeights[currentLine]; + if (drawnHeight + lineHeight < maxTextHeight) { + ovr.drawString(msg.lines[currentLine], xText, yLine + drawnHeight); + drawnHeight += lineHeight; + currentLine++; + } else { + break; + } + } if (eventQueue.length > 1){ ovr.drawLine(ovr.getWidth()-4,ovr.getHeight()/2,ovr.getWidth()-4,ovr.getHeight()-4); @@ -363,7 +383,7 @@ let drawMessage = function(ovr, msg) { } else msg.CanscrollUp = false; - if (msg.FirstLine + linesToPrint.length < msg.lines.length) { + if (currentLine < msg.lines.length) { msg.CanscrollDown = true; drawTriangleDown(ovr); } else @@ -372,11 +392,11 @@ let drawMessage = function(ovr, msg) { show(ovr); }; -let getSwipeHandler = function(ovr){ - return (lr, ud) => { - if (ud == 1) { +let getDragHandler = function(ovr){ + return (e) => { + if (e.dy > 0) { scrollUp(ovr); - } else if (ud == -1){ + } else if (e.dy < 0){ scrollDown(ovr); } }; @@ -438,7 +458,7 @@ let main = function(ovr, event) { backupHandler("drag"); if (!backupDone){ Bangle.on('touch', getTouchHandler(ovr)); - Bangle.on('swipe', getSwipeHandler(ovr)); + Bangle.on('drag', getDragHandler(ovr)); } backupDone=true; From 085983b2aea0f053f08e50a04beb6e6a44b5d714 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 30 Mar 2024 08:52:41 +0100 Subject: [PATCH 16/39] messagesoverlay - Fix undefined msg warning --- apps/messagesoverlay/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index d86b4e36b..4117a48d4 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -264,7 +264,7 @@ let drawTriangleDown = function(ovr) { let scrollUp = function(ovr) { - msg = eventQueue[0]; + let msg = eventQueue[0]; LOG("up", msg); if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; @@ -279,7 +279,7 @@ let scrollUp = function(ovr) { }; let scrollDown = function(ovr) { - msg = eventQueue[0]; + let msg = eventQueue[0]; LOG("down", msg); if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; From 1ddbb799137331e49e04d5a99e7e0461fa3d51bc Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 30 Mar 2024 09:03:07 +0100 Subject: [PATCH 17/39] messagesoverlay - Refresh display if autoclear removed a message --- apps/messagesoverlay/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 4117a48d4..ccac0b659 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -484,7 +484,7 @@ let updateClearingTimeout = ()=>{ LOG("Set new clearing timeout"); clearingTimeout = setTimeout(()=>{ LOG("setNewTimeout"); - eventQueue.pop(); + drawMessage(ovr, eventQueue.pop()); if (eventQueue.length > 0){ LOG("still got elements"); updateClearingTimeout(); From a6b92215fa8097bb64701c85cb9527fa418471b1 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Wed, 3 Apr 2024 19:58:25 +0200 Subject: [PATCH 18/39] messagesoverlay - Fix trying to draw on empty queue --- apps/messagesoverlay/lib.js | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index ccac0b659..300f6bdc8 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -166,7 +166,7 @@ let showMessage = function(ovr, msg) { msg.new = false; if (!buzzing){ buzzing = true; - Bangle.buzz().then(()=>{setTimeout(()=>{buzzing = false;},2000)}); + Bangle.buzz().then(()=>{setTimeout(()=>{buzzing = false;},2000);}); } Bangle.setLCDPower(1); } @@ -304,7 +304,7 @@ let drawMessage = function(ovr, msg) { r += Math.max(metrics.height, metrics.maxImageHeight); }); return r; - } + }; ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); @@ -312,7 +312,7 @@ let drawMessage = function(ovr, msg) { if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; let padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; - + let yText = 40; let yLine = yText + 3; @@ -334,7 +334,7 @@ let drawMessage = function(ovr, msg) { let metrics = ovr.stringMetrics(line); msg.lineHeights[i] = Math.max(metrics.height, metrics.maxImageHeight); }); - } + } ovr.setFont(msg.bodyFont); ovr.setColor(ovr.theme.fg); @@ -355,7 +355,7 @@ let drawMessage = function(ovr, msg) { let currentLine = msg.FirstLine; let drawnHeight = 0; - + while(drawnHeight < maxTextHeight) { let lineHeight = msg.lineHeights[currentLine]; if (drawnHeight + lineHeight < maxTextHeight) { @@ -484,7 +484,9 @@ let updateClearingTimeout = ()=>{ LOG("Set new clearing timeout"); clearingTimeout = setTimeout(()=>{ LOG("setNewTimeout"); - drawMessage(ovr, eventQueue.pop()); + let event = eventQueue.pop(); + if (event) + drawMessage(ovr, event); if (eventQueue.length > 0){ LOG("still got elements"); updateClearingTimeout(); @@ -498,7 +500,7 @@ let updateClearingTimeout = ()=>{ }; exports.message = function(type, event) { - LOG("Got message", type); + LOG("Got message", type, event); // only handle some event types if(!(type=="text" || type == "call")) return; if(type=="text" && event.id == "nav") return; @@ -528,7 +530,6 @@ exports.message = function(type, event) { ovr.theme = { fg:0, bg:1, fg2:1, bg2:0, fgH:1, bgH:0 }; ovr.clear(); - main(ovr, event); updateClearingTimeout(); From f8174e510674d09642944519360bf486c92d076d Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Wed, 3 Apr 2024 20:07:12 +0200 Subject: [PATCH 19/39] messagesoverlay - Track the backed up handlers while the overlay is up --- apps/messagesoverlay/lib.js | 104 +++++++++++++++++++++++++++--------- 1 file changed, 80 insertions(+), 24 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 300f6bdc8..7cbd8085b 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -410,18 +410,79 @@ let getTouchHandler = function(ovr){ }; }; -let restoreHandler = function(event){ - LOG("Restore", backup[event]); - Bangle.removeAllListeners(event); - Bangle["#on" + event]=backup[event]; - backup[event] = undefined; +const EVENTS=["touch", "drag", "swipe", "lock"]; + +let hasBackup = false; + +let origOn = Bangle.on; +let backupOn = function(event, handler){ + if (EVENTS.includes(event)){ + if (!backup[event]) + backup[event] = []; + backup[event].push(handler); + } + else origOn.call(Bangle, event, handler); }; -let backupHandler = function(event){ - if (backupDone) return; // do not backup, overlay is already up - backup[event] = Bangle["#on" + event]; - LOG("Backed up", backup[event]); - Bangle.removeAllListeners(event); +let origRemove = Bangle.removeListener; +let backupRemove = function(event, handler){ + if (EVENTS.includes(event) && backup[event]){ + LOG("backup for " + event + ": " + backup[event]); + backup[event] = backup[event].filter(e=>e!==handler); + } + else origRemove.call(Bangle, event, handler); +}; + +let origRemoveAll = Bangle.removeAllListeners; +let backupRemoveAll = function(event){ + if (backup[event]) + backup[event] = undefined; + origRemoveAll.call(Bangle); +}; + +let restoreHandlers = function(){ + if (!hasBackup){ + LOG("No backup available"); + return; + } + + for (let event of EVENTS){ + LOG("Restore", backup[event]); + origRemoveAll.call(Bangle, event); + if (backup[event] && backup[event].length == 1) + backup[event] = backup[event][0]; + Bangle["#on" + event]=backup[event]; + backup[event] = undefined; + } + + Bangle.on = origOn; + Bangle.removeListener = origRemove; + Bangle.removeAllListeners = origRemoveAll; + + hasBackup = false; +}; + +let backupHandlers = function(){ + if (hasBackup){ + LOG("Backup already exists"); + return false; // do not backup, overlay is already up + } + + for (let event of EVENTS){ + backup[event] = Bangle["#on" + event]; + if (typeof backup[event] == "function") + backup[event] = [ backup[event] ]; + LOG("Backed up", backup[event], event); + Bangle.removeAllListeners(event); + } + + Bangle.on = backupOn; + Bangle.removeListener = backupRemove; + Bangle.removeAllListeners = backupRemoveAll; + + hasBackup = true; + + return true; }; let cleanup = function(){ @@ -429,38 +490,33 @@ let cleanup = function(){ Bangle.removeListener("lock", lockListener); lockListener = undefined; } - restoreHandler("touch"); - restoreHandler("swipe"); - restoreHandler("drag"); + restoreHandlers(); Bangle.setLCDOverlay(); - backupDone = false; ovr = undefined; quiet = undefined; }; let backup = {}; -let backupDone = false; - let main = function(ovr, event) { LOG("Main", event.t); + let didBackup = backupHandlers(); if (!lockListener) { lockListener = function (e){ updateClearingTimeout(); drawBorder(); }; - Bangle.on('lock', lockListener); + LOG("Add overlay lock handlers"); + origOn.call(Bangle, 'lock', lockListener); } - backupHandler("touch"); - backupHandler("swipe"); - backupHandler("drag"); - if (!backupDone){ - Bangle.on('touch', getTouchHandler(ovr)); - Bangle.on('drag', getDragHandler(ovr)); + + if (didBackup){ + LOG("Add overlay UI handlers"); + origOn.call(Bangle, 'touch', getTouchHandler(ovr)); + origOn.call(Bangle, 'drag', getDragHandler(ovr)); } - backupDone=true; if (event !== undefined){ drawBorder(ovr); From 3c6eae9580092a1555742243645e5a866f6c14eb Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 18:28:39 +0200 Subject: [PATCH 20/39] messagesoverlay - Do not backup lock event handlers --- apps/messagesoverlay/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 7cbd8085b..f62fd2904 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -410,7 +410,7 @@ let getTouchHandler = function(ovr){ }; }; -const EVENTS=["touch", "drag", "swipe", "lock"]; +const EVENTS=["touch", "drag", "swipe"]; let hasBackup = false; From b7f003eec665fcf2b7afa6911048d241ba938831 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 19:22:13 +0200 Subject: [PATCH 21/39] messagesoverlay - Cleanup variable use for scrolling --- apps/messagesoverlay/lib.js | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index f62fd2904..a239031f0 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -105,7 +105,7 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); ovr.clearRect(2,2,ovr.getWidth()-3,37); - + ovr.setColor(ovr.theme.fg2); ovr.setFont(settings.fontSmall); ovr.setFontAlign(0,-1); @@ -139,11 +139,6 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ let showMessage = function(ovr, msg) { LOG("showMessage"); - if (typeof msg.CanscrollDown === "undefined") - msg.CanscrollDown = false; - if (typeof msg.CanscrollUp === "undefined") - msg.CanscrollUp = false; - // Normal text message display let title = msg.title, titleFont = settings.fontLarge, @@ -266,25 +261,16 @@ let drawTriangleDown = function(ovr) { let scrollUp = function(ovr) { let msg = eventQueue[0]; LOG("up", msg); - if (typeof msg.FirstLine === "undefined") - msg.FirstLine = 0; - if (typeof msg.CanscrollUp === "undefined") - msg.CanscrollUp = false; if (!msg.CanscrollUp) return; msg.FirstLine = msg.FirstLine > 0 ? msg.FirstLine - 1 : 0; - drawMessage(ovr, msg); }; let scrollDown = function(ovr) { let msg = eventQueue[0]; LOG("down", msg); - if (typeof msg.FirstLine === "undefined") - msg.FirstLine = 0; - if (typeof msg.CanscrollDown === "undefined") - msg.CanscrollDown = false; if (!msg.CanscrollDown) return; @@ -309,7 +295,7 @@ let drawMessage = function(ovr, msg) { ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); - if (typeof msg.FirstLine === "undefined") msg.FirstLine = 0; + if (msg.FirstLine === undefined) msg.FirstLine = 0; let padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; @@ -318,7 +304,7 @@ let drawMessage = function(ovr, msg) { let maxTextHeight = ovr.getHeight() - yLine - padding; - if (typeof msg.lines === "undefined") { + if (!msg.lines) { let bodyFont = settings.fontBig; ovr.setFont(bodyFont); msg.lines = wrapString(msg.body, ovr.getWidth() - 4 - padding); @@ -331,11 +317,12 @@ let drawMessage = function(ovr, msg) { msg.bodyFont = bodyFont; msg.lineHeights = []; msg.lines.forEach((line, i) => { - let metrics = ovr.stringMetrics(line); - msg.lineHeights[i] = Math.max(metrics.height, metrics.maxImageHeight); + msg.lineHeights[i] = getStringHeight(line); }); } + LOG("Prepared message", msg); + ovr.setFont(msg.bodyFont); ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); From 12449b6474f4f39f6d176ae630fc4e809dad6ff0 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 19:23:09 +0200 Subject: [PATCH 22/39] messagesoverlay - Add workaround for stable firmware string metrics --- apps/messagesoverlay/lib.js | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index a239031f0..83de8fee5 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -1,6 +1,23 @@ let lockListener; let quiet; +let toSemantic = function (espruinoVersion){ + return { + major: espruinoVersion.substring(0,espruinoVersion.indexOf("v")), + minor: espruinoVersion.substring(espruinoVersion.indexOf("v") + 1, espruinoVersion.includes(".") ? espruinoVersion.indexOf(".") : espruinoVersion.length), + patch: espruinoVersion.includes(".") ? espruinoVersion.substring(espruinoVersion.indexOf(".") + 1, espruinoVersion.length) : 0 + }; +}; + +let isNewer = function(espruinoVersion, baseVersion){ + let s = toSemantic(espruinoVersion); + let b = toSemantic(baseVersion); + + return s.major >= b.major && + s.minor >= b.major && + s.patch > b.patch; +}; + var settings = Object.assign( require('Storage').readJSON("messagesoverlay.default.json", true) || {}, require('Storage').readJSON("messagesoverlay.json", true) || {} @@ -279,6 +296,16 @@ let scrollDown = function(ovr) { }; let drawMessage = function(ovr, msg) { + let getStringHeight = function(str){ + "jit"; + let metrics = ovr.stringMetrics(str); + if (isNewer("2v21.13", process.version)){ + if (metrics.maxImageHeight > 16) + metrics.maxImageHeight = metrics.height; + } + return Math.max(metrics.height, metrics.maxImageHeight); + }; + let wrapString = function(str, maxWidth) { str = str.replace("\r\n", "\n").replace("\r", "\n"); return ovr.wrapString(str, maxWidth); @@ -286,8 +313,7 @@ let drawMessage = function(ovr, msg) { let wrappedStringHeight = function(strArray){ let r = 0; strArray.forEach((line, i) => { - let metrics = ovr.stringMetrics(line); - r += Math.max(metrics.height, metrics.maxImageHeight); + r += getStringHeight(line); }); return r; }; From 2647514e10f52d27a84c0cd16f3d18eb69194fb4 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 21:15:15 +0200 Subject: [PATCH 23/39] messagesoverlay - Use bitmap fonts for a little better readability on smaller sizes --- apps/messagesoverlay/lib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 83de8fee5..04642a445 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -25,8 +25,8 @@ var settings = Object.assign( settings = Object.assign({ fontSmall:"6x8", - fontMedium:"Vector:14", - fontBig:g.getFonts().includes("Vector") ? "Vector:20" : "6x8:3", + fontMedium:"6x15", + fontBig: "12x20", fontLarge:"Vector:30", reemit: true }, settings); From d45cf2548eb5b5609ffc8293bf3b7869ebe0775e Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 21:28:07 +0200 Subject: [PATCH 24/39] messagesoverlay - Update ChangeLog --- apps/messagesoverlay/ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/messagesoverlay/ChangeLog b/apps/messagesoverlay/ChangeLog index a1beec182..1775d4b68 100644 --- a/apps/messagesoverlay/ChangeLog +++ b/apps/messagesoverlay/ChangeLog @@ -8,4 +8,5 @@ 0.07: Adds settings Automatic discard of oldest messages Indicator for multiple messages in queue - Some optimization in the rendering code \ No newline at end of file + Some optimization in the rendering code + Track handler changes done by background code From 724be3637ec7d5eb7ef8d4c366344face5ef1885 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 21:45:41 +0200 Subject: [PATCH 25/39] messagesoverlay - Use const where possible --- apps/messagesoverlay/lib.js | 111 ++++++++++++++++++------------------ 1 file changed, 55 insertions(+), 56 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 04642a445..6ba3eacc9 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -1,7 +1,7 @@ let lockListener; let quiet; -let toSemantic = function (espruinoVersion){ +const toSemantic = function (espruinoVersion){ return { major: espruinoVersion.substring(0,espruinoVersion.indexOf("v")), minor: espruinoVersion.substring(espruinoVersion.indexOf("v") + 1, espruinoVersion.includes(".") ? espruinoVersion.indexOf(".") : espruinoVersion.length), @@ -9,16 +9,16 @@ let toSemantic = function (espruinoVersion){ }; }; -let isNewer = function(espruinoVersion, baseVersion){ - let s = toSemantic(espruinoVersion); - let b = toSemantic(baseVersion); +const isNewer = function(espruinoVersion, baseVersion){ + const s = toSemantic(espruinoVersion); + const b = toSemantic(baseVersion); return s.major >= b.major && s.minor >= b.major && s.patch > b.patch; }; -var settings = Object.assign( +let settings = Object.assign( require('Storage').readJSON("messagesoverlay.default.json", true) || {}, require('Storage').readJSON("messagesoverlay.json", true) || {} ); @@ -27,8 +27,7 @@ settings = Object.assign({ fontSmall:"6x8", fontMedium:"6x15", fontBig: "12x20", - fontLarge:"Vector:30", - reemit: true + fontLarge:"Vector:30" }, settings); const ovrx = settings.border; @@ -36,10 +35,10 @@ const ovry = ovrx; const ovrw = g.getWidth()-2*ovrx; const ovrh = g.getHeight()-2*ovry; -let LOG=()=>{}; +const LOG=()=>{}; //LOG = function() { print.apply(null, arguments);}; -let isQuiet = function(){ +const isQuiet = function(){ if (quiet == undefined) quiet = (require('Storage').readJSON('setting.json', 1) || {}).quiet; return quiet; }; @@ -48,17 +47,17 @@ let eventQueue = []; let callInProgress = false; let buzzing = false; -let show = function(ovr){ +const show = function(ovr){ let img = ovr; LOG("show", img.getBPP()); if (ovr.getBPP() == 1) { img = ovr.asImage(); - img.palette = new Uint16Array([g.theme.fg,g.theme.bg]); + img.paconstte = new Uint16Array([g.theme.fg,g.theme.bg]); } Bangle.setLCDOverlay(img, ovrx, ovry); }; -let manageEvent = function(ovr, event) { +const manageEvent = function(ovr, event) { event.new = true; LOG("manageEvent"); @@ -102,7 +101,7 @@ let manageEvent = function(ovr, event) { } }; -let roundedRect = function(ovr, x,y,w,h,filled){ +const roundedRect = function(ovr, x,y,w,h,filled){ var poly = [ x,y+4, x+4,y, @@ -118,7 +117,7 @@ let roundedRect = function(ovr, x,y,w,h,filled){ if (filled) ovr.fillPoly(poly,true); }; -let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ +const drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); ovr.clearRect(2,2,ovr.getWidth()-3,37); @@ -127,7 +126,7 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ ovr.setFont(settings.fontSmall); ovr.setFontAlign(0,-1); - let textCenter = (ovr.getWidth()+35-26)/2; + const textCenter = (ovr.getWidth()+35-26)/2; if (src) { let shortened = src; @@ -153,7 +152,7 @@ let drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ ovr.drawImage(icon,8,8); }; -let showMessage = function(ovr, msg) { +const showMessage = function(ovr, msg) { LOG("showMessage"); // Normal text message display @@ -161,7 +160,7 @@ let showMessage = function(ovr, msg) { titleFont = settings.fontLarge, lines; if (title) { - let w = ovr.getWidth() - 35 - 26; + const w = ovr.getWidth() - 35 - 26; if (ovr.setFont(titleFont).stringWidth(title) > w) titleFont = settings.fontMedium; if (ovr.setFont(titleFont).stringWidth(title) > w) { @@ -184,7 +183,7 @@ let showMessage = function(ovr, msg) { } }; -let drawBorder = function(img) { +const drawBorder = function(img) { LOG("drawBorder", isQuiet()); ovr.setBgColor(ovr.theme.bg); if (img) ovr=img; @@ -198,7 +197,7 @@ let drawBorder = function(img) { show(ovr); }; -let showCall = function(ovr, msg) { +const showCall = function(ovr, msg) { LOG("showCall"); LOG(msg); @@ -214,7 +213,7 @@ let showCall = function(ovr, msg) { titleFont = settings.fontLarge, lines; if (title) { - let w = ovr.getWidth() - 35 -26; + const w = ovr.getWidth() - 35 -26; if (ovr.setFont(titleFont).stringWidth(title) > w) titleFont = settings.fontMedium; if (ovr.setFont(titleFont).stringWidth(title) > w) { @@ -240,7 +239,7 @@ let showCall = function(ovr, msg) { drawMessage(ovr, msg); }; -let next = function(ovr) { +const next = function(ovr) { LOG("next"); stopCallBuzz(); @@ -259,24 +258,24 @@ let next = function(ovr) { }; let callBuzzTimer = null; -let stopCallBuzz = function() { +const stopCallBuzz = function() { if (callBuzzTimer) { clearInterval(callBuzzTimer); callBuzzTimer = undefined; } }; -let drawTriangleUp = function(ovr) { +const drawTriangleUp = function(ovr) { ovr.fillPoly([ovr.getWidth()-9, 46,ovr.getWidth()-14, 56,ovr.getWidth()-4, 56]); }; -let drawTriangleDown = function(ovr) { +const drawTriangleDown = function(ovr) { ovr.fillPoly([ovr.getWidth()-9, ovr.getHeight()-6, ovr.getWidth()-14, ovr.getHeight()-16, ovr.getWidth()-4, ovr.getHeight()-16]); }; -let scrollUp = function(ovr) { - let msg = eventQueue[0]; +const scrollUp = function(ovr) { + const msg = eventQueue[0]; LOG("up", msg); if (!msg.CanscrollUp) return; @@ -285,8 +284,8 @@ let scrollUp = function(ovr) { drawMessage(ovr, msg); }; -let scrollDown = function(ovr) { - let msg = eventQueue[0]; +const scrollDown = function(ovr) { + const msg = eventQueue[0]; LOG("down", msg); if (!msg.CanscrollDown) return; @@ -295,10 +294,10 @@ let scrollDown = function(ovr) { drawMessage(ovr, msg); }; -let drawMessage = function(ovr, msg) { - let getStringHeight = function(str){ +const drawMessage = function(ovr, msg) { + const getStringHeight = function(str){ "jit"; - let metrics = ovr.stringMetrics(str); + const metrics = ovr.stringMetrics(str); if (isNewer("2v21.13", process.version)){ if (metrics.maxImageHeight > 16) metrics.maxImageHeight = metrics.height; @@ -306,11 +305,11 @@ let drawMessage = function(ovr, msg) { return Math.max(metrics.height, metrics.maxImageHeight); }; - let wrapString = function(str, maxWidth) { + const wrapString = function(str, maxWidth) { str = str.replace("\r\n", "\n").replace("\r", "\n"); return ovr.wrapString(str, maxWidth); }; - let wrappedStringHeight = function(strArray){ + const wrappedStringHeight = function(strArray){ let r = 0; strArray.forEach((line, i) => { r += getStringHeight(line); @@ -323,12 +322,12 @@ let drawMessage = function(ovr, msg) { if (msg.FirstLine === undefined) msg.FirstLine = 0; - let padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; + const padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; - let yText = 40; + const yText = 40; let yLine = yText + 3; - let maxTextHeight = ovr.getHeight() - yLine - padding; + const maxTextHeight = ovr.getHeight() - yLine - padding; if (!msg.lines) { let bodyFont = settings.fontBig; @@ -370,7 +369,7 @@ let drawMessage = function(ovr, msg) { let drawnHeight = 0; while(drawnHeight < maxTextHeight) { - let lineHeight = msg.lineHeights[currentLine]; + const lineHeight = msg.lineHeights[currentLine]; if (drawnHeight + lineHeight < maxTextHeight) { ovr.drawString(msg.lines[currentLine], xText, yLine + drawnHeight); drawnHeight += lineHeight; @@ -405,7 +404,7 @@ let drawMessage = function(ovr, msg) { show(ovr); }; -let getDragHandler = function(ovr){ +const getDragHandler = function(ovr){ return (e) => { if (e.dy > 0) { scrollUp(ovr); @@ -415,7 +414,7 @@ let getDragHandler = function(ovr){ }; }; -let getTouchHandler = function(ovr){ +const getTouchHandler = function(ovr){ return (_, xy) => { if (xy.y < ovry + 40){ next(ovr); @@ -427,8 +426,8 @@ const EVENTS=["touch", "drag", "swipe"]; let hasBackup = false; -let origOn = Bangle.on; -let backupOn = function(event, handler){ +const origOn = Bangle.on; +const backupOn = function(event, handler){ if (EVENTS.includes(event)){ if (!backup[event]) backup[event] = []; @@ -437,8 +436,8 @@ let backupOn = function(event, handler){ else origOn.call(Bangle, event, handler); }; -let origRemove = Bangle.removeListener; -let backupRemove = function(event, handler){ +const origRemove = Bangle.removeListener; +const backupRemove = function(event, handler){ if (EVENTS.includes(event) && backup[event]){ LOG("backup for " + event + ": " + backup[event]); backup[event] = backup[event].filter(e=>e!==handler); @@ -446,20 +445,20 @@ let backupRemove = function(event, handler){ else origRemove.call(Bangle, event, handler); }; -let origRemoveAll = Bangle.removeAllListeners; -let backupRemoveAll = function(event){ +const origRemoveAll = Bangle.removeAllListeners; +const backupRemoveAll = function(event){ if (backup[event]) backup[event] = undefined; origRemoveAll.call(Bangle); }; -let restoreHandlers = function(){ +const restoreHandlers = function(){ if (!hasBackup){ LOG("No backup available"); return; } - for (let event of EVENTS){ + for (const event of EVENTS){ LOG("Restore", backup[event]); origRemoveAll.call(Bangle, event); if (backup[event] && backup[event].length == 1) @@ -475,13 +474,13 @@ let restoreHandlers = function(){ hasBackup = false; }; -let backupHandlers = function(){ +const backupHandlers = function(){ if (hasBackup){ LOG("Backup already exists"); return false; // do not backup, overlay is already up } - for (let event of EVENTS){ + for (const event of EVENTS){ backup[event] = Bangle["#on" + event]; if (typeof backup[event] == "function") backup[event] = [ backup[event] ]; @@ -498,7 +497,7 @@ let backupHandlers = function(){ return true; }; -let cleanup = function(){ +const cleanup = function(){ if (lockListener) { Bangle.removeListener("lock", lockListener); lockListener = undefined; @@ -510,11 +509,11 @@ let cleanup = function(){ quiet = undefined; }; -let backup = {}; +const backup = {}; -let main = function(ovr, event) { +const main = function(ovr, event) { LOG("Main", event.t); - let didBackup = backupHandlers(); + const didBackup = backupHandlers(); if (!lockListener) { lockListener = function (e){ @@ -543,7 +542,7 @@ let main = function(ovr, event) { let ovr; let clearingTimeout; -let updateClearingTimeout = ()=>{ +const updateClearingTimeout = ()=>{ LOG("updateClearingTimeout"); if (settings.autoclear <= 0) return; @@ -553,7 +552,7 @@ let updateClearingTimeout = ()=>{ LOG("Set new clearing timeout"); clearingTimeout = setTimeout(()=>{ LOG("setNewTimeout"); - let event = eventQueue.pop(); + const event = eventQueue.pop(); if (event) drawMessage(ovr, event); if (eventQueue.length > 0){ @@ -581,7 +580,7 @@ exports.message = function(type, event) { bpp = 1; while (process.memory().free < settings.minfreemem && eventQueue.length > 0){ - let dropped = eventQueue.pop(); + const dropped = eventQueue.pop(); print("Dropped message because of memory constraints", dropped); } From 8f8d91e95179f548ab627ed2ea4675275794b459 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 22:29:56 +0200 Subject: [PATCH 26/39] messagesoverlay - Draw incomplete line to fill the text area --- apps/messagesoverlay/lib.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 6ba3eacc9..a5efd387d 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -325,9 +325,11 @@ const drawMessage = function(ovr, msg) { const padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; const yText = 40; - let yLine = yText + 3; + let yLine = yText + 4; - const maxTextHeight = ovr.getHeight() - yLine - padding; + ovr.setClipRect(2,2,ovr.getWidth() - 4, ovr.getHeight() - 4); + + const maxTextHeight = ovr.getHeight() - yLine - padding + 2; if (!msg.lines) { let bodyFont = settings.fontBig; @@ -368,15 +370,11 @@ const drawMessage = function(ovr, msg) { let drawnHeight = 0; - while(drawnHeight < maxTextHeight) { + while(drawnHeight < maxTextHeight && msg.lines.length > currentLine) { const lineHeight = msg.lineHeights[currentLine]; - if (drawnHeight + lineHeight < maxTextHeight) { - ovr.drawString(msg.lines[currentLine], xText, yLine + drawnHeight); - drawnHeight += lineHeight; - currentLine++; - } else { - break; - } + ovr.drawString(msg.lines[currentLine], xText, yLine + drawnHeight); + drawnHeight += lineHeight; + currentLine++; } if (eventQueue.length > 1){ From dbfa9dd09dfd3e26242553a862057a3eee77ee1b Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 22:41:00 +0200 Subject: [PATCH 27/39] messagesoverlay - Fix border being a pixel to wide --- apps/messagesoverlay/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index a5efd387d..7810bd242 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -327,7 +327,7 @@ const drawMessage = function(ovr, msg) { const yText = 40; let yLine = yText + 4; - ovr.setClipRect(2,2,ovr.getWidth() - 4, ovr.getHeight() - 4); + ovr.setClipRect(2,2,ovr.getWidth() - 3, ovr.getHeight() - 3); const maxTextHeight = ovr.getHeight() - yLine - padding + 2; From 8f6cc9cb70dc5be9b24473df0a552889e70f3135 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Thu, 4 Apr 2024 23:11:41 +0200 Subject: [PATCH 28/39] messagesoverlay - Fix colors and add border to icon --- apps/messagesoverlay/lib.js | 42 +++++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 7810bd242..8f055246d 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -113,16 +113,20 @@ const roundedRect = function(ovr, x,y,w,h,filled){ x,y+h-5, x,y+4 ]; + if (filled){ + let c = ovr.getColor(); + ovr.setColor(ovr.getBgColor()); + ovr.fillPoly(poly,true); + ovr.setColor(c); + } ovr.drawPoly(poly,true); - if (filled) ovr.fillPoly(poly,true); }; const drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ - ovr.setColor(ovr.theme.fg); - ovr.setBgColor(ovr.theme.bg); + ovr.setColor(ovr.theme.fg2); + ovr.setBgColor(ovr.theme.bg2); ovr.clearRect(2,2,ovr.getWidth()-3,37); - ovr.setColor(ovr.theme.fg2); ovr.setFont(settings.fontSmall); ovr.setFontAlign(0,-1); @@ -140,15 +144,17 @@ const drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ if (title) ovr.drawString(title, textCenter, 38/2 + 5); ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); ovr.setFont(settings.fontMedium); - roundedRect(ovr, ovr.getWidth()-26,5,22,30,false); + roundedRect(ovr, ovr.getWidth()-26,5,22,30,true); ovr.setFont("Vector:16"); ovr.drawString("X",ovr.getWidth()-14,21); - ovr.setColor("#888"); + ovr.setBgColor("#888"); roundedRect(ovr, 5,5,30,30,true); - ovr.setColor(ovr.getBPP() != 1 ? iconcolor : ovr.theme.bg2); + ovr.setBgColor(ovr.theme.bg); + ovr.setColor(ovr.getBPP() != 1 ? iconcolor : ovr.theme.fg); ovr.drawImage(icon,8,8); }; @@ -183,14 +189,18 @@ const showMessage = function(ovr, msg) { } }; +const getBorderColor = function() { + if (Bangle.isLocked()) + return ovr.theme.fg; + else + return ovr.theme.fgH; +}; + const drawBorder = function(img) { LOG("drawBorder", isQuiet()); ovr.setBgColor(ovr.theme.bg); if (img) ovr=img; - if (Bangle.isLocked()) - ovr.setColor(ovr.theme.fg); - else - ovr.setColor(ovr.theme.fgH); + ovr.setColor(getBorderColor()); ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); ovr.drawRect(2,38,ovr.getWidth()-2,39); @@ -266,11 +276,11 @@ const stopCallBuzz = function() { }; const drawTriangleUp = function(ovr) { - ovr.fillPoly([ovr.getWidth()-9, 46,ovr.getWidth()-14, 56,ovr.getWidth()-4, 56]); + ovr.fillPoly([ovr.getWidth()-10, 46,ovr.getWidth()-15, 56,ovr.getWidth()-5, 56]); }; const drawTriangleDown = function(ovr) { - ovr.fillPoly([ovr.getWidth()-9, ovr.getHeight()-6, ovr.getWidth()-14, ovr.getHeight()-16, ovr.getWidth()-4, ovr.getHeight()-16]); + ovr.fillPoly([ovr.getWidth()-10, ovr.getHeight()-6, ovr.getWidth()-15, ovr.getHeight()-16, ovr.getWidth()-5, ovr.getHeight()-16]); }; @@ -327,7 +337,7 @@ const drawMessage = function(ovr, msg) { const yText = 40; let yLine = yText + 4; - ovr.setClipRect(2,2,ovr.getWidth() - 3, ovr.getHeight() - 3); + ovr.setClipRect(2, yText, ovr.getWidth() - 3, ovr.getHeight() - 3); const maxTextHeight = ovr.getHeight() - yLine - padding + 2; @@ -386,7 +396,7 @@ const drawMessage = function(ovr, msg) { ovr.drawLine(ovr.getWidth()*0.6,ovr.getHeight()-6,ovr.getWidth()-6,ovr.getHeight()-6); } - ovr.setColor(ovr.theme.fg2); + ovr.setColor(ovr.theme.fg); if (msg.FirstLine != 0) { msg.CanscrollUp = true; drawTriangleUp(ovr); @@ -529,8 +539,8 @@ const main = function(ovr, event) { } if (event !== undefined){ - drawBorder(ovr); manageEvent(ovr, event); + drawBorder(ovr); } else { LOG("No event given"); cleanup(); From 1b94ada43f8c9ac768f32da840246924d8d18fea Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 6 Apr 2024 00:23:06 +0200 Subject: [PATCH 29/39] messagesoverlay - Reduce code duplication --- apps/messagesoverlay/lib.js | 88 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 46 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 8f055246d..9caabde38 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -122,60 +122,69 @@ const roundedRect = function(ovr, x,y,w,h,filled){ ovr.drawPoly(poly,true); }; -const drawScreen = function(ovr, title, titleFont, src, iconcolor, icon){ +const divider = 38; + +const drawScreen = function(ovr, title, src, iconcolor, icon){ ovr.setColor(ovr.theme.fg2); ovr.setBgColor(ovr.theme.bg2); - ovr.clearRect(2,2,ovr.getWidth()-3,37); + ovr.clearRect(2,2,ovr.getWidth()-3, divider - 1); ovr.setFont(settings.fontSmall); ovr.setFontAlign(0,-1); - const textCenter = (ovr.getWidth()+35-26)/2; + const textCenter = (ovr.getWidth()+34-24)/2-1; - if (src) { - let shortened = src; - while (ovr.stringWidth(shortened) > ovr.getWidth()-80) shortened = shortened.substring(0,shortened.length-2); - if (shortened.length != src.length) shortened += "..."; - ovr.drawString(shortened, textCenter, 2); - } + const w = ovr.getWidth() - 35 - 26; - ovr.setFontAlign(0,0); - ovr.setFont(titleFont); - if (title) ovr.drawString(title, textCenter, 38/2 + 5); + if (title) + drawTitle(title, textCenter, w, divider, 1); + + if (src) + drawSource(src, textCenter, w, 2, -1); ovr.setColor(ovr.theme.fg); ovr.setBgColor(ovr.theme.bg); - ovr.setFont(settings.fontMedium); roundedRect(ovr, ovr.getWidth()-26,5,22,30,true); + ovr.setFontAlign(0,0); ovr.setFont("Vector:16"); - ovr.drawString("X",ovr.getWidth()-14,21); + ovr.drawString("X",ovr.getWidth()-14,20); ovr.setBgColor("#888"); - roundedRect(ovr, 5,5,30,30,true); + roundedRect(ovr, 4, 5, 30, 30,true); ovr.setBgColor(ovr.theme.bg); ovr.setColor(ovr.getBPP() != 1 ? iconcolor : ovr.theme.fg); - ovr.drawImage(icon,8,8); + ovr.drawImage(icon,7,8); +}; + +const drawSource = function(src, center, w, y, align) { + ovr.setFont(settings.fontSmall); + while (ovr.stringWidth(src) > w) src = src.substring(0,src.length-2); + if (src.length != src.length) src += "..."; + ovr.setFontAlign(0,align); + ovr.drawString(src, center, y); +}; + +const drawTitle = function(title, center, w, y, align) { + let titleFont = settings.fontLarge, + lines; + if (ovr.setFont(titleFont).stringWidth(title) > w) + titleFont = settings.fontMedium; + if (ovr.setFont(titleFont).stringWidth(title) > w) { + lines = ovr.wrapString(title, w); + title = (lines.length > 2) ? lines.slice(0, 2).join("\n") + "..." : lines.join("\n"); + } + + ovr.setFontAlign(0,align); + ovr.setFont(titleFont); + ovr.drawString(title, center, y+2); }; const showMessage = function(ovr, msg) { LOG("showMessage"); - // Normal text message display - let title = msg.title, - titleFont = settings.fontLarge, - lines; - if (title) { - const w = ovr.getWidth() - 35 - 26; - if (ovr.setFont(titleFont).stringWidth(title) > w) - titleFont = settings.fontMedium; - if (ovr.setFont(titleFont).stringWidth(title) > w) { - lines = ovr.wrapString(title, w); - title = (lines.length > 2) ? lines.slice(0, 2).join("\n") + "..." : lines.join("\n"); - } - } - - drawScreen(ovr, title, titleFont, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); + ovr.setClipRect(0,0,ovr.getWidth(),ovr.getHeight()); + drawScreen(ovr, msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); drawMessage(ovr, msg); @@ -203,7 +212,7 @@ const drawBorder = function(img) { ovr.setColor(getBorderColor()); ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); - ovr.drawRect(2,38,ovr.getWidth()-2,39); + ovr.drawRect(2,divider,ovr.getWidth()-2,divider+1); show(ovr); }; @@ -219,20 +228,7 @@ const showCall = function(ovr, msg) { callInProgress = true; - let title = msg.title, - titleFont = settings.fontLarge, - lines; - if (title) { - const w = ovr.getWidth() - 35 -26; - if (ovr.setFont(titleFont).stringWidth(title) > w) - titleFont = settings.fontMedium; - if (ovr.setFont(titleFont).stringWidth(title) > w) { - lines = ovr.wrapString(title, w); - title = (lines.length > 2) ? lines.slice(0, 2).join("\n") + "..." : lines.join("\n"); - } - } - - drawScreen(ovr, title, titleFont, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); + drawScreen(ovr, msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); stopCallBuzz(); if (!isQuiet()) { From ca124e40907a6e3793ec6a0097da82a1c85885cb Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 6 Apr 2024 16:41:38 +0200 Subject: [PATCH 30/39] messagesoverlay - Also backup and restore watches to prevent interaction with background app --- apps/messagesoverlay/lib.js | 38 +++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 9caabde38..8f2aa7144 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -440,6 +440,14 @@ const backupOn = function(event, handler){ else origOn.call(Bangle, event, handler); }; +const origSetWatch = setWatch; +const backupSetWatch = function(){ + if (!backup.watches) + backup.watches = []; + LOG("backup for watch", arguments); + backup.watches.push(arguments); +}; + const origRemove = Bangle.removeListener; const backupRemove = function(event, handler){ if (EVENTS.includes(event) && backup[event]){ @@ -471,6 +479,14 @@ const restoreHandlers = function(){ backup[event] = undefined; } + if (backup.watches){ + for (let w of backup.watches){ + LOG("Restore watch", w); + origSetWatch.apply(global, w); + } + } + + global.setWatch = origSetWatch; Bangle.on = origOn; Bangle.removeListener = origRemove; Bangle.removeAllListeners = origRemoveAll; @@ -492,6 +508,28 @@ const backupHandlers = function(){ Bangle.removeAllListeners(event); } + backup.watches = []; + + for (let w of global["\xff"].watches){ + LOG("Transform watch", w); + if (w) { + let args = [ + w.callback, + w.pin, + w + ]; + delete args[2].callback; + delete args[2].pin; + args[2].debounce = Math.round(args[2].debounce / 1048.576); + LOG("Transformed to", args); + backup.watches.push(args); + } + } + + LOG("Backed up watches", backup.watches); + clearWatch(); + + global.setWatch = backupSetWatch; Bangle.on = backupOn; Bangle.removeListener = backupRemove; Bangle.removeAllListeners = backupRemoveAll; From abe6160396f8c6d810491637b2166bbf6def632c Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 6 Apr 2024 21:54:07 +0200 Subject: [PATCH 31/39] messagesoverlay - Dynamically choose title font --- apps/messagesoverlay/lib.js | 43 +++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 8f2aa7144..166ec4853 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -26,8 +26,7 @@ let settings = Object.assign( settings = Object.assign({ fontSmall:"6x8", fontMedium:"6x15", - fontBig: "12x20", - fontLarge:"Vector:30" + fontBig: "12x20" }, settings); const ovrx = settings.border; @@ -35,7 +34,7 @@ const ovry = ovrx; const ovrw = g.getWidth()-2*ovrx; const ovrh = g.getHeight()-2*ovry; -const LOG=()=>{}; +let LOG=()=>{}; //LOG = function() { print.apply(null, arguments);}; const isQuiet = function(){ @@ -94,7 +93,7 @@ const manageEvent = function(ovr, event) { if (!callInProgress && eventQueue[0] !== undefined && eventQueue[0].id == event.id) next(ovr); - else + else eventQueue = []; break; @@ -137,7 +136,7 @@ const drawScreen = function(ovr, title, src, iconcolor, icon){ const w = ovr.getWidth() - 35 - 26; if (title) - drawTitle(title, textCenter, w, divider, 1); + drawTitle(title, textCenter, w, 8, divider - 8, 0); if (src) drawSource(src, textCenter, w, 2, -1); @@ -165,19 +164,31 @@ const drawSource = function(src, center, w, y, align) { ovr.drawString(src, center, y); }; -const drawTitle = function(title, center, w, y, align) { - let titleFont = settings.fontLarge, - lines; - if (ovr.setFont(titleFont).stringWidth(title) > w) - titleFont = settings.fontMedium; - if (ovr.setFont(titleFont).stringWidth(title) > w) { - lines = ovr.wrapString(title, w); - title = (lines.length > 2) ? lines.slice(0, 2).join("\n") + "..." : lines.join("\n"); +const drawTitle = function(title, center, w, y, h) { + let size = 30; + + while (ovr.setFont("Vector:" + size).stringWidth(title) > w){ + size -= 2; + if (size < 14){ + ovr.setFont(settings.fontMedium); + break; + } } - ovr.setFontAlign(0,align); - ovr.setFont(titleFont); - ovr.drawString(title, center, y+2); + if (ovr.stringWidth(title) > w) { + let ws = ovr.wrapString(title, w); + if (ws.length >= 2 && ovr.stringWidth(ws[1]) > w - 8){ + ws[1] = ws[1].substring(0, ws[1].length - 2); + ws[1] += "..."; + } + title = ws.slice(0, 2).join("\n"); + + ovr.setFontAlign(0,-1); + ovr.drawString(title, center, y + 2); + } else { + ovr.setFontAlign(0,0); + ovr.drawString(title, center, y + h/2); + } }; const showMessage = function(ovr, msg) { From 10f6915348c5773eff87b3c9b62c25e8f81472d5 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sat, 6 Apr 2024 22:10:11 +0200 Subject: [PATCH 32/39] messagesoverlay - Only check version once --- apps/messagesoverlay/lib.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 166ec4853..bc86ee77d 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -18,6 +18,8 @@ const isNewer = function(espruinoVersion, baseVersion){ s.patch > b.patch; }; +let needsWorkaround; + let settings = Object.assign( require('Storage').readJSON("messagesoverlay.default.json", true) || {}, require('Storage').readJSON("messagesoverlay.json", true) || {} @@ -315,10 +317,10 @@ const drawMessage = function(ovr, msg) { const getStringHeight = function(str){ "jit"; const metrics = ovr.stringMetrics(str); - if (isNewer("2v21.13", process.version)){ - if (metrics.maxImageHeight > 16) - metrics.maxImageHeight = metrics.height; - } + if (needsWorkaround === undefined) + needsWorkaround = isNewer("2v21.13", process.version); + if (needsWorkaround && metrics.maxImageHeight > 16) + metrics.maxImageHeight = metrics.height; return Math.max(metrics.height, metrics.maxImageHeight); }; From c33f677d1d43aebbe6cb9cf1a82e268caf6c9993 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 7 Apr 2024 09:55:24 +0200 Subject: [PATCH 33/39] messagesoverlay - Rename some variables --- apps/messagesoverlay/lib.js | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index bc86ee77d..ca340a164 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -1,11 +1,12 @@ let lockListener; let quiet; -const toSemantic = function (espruinoVersion){ +// Converts a espruino version to a semantiv versioning object +const toSemantic = function (v){ return { - major: espruinoVersion.substring(0,espruinoVersion.indexOf("v")), - minor: espruinoVersion.substring(espruinoVersion.indexOf("v") + 1, espruinoVersion.includes(".") ? espruinoVersion.indexOf(".") : espruinoVersion.length), - patch: espruinoVersion.includes(".") ? espruinoVersion.substring(espruinoVersion.indexOf(".") + 1, espruinoVersion.length) : 0 + major: v.substring(0,v.indexOf("v")), + minor: v.substring(v.indexOf("v") + 1, v.includes(".") ? v.indexOf(".") : v.length), + patch: v.includes(".") ? v.substring(v.indexOf(".") + 1, v.length) : 0 }; }; @@ -53,7 +54,7 @@ const show = function(ovr){ LOG("show", img.getBPP()); if (ovr.getBPP() == 1) { img = ovr.asImage(); - img.paconstte = new Uint16Array([g.theme.fg,g.theme.bg]); + img.palette = new Uint16Array([g.theme.fg,g.theme.bg]); } Bangle.setLCDOverlay(img, ovrx, ovry); }; @@ -123,12 +124,12 @@ const roundedRect = function(ovr, x,y,w,h,filled){ ovr.drawPoly(poly,true); }; -const divider = 38; +const DIVIDER = 38; const drawScreen = function(ovr, title, src, iconcolor, icon){ ovr.setColor(ovr.theme.fg2); ovr.setBgColor(ovr.theme.bg2); - ovr.clearRect(2,2,ovr.getWidth()-3, divider - 1); + ovr.clearRect(2,2,ovr.getWidth()-3, DIVIDER - 1); ovr.setFont(settings.fontSmall); ovr.setFontAlign(0,-1); @@ -138,7 +139,7 @@ const drawScreen = function(ovr, title, src, iconcolor, icon){ const w = ovr.getWidth() - 35 - 26; if (title) - drawTitle(title, textCenter, w, 8, divider - 8, 0); + drawTitle(title, textCenter, w, 8, DIVIDER - 8, 0); if (src) drawSource(src, textCenter, w, 2, -1); @@ -177,6 +178,8 @@ const drawTitle = function(title, center, w, y, h) { } } + let dh; + let a; if (ovr.stringWidth(title) > w) { let ws = ovr.wrapString(title, w); if (ws.length >= 2 && ovr.stringWidth(ws[1]) > w - 8){ @@ -185,12 +188,14 @@ const drawTitle = function(title, center, w, y, h) { } title = ws.slice(0, 2).join("\n"); - ovr.setFontAlign(0,-1); - ovr.drawString(title, center, y + 2); + a = -1; + dh = y + 2; } else { - ovr.setFontAlign(0,0); - ovr.drawString(title, center, y + h/2); + a = 0; + dh = y + h/2; } + ovr.setFontAlign(0, a); + ovr.drawString(title, center, dh); }; const showMessage = function(ovr, msg) { @@ -225,7 +230,7 @@ const drawBorder = function(img) { ovr.setColor(getBorderColor()); ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); - ovr.drawRect(2,divider,ovr.getWidth()-2,divider+1); + ovr.drawRect(2,DIVIDER,ovr.getWidth()-2,DIVIDER+1); show(ovr); }; @@ -343,7 +348,7 @@ const drawMessage = function(ovr, msg) { const padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; - const yText = 40; + const yText = DIVIDER+2; let yLine = yText + 4; ovr.setClipRect(2, yText, ovr.getWidth() - 3, ovr.getHeight() - 3); @@ -433,7 +438,7 @@ const getDragHandler = function(ovr){ const getTouchHandler = function(ovr){ return (_, xy) => { - if (xy.y < ovry + 40){ + if (xy.y < ovry + DIVIDER){ next(ovr); } }; @@ -652,7 +657,6 @@ exports.message = function(type, event) { else ovr.theme = { fg:0, bg:1, fg2:1, bg2:0, fgH:1, bgH:0 }; - ovr.clear(); main(ovr, event); updateClearingTimeout(); From 5b5982c255e2cb0c7bcfd4225e75667845e0cb00 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 7 Apr 2024 16:51:40 +0200 Subject: [PATCH 34/39] messagesoverlay - Use 16 bit buffer to correctly handle theme colors --- apps/messagesoverlay/lib.js | 173 +++++++++++++++++++----------------- 1 file changed, 91 insertions(+), 82 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index ca340a164..0fab45034 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -1,5 +1,6 @@ let lockListener; -let quiet; +let ovr; +let clearingTimeout; // Converts a espruino version to a semantiv versioning object const toSemantic = function (v){ @@ -41,30 +42,28 @@ let LOG=()=>{}; //LOG = function() { print.apply(null, arguments);}; const isQuiet = function(){ - if (quiet == undefined) quiet = (require('Storage').readJSON('setting.json', 1) || {}).quiet; - return quiet; + return (require('Storage').readJSON('setting.json', 1) || {}).quiet; }; let eventQueue = []; let callInProgress = false; let buzzing = false; -const show = function(ovr){ - let img = ovr; - LOG("show", img.getBPP()); +const show = function(){ + let img = ovr.asImage(); + LOG("show", img.bpp); if (ovr.getBPP() == 1) { - img = ovr.asImage(); img.palette = new Uint16Array([g.theme.fg,g.theme.bg]); } Bangle.setLCDOverlay(img, ovrx, ovry); }; -const manageEvent = function(ovr, event) { +const manageEvent = function(event) { event.new = true; LOG("manageEvent"); if (event.id == "call") { - showCall(ovr, event); + showCall(event); return; } switch (event.t) { @@ -72,7 +71,7 @@ const manageEvent = function(ovr, event) { eventQueue.unshift(event); if (!callInProgress) - showMessage(ovr, event); + showMessage(event); break; case "modify": { @@ -87,15 +86,15 @@ const manageEvent = function(ovr, event) { eventQueue.unshift(event); if (!callInProgress) - showMessage(ovr, event); + showMessage(event); break; } case "remove": if (eventQueue.length == 0 && !callInProgress) - next(ovr); + next(); if (!callInProgress && eventQueue[0] !== undefined && eventQueue[0].id == event.id) - next(ovr); + next(); else eventQueue = []; @@ -103,7 +102,7 @@ const manageEvent = function(ovr, event) { } }; -const roundedRect = function(ovr, x,y,w,h,filled){ +const roundedRect = function(x,y,w,h,filled){ var poly = [ x,y+4, x+4,y, @@ -126,9 +125,7 @@ const roundedRect = function(ovr, x,y,w,h,filled){ const DIVIDER = 38; -const drawScreen = function(ovr, title, src, iconcolor, icon){ - ovr.setColor(ovr.theme.fg2); - ovr.setBgColor(ovr.theme.bg2); +const drawScreen = function(title, src, iconcolor, icon){ ovr.clearRect(2,2,ovr.getWidth()-3, DIVIDER - 1); ovr.setFont(settings.fontSmall); @@ -144,19 +141,24 @@ const drawScreen = function(ovr, title, src, iconcolor, icon){ if (src) drawSource(src, textCenter, w, 2, -1); - ovr.setColor(ovr.theme.fg); - ovr.setBgColor(ovr.theme.bg); + if (ovr.getBPP() > 1) { + let old = ovr.getBgColor(); + ovr.setBgColor("#888"); + roundedRect(4, 5, 30, 30,true); + ovr.setBgColor(old); + old = ovr.getColor(); + ovr.setColor(iconcolor); + ovr.drawImage(icon,7,8); + ovr.setColor(old); + } else { + roundedRect(4, 5, 30, 30,true); + ovr.drawImage(icon,7,8); + } - roundedRect(ovr, ovr.getWidth()-26,5,22,30,true); + roundedRect(ovr.getWidth()-26,5,22,30,true); ovr.setFontAlign(0,0); ovr.setFont("Vector:16"); ovr.drawString("X",ovr.getWidth()-14,20); - - ovr.setBgColor("#888"); - roundedRect(ovr, 4, 5, 30, 30,true); - ovr.setBgColor(ovr.theme.bg); - ovr.setColor(ovr.getBPP() != 1 ? iconcolor : ovr.theme.fg); - ovr.drawImage(icon,7,8); }; const drawSource = function(src, center, w, y, align) { @@ -198,13 +200,28 @@ const drawTitle = function(title, center, w, y, h) { ovr.drawString(title, center, dh); }; -const showMessage = function(ovr, msg) { +const showMessage = function(msg) { LOG("showMessage"); ovr.setClipRect(0,0,ovr.getWidth(),ovr.getHeight()); - drawScreen(ovr, msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); - drawMessage(ovr, msg); + if (Bangle.isLocked()){ + ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); + } else { + ovr.setColor(ovr.theme.fg2); + ovr.setBgColor(ovr.theme.bg2); + } + + drawScreen(msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); + + + if (!Bangle.isLocked()){ + ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); + } + + drawMessage(msg); if (!isQuiet() && msg.new) { msg.new = false; @@ -216,37 +233,34 @@ const showMessage = function(ovr, msg) { } }; -const getBorderColor = function() { - if (Bangle.isLocked()) - return ovr.theme.fg; - else - return ovr.theme.fgH; -}; - -const drawBorder = function(img) { +const drawBorder = function() { LOG("drawBorder", isQuiet()); - ovr.setBgColor(ovr.theme.bg); - if (img) ovr=img; - ovr.setColor(getBorderColor()); + if (Bangle.isLocked()){ + ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); + } else { + ovr.setColor(ovr.theme.fg2); + ovr.setBgColor(ovr.theme.bg2); + } ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); ovr.drawRect(2,DIVIDER,ovr.getWidth()-2,DIVIDER+1); - show(ovr); + show(); }; -const showCall = function(ovr, msg) { +const showCall = function(msg) { LOG("showCall"); LOG(msg); if (msg.t == "remove") { LOG("hide call screen"); - next(ovr); //dont shift + next(); //dont shift return; } callInProgress = true; - drawScreen(ovr, msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); + drawScreen(msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); stopCallBuzz(); if (!isQuiet()) { @@ -260,10 +274,10 @@ const showCall = function(ovr, msg) { Bangle.buzz(500); } } - drawMessage(ovr, msg); + drawMessage(msg); }; -const next = function(ovr) { +const next = function() { LOG("next"); stopCallBuzz(); @@ -277,7 +291,7 @@ const next = function(ovr) { return false; } - showMessage(ovr, eventQueue[0]); + showMessage(eventQueue[0]); return true; }; @@ -289,36 +303,36 @@ const stopCallBuzz = function() { } }; -const drawTriangleUp = function(ovr) { +const drawTriangleUp = function() { ovr.fillPoly([ovr.getWidth()-10, 46,ovr.getWidth()-15, 56,ovr.getWidth()-5, 56]); }; -const drawTriangleDown = function(ovr) { +const drawTriangleDown = function() { ovr.fillPoly([ovr.getWidth()-10, ovr.getHeight()-6, ovr.getWidth()-15, ovr.getHeight()-16, ovr.getWidth()-5, ovr.getHeight()-16]); }; -const scrollUp = function(ovr) { +const scrollUp = function() { const msg = eventQueue[0]; LOG("up", msg); if (!msg.CanscrollUp) return; msg.FirstLine = msg.FirstLine > 0 ? msg.FirstLine - 1 : 0; - drawMessage(ovr, msg); + drawMessage(msg); }; -const scrollDown = function(ovr) { +const scrollDown = function() { const msg = eventQueue[0]; LOG("down", msg); if (!msg.CanscrollDown) return; msg.FirstLine = msg.FirstLine + 1; - drawMessage(ovr, msg); + drawMessage(msg); }; -const drawMessage = function(ovr, msg) { +const drawMessage = function(msg) { const getStringHeight = function(str){ "jit"; const metrics = ovr.stringMetrics(str); @@ -341,9 +355,6 @@ const drawMessage = function(ovr, msg) { return r; }; - ovr.setColor(ovr.theme.fg); - ovr.setBgColor(ovr.theme.bg); - if (msg.FirstLine === undefined) msg.FirstLine = 0; const padding = eventQueue.length > 1 ? (eventQueue.length > 3 ? 7 : 5) : 3; @@ -375,8 +386,6 @@ const drawMessage = function(ovr, msg) { LOG("Prepared message", msg); ovr.setFont(msg.bodyFont); - ovr.setColor(ovr.theme.fg); - ovr.setBgColor(ovr.theme.bg); ovr.clearRect(2, yText, ovr.getWidth()-3, ovr.getHeight()-3); let xText = 4; @@ -410,36 +419,35 @@ const drawMessage = function(ovr, msg) { ovr.drawLine(ovr.getWidth()*0.6,ovr.getHeight()-6,ovr.getWidth()-6,ovr.getHeight()-6); } - ovr.setColor(ovr.theme.fg); if (msg.FirstLine != 0) { msg.CanscrollUp = true; - drawTriangleUp(ovr); + drawTriangleUp(); } else msg.CanscrollUp = false; if (currentLine < msg.lines.length) { msg.CanscrollDown = true; - drawTriangleDown(ovr); + drawTriangleDown(); } else msg.CanscrollDown = false; - show(ovr); + show(); }; -const getDragHandler = function(ovr){ +const getDragHandler = function(){ return (e) => { if (e.dy > 0) { - scrollUp(ovr); + scrollUp(); } else if (e.dy < 0){ - scrollDown(ovr); + scrollDown(); } }; }; -const getTouchHandler = function(ovr){ +const getTouchHandler = function(){ return (_, xy) => { if (xy.y < ovry + DIVIDER){ - next(ovr); + next(); } }; }; @@ -571,14 +579,14 @@ const cleanup = function(){ const backup = {}; -const main = function(ovr, event) { +const main = function(event) { LOG("Main", event.t); const didBackup = backupHandlers(); if (!lockListener) { lockListener = function (e){ updateClearingTimeout(); - drawBorder(); + showMessage(eventQueue[eventQueue.length - 1]); }; LOG("Add overlay lock handlers"); origOn.call(Bangle, 'lock', lockListener); @@ -591,17 +599,13 @@ const main = function(ovr, event) { } if (event !== undefined){ - manageEvent(ovr, event); - drawBorder(ovr); + manageEvent(event); } else { LOG("No event given"); cleanup(); } }; -let ovr; -let clearingTimeout; - const updateClearingTimeout = ()=>{ LOG("updateClearingTimeout"); if (settings.autoclear <= 0) @@ -614,7 +618,7 @@ const updateClearingTimeout = ()=>{ LOG("setNewTimeout"); const event = eventQueue.pop(); if (event) - drawMessage(ovr, event); + showMessage(event); if (eventQueue.length > 0){ LOG("still got elements"); updateClearingTimeout(); @@ -635,8 +639,8 @@ exports.message = function(type, event) { if(event.handled) return; if(event.messagesoverlayignore) return; - bpp = 4; - if (process.memory().free < settings.lowmwm) + bpp = 16; + if (process.memory().free < settings.lowmem) bpp = 1; while (process.memory().free < settings.minfreemem && eventQueue.length > 0){ @@ -652,12 +656,17 @@ exports.message = function(type, event) { ovr.reset(); - if (bpp == 4) + if (bpp > 1){ ovr.theme = g.theme; - else - ovr.theme = { fg:0, bg:1, fg2:1, bg2:0, fgH:1, bgH:0 }; + } + else { + if (g.theme.dark) + ovr.theme = { fg:1, bg:0, fg2:0, bg2:1, fgH:0, bgH:1 }; + else + ovr.theme = { fg:0, bg:1, fg2:1, bg2:0, fgH:1, bgH:0 }; + } - main(ovr, event); + main(event); updateClearingTimeout(); From 979178035afcc69a11f1f4d5c10abc9a32f82f85 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 7 Apr 2024 17:09:45 +0200 Subject: [PATCH 35/39] messagesoverlay - Fix lock listener showing wrong message --- apps/messagesoverlay/lib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 0fab45034..b3968568f 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -586,7 +586,7 @@ const main = function(event) { if (!lockListener) { lockListener = function (e){ updateClearingTimeout(); - showMessage(eventQueue[eventQueue.length - 1]); + showMessage(eventQueue[0]); }; LOG("Add overlay lock handlers"); origOn.call(Bangle, 'lock', lockListener); From 09140ebcfadafa1ffd858fb85bd19905b3ace949 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Sun, 7 Apr 2024 18:47:24 +0200 Subject: [PATCH 36/39] messagesoverlay - Add settings for using lower memory colors --- apps/messagesoverlay/README.md | 6 ++++- apps/messagesoverlay/default.json | 3 ++- apps/messagesoverlay/lib.js | 45 +++++++++++++++++++------------ apps/messagesoverlay/settings.js | 7 +++++ 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/apps/messagesoverlay/README.md b/apps/messagesoverlay/README.md index 7579b35ac..07693d9ae 100644 --- a/apps/messagesoverlay/README.md +++ b/apps/messagesoverlay/README.md @@ -2,7 +2,7 @@ This app handles the display of messages and message notifications as an overlay pop up. -It is a GUI replacement for the `messages` apps. +It is a GUI replacement for the `messagesgui` app. Messages are ephemeral and not stored on the Bangle. @@ -10,6 +10,10 @@ Messages are ephemeral and not stored on the Bangle. Close app by tapping the X and scroll by swiping. The border of the pop up changes color if the Bangle is locked. The color depends on your currently active theme. +## Theme support + +Using the system theme needs more RAM since it uses a 16 bit color buffer for normal message display. Selecting the "low RAM" theme reduces that to a 4 bit buffer. + ## Low memory mode If free memory is below a configured number of blocks (default is 4000), the overlay automatically only uses 1 bit depth. Default mode uses roundabout 1300 blocks, while low memory mode uses about 600. diff --git a/apps/messagesoverlay/default.json b/apps/messagesoverlay/default.json index be3838db6..ed8315348 100644 --- a/apps/messagesoverlay/default.json +++ b/apps/messagesoverlay/default.json @@ -2,5 +2,6 @@ "autoclear": 30, "border": 10, "minfreemem": 2, - "lowmem": 4 + "lowmem": 4, + "systemTheme": true } \ No newline at end of file diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index b3968568f..699f4e0bd 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -126,6 +126,7 @@ const roundedRect = function(x,y,w,h,filled){ const DIVIDER = 38; const drawScreen = function(title, src, iconcolor, icon){ + setColors(true); ovr.clearRect(2,2,ovr.getWidth()-3, DIVIDER - 1); ovr.setFont(settings.fontSmall); @@ -135,6 +136,8 @@ const drawScreen = function(title, src, iconcolor, icon){ const w = ovr.getWidth() - 35 - 26; + drawBorder(); + if (title) drawTitle(title, textCenter, w, 8, DIVIDER - 8, 0); @@ -200,19 +203,21 @@ const drawTitle = function(title, center, w, y, h) { ovr.drawString(title, center, dh); }; +const setColors = function(lockRelevant) { + if (lockRelevant && !Bangle.isLocked()){ + ovr.setColor(ovr.theme.fg2); + ovr.setBgColor(ovr.theme.bg2); + } else { + ovr.setColor(ovr.theme.fg); + ovr.setBgColor(ovr.theme.bg); + } +}; + const showMessage = function(msg) { LOG("showMessage"); ovr.setClipRect(0,0,ovr.getWidth(),ovr.getHeight()); - if (Bangle.isLocked()){ - ovr.setColor(ovr.theme.fg); - ovr.setBgColor(ovr.theme.bg); - } else { - ovr.setColor(ovr.theme.fg2); - ovr.setBgColor(ovr.theme.bg2); - } - drawScreen(msg.title, msg.src || /*LANG*/ "Message", require("messageicons").getColor(msg), require("messageicons").getImage(msg)); @@ -235,13 +240,7 @@ const showMessage = function(msg) { const drawBorder = function() { LOG("drawBorder", isQuiet()); - if (Bangle.isLocked()){ - ovr.setColor(ovr.theme.fg); - ovr.setBgColor(ovr.theme.bg); - } else { - ovr.setColor(ovr.theme.fg2); - ovr.setBgColor(ovr.theme.bg2); - } + setColors(); ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); ovr.drawRect(2,DIVIDER,ovr.getWidth()-2,DIVIDER+1); @@ -333,6 +332,7 @@ const scrollDown = function() { }; const drawMessage = function(msg) { + setColors(false); const getStringHeight = function(str){ "jit"; const metrics = ovr.stringMetrics(str); @@ -639,7 +639,7 @@ exports.message = function(type, event) { if(event.handled) return; if(event.messagesoverlayignore) return; - bpp = 16; + bpp = settings.systemTheme ? 16 : 4; if (process.memory().free < settings.lowmem) bpp = 1; @@ -657,7 +657,18 @@ exports.message = function(type, event) { ovr.reset(); if (bpp > 1){ - ovr.theme = g.theme; + if (settings.systemTheme){ + ovr.theme = g.theme; + } else { + ovr.theme = { + fg: g.theme.dark ? 15: 0, + bg: g.theme.dark ? 0: 15, + fg2: g.theme.dark ? 15: 0, + bg2: g.theme.dark ? 9 : 8, + fgH: g.theme.dark ? 15 : 0, + bgH: g.theme.dark ? 9: 8, + }; + } } else { if (g.theme.dark) diff --git a/apps/messagesoverlay/settings.js b/apps/messagesoverlay/settings.js index 392398813..523a4d96c 100644 --- a/apps/messagesoverlay/settings.js +++ b/apps/messagesoverlay/settings.js @@ -41,6 +41,13 @@ writeSettings("autoclear",v); } }, + 'Theme': { + value: settings.systemTheme, + format: v=>v?"System":"low RAM", + onchange: v => { + writeSettings("systemTheme",v); + } + }, 'Min. free RAM': { value: settings.minfreemem, min: 0, From 5d66cd26edae5c93c8926acef91fe2be8139170f Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Mon, 8 Apr 2024 22:30:06 +0200 Subject: [PATCH 37/39] messagesoverlay - Restore watches to have the same ID as before --- apps/messagesoverlay/lib.js | 52 +++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 699f4e0bd..95bbf9186 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -466,12 +466,22 @@ const backupOn = function(event, handler){ else origOn.call(Bangle, event, handler); }; +const origClearWatch = clearWatch; +const backupClearWatch = function(w) { + if (w) + backup.watches.filter((e)=>e.index != w); + else + backup.watches = []; +}; + const origSetWatch = setWatch; const backupSetWatch = function(){ if (!backup.watches) backup.watches = []; LOG("backup for watch", arguments); - backup.watches.push(arguments); + let i = backup.watches.map((e)=>e.index).sort().pop() + 1; + backup.watches.push({index:i, args:arguments}); + return i; }; const origRemove = Bangle.removeListener; @@ -506,13 +516,29 @@ const restoreHandlers = function(){ } if (backup.watches){ - for (let w of backup.watches){ - LOG("Restore watch", w); - origSetWatch.apply(global, w); + toRemove = []; + + origClearWatch.call(global); + + for(let i = 0; i < backup.watches.length; i++){ + let w = backup.watches[i]; + LOG("Restoring watch", w); + if (w) { + origSetWatch.apply(global, w); + } else { + toRemove.push(i+1); + origSetWatch.call(global, ()=>{}, BTN); + } + } + + LOG("Remove watches", toRemove, global["\xff"].watches); + for(let c of toRemove){ + origClearWatch.call(global, c); } } global.setWatch = origSetWatch; + global.clearWatch = origClearWatch; Bangle.on = origOn; Bangle.removeListener = origRemove; Bangle.removeAllListeners = origRemoveAll; @@ -536,26 +562,30 @@ const backupHandlers = function(){ backup.watches = []; - for (let w of global["\xff"].watches){ + for (let i = 1; i < global["\xff"].watches.length; i++){ + let w = global["\xff"].watches[i]; LOG("Transform watch", w); if (w) { - let args = [ + w = [ w.callback, w.pin, w ]; - delete args[2].callback; - delete args[2].pin; - args[2].debounce = Math.round(args[2].debounce / 1048.576); - LOG("Transformed to", args); - backup.watches.push(args); + delete w[2].callback; + delete w[2].pin; + w[2].debounce = Math.round(w[2].debounce / 1048.576); + } else { + w = null; } + LOG("Transformed to", w); + backup.watches.push(w); } LOG("Backed up watches", backup.watches); clearWatch(); global.setWatch = backupSetWatch; + global.clearWatch = backupClearWatch; Bangle.on = backupOn; Bangle.removeListener = backupRemove; Bangle.removeAllListeners = backupRemoveAll; From 907cc5c35bdbb86af14e0cd665197de9a95e41bd Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Tue, 9 Apr 2024 17:59:40 +0200 Subject: [PATCH 38/39] messagesoverlay - Replace low memory limit with better automatic predictions --- apps/messagesoverlay/README.md | 6 ++++-- apps/messagesoverlay/default.json | 1 - apps/messagesoverlay/lib.js | 35 ++++++++++++++++++++++++++++--- apps/messagesoverlay/settings.js | 10 --------- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/apps/messagesoverlay/README.md b/apps/messagesoverlay/README.md index 07693d9ae..6e9192423 100644 --- a/apps/messagesoverlay/README.md +++ b/apps/messagesoverlay/README.md @@ -8,18 +8,20 @@ Messages are ephemeral and not stored on the Bangle. ## Usage -Close app by tapping the X and scroll by swiping. The border of the pop up changes color if the Bangle is locked. The color depends on your currently active theme. +Close app by tapping the X and scroll by swiping. The title background of the pop up changes color if the Bangle is locked. The color depends on your currently active theme. ## Theme support Using the system theme needs more RAM since it uses a 16 bit color buffer for normal message display. Selecting the "low RAM" theme reduces that to a 4 bit buffer. +16 bit buffer with a small message takes ~4K RAM blocks while 4 bit buffer only needs about 1.5K. ## Low memory mode -If free memory is below a configured number of blocks (default is 4000), the overlay automatically only uses 1 bit depth. Default mode uses roundabout 1300 blocks, while low memory mode uses about 600. +If the overlay estimates that showing the next message would get under the configured minimum free memory limit it automatically only tries to use 1 bit depth. Low memory mode uses about 0.8K blocks plus memory needed for messages. If dropping to 1 bit depth is not enough the oldest messages are discarded to keep the overlay working. ## Creator [halemmerich](https://github.com/halemmerich) + Forked from messages_light by Rarder44 diff --git a/apps/messagesoverlay/default.json b/apps/messagesoverlay/default.json index ed8315348..e18b5b892 100644 --- a/apps/messagesoverlay/default.json +++ b/apps/messagesoverlay/default.json @@ -2,6 +2,5 @@ "autoclear": 30, "border": 10, "minfreemem": 2, - "lowmem": 4, "systemTheme": true } \ No newline at end of file diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index 95bbf9186..fe0dde701 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -669,11 +669,37 @@ exports.message = function(type, event) { if(event.handled) return; if(event.messagesoverlayignore) return; + let free = process.memory().free; bpp = settings.systemTheme ? 16 : 4; - if (process.memory().free < settings.lowmem) - bpp = 1; - while (process.memory().free < settings.minfreemem && eventQueue.length > 0){ + let estimatedMemUse = bpp == 16 ? 4096 : (bpp == 4 ? 1536 : 768); + // reduce estimation if ovr already exists and uses memory; + if (ovr) + estimatedMemUse -= ovr.getBPP() == 16 ? 4096 : (ovr.getBPP() == 4 ? 1536 : 768); + + if (process.memory().free - estimatedMemUse < settings.minfreemem * 1024) { + // we are going to be under our minfreemem setting if we proceed + bpp = 1; + if (ovr && ovr.getBPP() > 1){ + // can reduce memory by going 1 bit + let saves = ovr.getBPP() == 16 ? 4096 - 768 : 768; + estimatedMemUse -= saves; + LOG("Go to 1 bit, saving", saves); + } else { + estimatedMemUse = 768; + } + } + + + if (E.getSizeOf){ + let e = E.getSizeOf(eventQueue); + estimatedMemUse += e; + LOG("EventQueue has", e, "blocks"); + } + + LOG("Free ", free, "estimated use", estimatedMemUse, "for", bpp, "BPP"); + + while (process.memory().free - estimatedMemUse < settings.minfreemem * 1024 && eventQueue.length > 0){ const dropped = eventQueue.pop(); print("Dropped message because of memory constraints", dropped); } @@ -682,6 +708,8 @@ exports.message = function(type, event) { ovr = Graphics.createArrayBuffer(ovrw, ovrh, bpp, { msb: true }); + if(E.getSizeOf) + LOG("New overlay uses", E.getSizeOf(ovr), "blocks"); } ovr.reset(); @@ -713,4 +741,5 @@ exports.message = function(type, event) { if (!isQuiet()) Bangle.setLCDPower(1); event.handled = true; + g.flip(); }; diff --git a/apps/messagesoverlay/settings.js b/apps/messagesoverlay/settings.js index 523a4d96c..cd76bf115 100644 --- a/apps/messagesoverlay/settings.js +++ b/apps/messagesoverlay/settings.js @@ -57,16 +57,6 @@ onchange: v => { writeSettings("minfreemem",v); } - }, - 'Low RAM mode': { - value: settings.lowmem, - min: 0, - max: process.memory().total/1000, - step: 1, - format: v=>v + "k free", - onchange: v => { - writeSettings("lowmem",v); - } } }; return mainmenu; From 403892ef2d2bd13b4291807f0f8adb4683c99234 Mon Sep 17 00:00:00 2001 From: Martin Boonk Date: Fri, 12 Apr 2024 23:33:58 +0200 Subject: [PATCH 39/39] messagesoverlay - Fix font color for title and source in low mem theme --- apps/messagesoverlay/lib.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/messagesoverlay/lib.js b/apps/messagesoverlay/lib.js index fe0dde701..bf6fa7bc4 100644 --- a/apps/messagesoverlay/lib.js +++ b/apps/messagesoverlay/lib.js @@ -126,6 +126,10 @@ const roundedRect = function(x,y,w,h,filled){ const DIVIDER = 38; const drawScreen = function(title, src, iconcolor, icon){ + setColors(false); + + drawBorder(); + setColors(true); ovr.clearRect(2,2,ovr.getWidth()-3, DIVIDER - 1); @@ -136,8 +140,6 @@ const drawScreen = function(title, src, iconcolor, icon){ const w = ovr.getWidth() - 35 - 26; - drawBorder(); - if (title) drawTitle(title, textCenter, w, 8, DIVIDER - 8, 0); @@ -240,7 +242,6 @@ const showMessage = function(msg) { const drawBorder = function() { LOG("drawBorder", isQuiet()); - setColors(); ovr.drawRect(0,0,ovr.getWidth()-1,ovr.getHeight()-1); ovr.drawRect(1,1,ovr.getWidth()-2,ovr.getHeight()-2); ovr.drawRect(2,DIVIDER,ovr.getWidth()-2,DIVIDER+1); @@ -739,7 +740,6 @@ exports.message = function(type, event) { updateClearingTimeout(); - if (!isQuiet()) Bangle.setLCDPower(1); event.handled = true; g.flip(); };