- New crowpanel_35 variant: display, SD, board and target files, plus board JSON
- Portrait mode is drawn rotated 180°; landscape stays at rotation 3
- Share the GT911 touch driver between Wio Tracker L2 and CrowPanel
(WioTrackerL2Touch.cpp -> src/helpers/input/LgfxGt911Touch.cpp)
- platformio envs, flasher/site entries, release and merge-bin support
- Tests for the CrowPanel SD codec and merge-bin
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0132MkJ7RUV32mV9F7o4PJMm
The P4's larger UI scale grew the button over the swatch, which sat at a fixed
x. On the P4 the button is narrower and the swatch sits a gap past its end, in
every orientation. Other boards are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On touch boards without a built-in keyboard, opening a chat focused the
composer and that focus raised the on-screen keys, covering the conversation.
The focus now only binds the composer (cursor shown, a Bluetooth, clip-on or
CardKB keyboard types straight in); tapping the composer brings the keys up.
T-Deck, T-Deck Pro and M9 are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the keyboard expansion arrives while the UI is portrait, a dialog counts
down 15 s and then saves landscape and restarts (the Settings orientation
switch's path); "Reboot Now" does it at once. Cancel, or taking the keyboard
off again, keeps portrait. A keyboard already attached at boot is not an
arrival, so a Cancel is not asked again on every start, and nothing is offered
under the lock screen. showConfirm() gains confirmSetMessage() to update the
open dialog's text in place.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012GRWzzRs7oRvFRNcHUZF4c
Lock screen (all boards, #579): the default view is now drawn from parts
instead of the old 320x240 bitmap with the padlock and wordmark baked in,
which cover-scaled into a jumble on any other panel shape. WADAMESH sits at
the top, the clock below it (clear of the status bar), a smaller padlock in
the centre with the unread count to its left and a new battery readout to its
right, each centred between the padlock and the screen edge. Short panels get
a smaller wordmark and padlock. The clock's burn-in drift now moves around its
new place instead of snapping it back to y=30 every minute. T-Deck Pro keeps
its black-on-white e-paper colours; custom wallpapers are unchanged.
T-Display P4: the BOOT button (GPIO35) now works like the Wio Tracker L2's
wake button -- a press wakes or lights the lock screen, a 2 s hold locks or
unlocks -- so the P4 gets the lock screen and the "Lock when screen off"
setting. It gets no Power-off row: GPIO35 cannot wake the P4 from deep sleep.
Also: the chat list's per-row gear clears the list scrollbar on large panels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The T-Display P4 keyboard expansion (TCA8418 + its own XL9555, ported from
camillia-mt) now works. It is looked for every 1.5 s, so it can be clipped on
or off while running, and is routed like the CardKB and Bluetooth keyboards:
it types into the focused field and keeps the on-screen keyboard down. The
external-keyboard routing was gated on Bluetooth, which the P4 lacks, so it
now follows a new CAP_EXT_KEYBOARD; the Bluetooth-only parts stay on
CAP_BLE_KEYBOARD.
- Keys: Shift/Sym/Alt one-shot, Caps Lock lights the expansion LEDs, arrows
and Backspace repeat, Alt+Backspace backs out, F1-F5 open the tabs left to
right, and F11 steps the keyboard light through off/low/medium/high (saved
across reboots).
- Wire1 is shared with the ES8311 codec on other pins; P4I2c1 switches it
under a lock, and the codec's lazy bring-up now goes through it.
- With the keyboard attached the tab bar labels F1-F5 beside each icon, and
Enter on a chat bubble opens its action menu.
Also, on any keyboard build, Enter runs the command in the terminal and the
repeater admin console (the admin console's Enter hook sat on its Send button,
where nothing raised it). And on the P4: the status-bar name shrinks to fit the
bar, the Discover buttons are spaced out, contact names clear their icon in
landscape, and leaving an app returns the focus to its tile in the app drawer.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The keyboard/trackball cursor is a 3 px accent outline, and on an accent
fill it disappears. setSelectionGlow already swaps to the contrast
outline (white, black on Day) there, but only for a fully opaque fill;
the Map's side buttons are accent at 70% over the tiles, so they kept
the accent outline and the selected one barely stood out. Any fill that
is at least half accent now takes the contrast outline.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The accent popup keeps a pointer to the text box it edits, and about 25
separate paths close the popup by hand. A path that deleted the text
box without closing it (e.g. a form closing after its send) left the
popup on screen pointing at freed memory; tapping an accent letter then
ran lv_textarea_del_char on it. That is the beta_85 T-Deck crash in
#574 (loopTask LoadProhibited at 0x3, accentBoxCellCb ->
lv_textarea_del_char), matched against the release image.
Tie the popup to its text box with an LV_EVENT_DELETE hook that clears
the pointer and hides the popup (hide only: in a layer clean the popup
may be deleted in the same pass). The cell handler also checks the text
box is still valid, and accentBoxHide no longer deletes a popup that
something else already removed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The right-aligned peak readout shares the RBW/span line, and on the
narrow portrait panel it ran over that text. In portrait the RBW/span
line, chart and waterfall start one text line lower; the peak stays put
and the tall panel has the room. Landscape, the T-Deck Pro (peak on its
own line already) and the other boards are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The page offset its content by a second STATUSBAR_H to clear the tall
status bar's lower row, which overlaps the page on square panels. The
round panel's bar is already its full two rows and never doubles, so on
the P4 that only left an empty band above the Home button, in both
orientations. Start 8 px below the bar there instead.
In portrait, Flood and Zero-hop stack as two full-width buttons instead
of sharing a cramped row. Landscape and the other boards are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sheet's two-column grid of half-width buttons cut most labels off
with "..." on the narrow portrait panel. In portrait every action gets
its own full-width row; the card grows to fit and its body scrolls past
the screen height like any tall sheet. Delete stays the red bottom row.
Landscape and the other boards keep the grid.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The P4 is a large-screen board, so its quick-reply/emoji chips were
56 px against a 34x30 send button, all pinned to the composer's bottom
edge, where the landscape row sat under the panel's bottom corner arcs.
All three buttons are now 45 px (the average) in both orientations and
vertically centred on the text box, re-centred as it grows. That lifts
them ~9 px off the screen edge, with a floor matching the status bar's
top-corner clearance. In landscape the quick-reply button also moves
16 px in from the bottom-left corner. Replaces the 32 px the portrait
two-row change assumed from the small boards' sizes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Node name and advert location save on blur, and every blur saved and
showed "Name saved" / "Position saved", edited or not. On the M9 (no
touch) moving focus past a field with the d-pad is a blur, so the
alert flashed for each field crossed.
On blur, skip the save and the alert when the field still holds what
it was filled with: the name with missing glyphs replaced, the
position as "%.6f". An edit still saves and says so. This also stops a
bare blur writing the glyph-replaced display form over the real name.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
chan add <name> [key], chan add #tag, chan del <slot|name> and
chan key <slot|name>, in the on-device console and remote terminal.
They reuse the Channels screen's save and delete paths, so the chats
list updates at once. No rename: chat threads are matched to channels
by name, and the Channels screen has no rename for the same reason.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The channel/sender line was pinned at y=30 and the message at y=60,
so a title taller than 30 px (larger UI-size presets, bigger panels)
was drawn over the message, and the rest of a tall screen stayed empty.
Centre both horizontally and centre the pair vertically with 16 px
between them; the message box takes the height its text needs, capped
to what fits and cut at a whole line.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The name started a fixed 24 px after the icon, but the antenna and room
glyphs are wider than the person glyph and all three grow with the
UI-size preset, so some names touched their icon. Start the name 8 px
past the widest of the three, never closer than before.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The send button sat at the composer's bottom-right, under the panel's
rounded corner. Pull it in by the same 16 px safe-area the tab bar
uses, and narrow the text box to match.
Portrait: the single row (QR | emoji | text | send) was crunched on the
284-px panel. Split it into two rows: quick-reply and emoji
right-aligned on top, text and send below. All three buttons are 32 px,
midway between the old 30-px chips and the 34-px send button.
Landscape keeps the single row, and chatComposerApplyRows re-lays it
out when the keyboard's rotate button flips orientation with a chat
open.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
While a Lua app was open, every physical-keyboard key went to the app,
and luaAppKey always claims the key, including while the app's own
wada.ui.input prompt was open. The prompt's text box never received a
character on the T-Deck, Pager, M9 or Attaky, or from a Bluetooth
keyboard (reported with Wardrive's "Name this run").
Don't forward keys to the app while that prompt is open, in
handleHwKey and both bleKbdDispatch paths; they then type into the
bound text box like any other prompt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In landscape the P4's tab bar barely responded to taps, while swipes between
tabs still worked.
P4 landscape is LVGL software rotation, and LVGL 8 rotates pointer input for a
rotated display itself (indev_pointer_proc): it expects points in the
unrotated panel frame. The touch driver was also mapping points to landscape
(heltecV4CapTouchSetPointRotation), on the belief that LVGL does not, so every
point was rotated twice. In ROT_90, the rotation the Orientation button picks,
a tap at (X, Y) reached LVGL at (615 - Y, X): a tap on the bar at the bottom
landed in the middle of the screen or below it, and never on a tab button.
Swipes were unaffected because the driver detects them in its own mapped
coordinates.
The driver keeps its landscape mapping, which its swipe detection and the
direct readers (tab-bar guard, remote-mode hold) need. lvglTouchRead now
converts the point back to the panel frame before giving it to LVGL, keyed on
the driver's rotation, so the chat keyboard's rotate trick on a portrait UI
(LVGL rotated, driver not) passes through unchanged. Also corrects the comment
in UITask::begin that said LVGL does not rotate input.
Not built or tested on hardware.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
In landscape the P4 home screen mixed its portrait column-flow layout with the
landscape right-hand button column: the TX/RX chart ran full width underneath
the buttons, and the info card was placed below the portrait launcher grid,
off the bottom of the 284-px-tall screen.
Landscape now follows the Wio Tracker L2's arrangement: status lines and a
chart sized to the remaining height on the left, clear of a right-hand column
of Advert / Terminal / Apps / Control spread evenly down the content height
(6-px gaps, each 22..46 px). The info card is portrait-only; its eight rows do
not fit landscape. The height is taken from the measured tab, since the
round-corner status bar leaves less than tabContentH() reports. Portrait is
unchanged.
Not built or tested on hardware.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
After a setting that reboots (theme, rotation, language, remote mode...) the
P4 came back with the panel dark, and only a second reboot brought it back.
esp_restart() on the ESP32-P4 is a CPU reset: esp_system_reset_modules_on_exit()
resets DMA, UARTs, SDMMC and crypto, but not the MIPI-DSI host or its DPI path.
The display driver then initialises over a host still half-configured from the
previous session and the panel stays dark. A full chip reset always recovers it.
So every software restart now becomes a full system reset: a shutdown handler,
installed first thing in app_main so it runs last, arms the RTC watchdog with
RESET_SYSTEM. Being a shutdown handler it covers rebootDevice(), OTA, the
console and factory reset without touching any of them. Same fix as
camillia-mt's T-Display P4 port.
Those restarts now arrive as ESP_RST_WDT, so an RTC_NOINIT marker records that
the restart was deliberate, and the crash-report prompt and Settings -> About
read the reset reason through bootResetReason(), which reports ESP_RST_SW for
them. Otherwise a lingering coredump would re-prompt "restarted after a crash"
on every settings reboot.
Not built here (no ESP-IDF toolchain in this environment); needs a P4 build and
an on-device check.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FbY4FsGuX2fNDpNttB6a7R
camillia-mt's working T-Display P4 GPS wakes the L76K through the XL9535
before opening UART1 on RX 22 / TX 23, starts at 9600 and probes other
rates until valid NMEA arrives. Wake and pins already match here; the
difference was the rate. The P4 used the core MicroNMEALocationProvider
locked to one rate (115200), so a receiver at any other rate gave an
open but silent UART.
Build the P4's provider as WadaNmeaLocationProvider with UART probing
(already on main via PR #517, used by the T-Deck Pro), starting at 9600:
it walks 9600/19200/38400/57600/115200 until a checksummed sentence
arrives and saves the working rate.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The "Sync time from saved Wi-Fi after cold boot" option (#383) existed
only on the T-Deck and ThinkNode M9. The P4's PCF8563 has come back with
impossible dates too, so enable it there: the Settings > Clock switches
(CAP_BOOT_TIME_SYNC), the runtime gate in BootTimeSync.cpp, and a call
in the P4's own startup at the same point the S3 main.cpp uses, before
the TCP/WS/BLE transports start.
Esp-hosted builds only: the sync drives Arduino's real WiFi, which the
legacy ESP-AT build must never touch. As elsewhere it is opt-in, runs
only after a true power-on, and skips when the RTC already gave a
trustworthy time or Wi-Fi is on anyway.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The track started 4 px in at 96% width, but the knob overhangs each end
by its 6 px padding plus half the track height, so at the lowest setting
it was drawn past the left edge. Inset the track by that overhang on both
sides of the content width.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The mirror page only forwarded key presses: its key handler skips
anything with Ctrl/Cmd held, so Ctrl+V / Cmd+V did nothing, and a paste
into the hidden input phones use was discarded. Catch the document
'paste' event and type the clipboard text into the device's focused
field, and add a Paste button (a prompt box) for phones, where a
plain-HTTP page cannot read the clipboard from script.
Pasted text goes out in batches of 16 keys every 80 ms so the device's
256-entry key ring is never overrun; line breaks become spaces so a
multi-line paste cannot press Enter and send a half-typed message;
characters outside the BMP are dropped (keys are 16-bit). Same page on
every board.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
WEB_UI_PORT_STR was 5000 on every P4 build, from the ESP-AT days when the
single AT listener shared the companion port. The esp-hosted build serves
the web UI on WS_PORT (8765) like the other boards, so the VNC, Remote,
Files, terminal and remote-placeholder addresses pointed at the wrong
port. Keep 5000 only for WADA_P4_LEGACY_AT builds; other boards were
already correct.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The switch label drops from the 14 px to the 12 px body font and the
browser address from 16 px to 14 px, so both fit comfortably.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The form hugged the header and left most of the tall page empty, so on
on-screen-keyboard boards start it where its Join button ends just above
the keyboard's top edge (keyboard height as kbApplyLayoutForRotation sets
it: CHAT_KB_H portrait, half the screen landscape). Physical-keyboard
boards, and screens without the spare room, keep the old layout.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Create a private channel" / "Join a private channel" / "Join the public
channel" / "Join a hashtag channel" become "Create private channel",
"Join private channel", "Join Public channel" and "Join # channel", in
the body font a step below the title. The first two reuse existing
translated strings; the other two fall back to English until translated.
The labels were also wrapped in TR() twice; now translated once.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"Download mode (wait for USB flash)" ran past its button. Use the smaller
font for that button and wrap it inside the button, centred on two lines.
The text (and its translations) is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
396e818 added rx_delay_base, buzzer_quiet, client_repeat, ble_pin and
gps_fuzz_m after the "region_scope": " opening quote had already been
printed, so they landed inside that string and every backup exported
since then failed to import ("bad/unreadable JSON"). Print region_scope
last, opened and closed in one place. Backups made with the broken build
must be exported again.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In the stacked (portrait) confirmation dialog, e.g. the backup Import
prompt, the multi-line message sat hard against the buttons. Use the
smaller body font there and widen the message-to-buttons gap; the card
height follows. Landscape dialogs are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cmdr: the info panel's values column started at a fixed SC(100), leaving
a wide gap after short labels like "Node". Size it from the labels' real
width and draw a thin divider between the two columns.
Round-cornered status bar (T-Display P4):
- The settings/tool breadcrumb moves from row 1 to row 2 so its top is
level with the battery readout, at row 2's text size instead of the
tall bar's larger one, and is capped (with an ellipsis) short of the
status icons it now shares the row with.
- The signal/SD/Wi-Fi/BLE icons start after the widest the battery
percentage can get ("100%" in its font) instead of a fixed 64 px, so
they no longer cover it; the charging close-up keeps its old position.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The backup carried node settings but none of the touch UI's own
preferences. Add an "app_settings" block: the active Wi-Fi connection
(SSID, password, radio/BLE switches) and every touch preference key as
["key","type","value"] triples: the packed cfg blob (display, theme,
keyboard, map, UI scale, notifications, advert timers...), sound and
DND settings, tile server, lock wallpaper, notification sounds, quick
replies, channel scopes, favourites, ignore lists, channel mute and
emoji, repeater passwords, the last radio preset and saved Wi-Fi
networks.
Import restores them as section bit 0x20 (the UI's Import now applies
it). Only keys and types this build writes itself are accepted. The cfg
blob is merged field by field and keeps what belongs to the unit:
battery calibration, GPS baud, clock floor, FEM/antenna, the paired BLE
keyboard, remote/console boot modes and beta-report counters. Storage
choice, the setup flag and the discovered-nodes cache are not exported.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
GPS screen: the four location-privacy accuracy buttons sat in one row and
were too narrow for their labels. Lay them out two columns by two rows.
Backup export: the wadamesh_settings block now also carries the
location-privacy radius, BLE pairing PIN, RX delay, buzzer quiet and
client repeat, and import restores them with range checks (the radius
only to the values the UI offers, the PIN to six digits). Every other
NodePrefs field was already exported; identity, radio, position,
channels and contacts are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Current T-Display P4 V1 units ship the C6 with esp-hosted firmware
(2.12.3), and main's P4 build only spoke ESP-AT, so Wi-Fi could not come
up on them at all. This is a one-time import of the esp-hosted backend
- TDP4_C6_HOSTED build switch (default hosted; WADA_P4_LEGACY_AT=1 keeps
the ESP-AT path for older units), with the ESP-AT socket/WiFi facades
and the single-listener TCP router guarded to the legacy build.
- tdisplay_p4: build.sh hosted patches and fullclean handling,
idf_component.yml esp-hosted pin, sdkconfig, main.cpp hosted bring-up
and SNTP, c6_at updates, and the C6 reset hook in target.cpp.
- P4 Wi-Fi scan wait in UITask.
- TDISPLAY_P4_C6_FIRMWARE_PLAN.md.
Not imported from that commit: UI-scale default, GPS log lines, UI
build-upload-monitor.sh: run build.sh's own fullclean for the P4 (idf.py
fullclean rejects the patched managed components).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In Remote UI mode the UI renders off-screen for the browser and the
physical panel shows a status placeholder drawn through the
DisplayDriver API. On the P4 every fill/text call was an empty stub, and
writePixelsRGB565 takes half-resolution LVGL coordinates and upscales
2x, so only the logo appeared, twice as big and pushed towards the top
right, over whatever was on screen before.
Add P4PanelPainter: native-resolution fills, rectangles and text for
both P4 panels (RM69A10 AMOLED, HI8561 LCD), rasterising LVGL's
Montserrat fonts at the UI's 2x scale, written through a new
non-upscaling writeNativeRGB565. Give the placeholder a layout for the
tall portrait panel: logo, title, browser address or Wi-Fi status, and
the touch-and-hold exit hint, matching the other builds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The shared confirmation dialog placed a fixed-width Cancel and OK side by
side, and on portrait panels they overran each other (reported on the
backup Import prompt). In portrait, or whenever the card is too narrow
for both, stack them full width with OK above Cancel, and grow the card
to fit. Landscape layouts are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first setup step pinned "Let's set up your device" under the title and
its Skip / Get Started buttons to the bottom edge, leaving a large empty
gap on tall panels like the T-Display P4. Lay them out as one block in the
middle of the screen with centred text, clamped so it never overlaps the
title or drops below the old bottom-edge position on short panels.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
build-upload-monitor.sh gains --tdisplay-p4 (AMOLED) and
--tdisplay-p4-lcd (HI8561 LCD SKU). The P4 is an ESP-IDF app, so these
drive tdisplay_p4/build.sh (build/flash/monitor, --erase, --fullclean,
PORT= for the serial port) instead of pio; both appear in the interactive
menu and the --just-build sweep, which skips them when ESP-IDF is absent.
PlatformIO is only required when a PlatformIO board is chosen.
build-all-targets.sh also builds the LCD SKU. Both SKUs share
build/tdisplay_p4 and WADA_P4_LCD is read only at configure time, so each
P4 build reconfigures first; before this, the AMOLED entry rebuilt
whichever panel had been configured last.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Mentions screen drew its own header with the back chevron at the top
right, the only screen whose back breadcrumb was on the right. Use the
shared app-page chrome instead (appPageBegin/appPageEnd, as Send advert,
Spectrum and the settings pages do): "‹ @ Mentions" on the left of the
status bar, tap to go back. The list starts below the tall bar on square
panels. Keeps the existing translated "@ Mentions" key.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UBQtHzNKA9Q55ogrULN6JJ
- GPS: the P4 listened at 9600 (the L76K power-on default), but LilyGo's
factory firmware leaves the receiver at 115200, so the UART opened and
never parsed a sentence. Set GPS_BAUD_RATE=115200 for the P4. A GPS baud
saved in Settings still overrides it.
- Nav bar: the active-tab bar assumed a full-width tab row. The P4's round
corners inset the row by SB_INSET_X on each side, leaving the bar ~13 px
off under the outer tabs. Measure the real button row instead; move the
unread and update badges in by the same inset.
- Map: with no tiles rendered the canvas shows the COLOR_FIELD
placeholder, but the chrome followed only the night setting (except on
the Wio Tracker L2). Pick the chrome colour from the placeholder's
brightness on every board, and refresh it when tiles appear or vanish.
- Radio & mesh: picking a community preset only filled the fields and a
dropdown never blurs a field, so nothing was saved; leaving the screen
lost it. Apply on pick. Also remember the picked preset by label, since
several presets share identical parameters and the first match
(e.g. EU/UK instead of Switzerland) was shown on return.
- Export: add a wadamesh_settings block with airtime factor, region
scope, auto-add rules, advert/telemetry policy, multi-ACKs, GPS and
RX boosted gain, and restore it on import. The stock-app fields keep
their exact shape.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep the app-drawer Home root open beneath Messages, Map, Mentions, and Advert function-key navigation while still dismissing overlays and respecting blocker dialogs.
Fixes#564
Measure the same vertical padding that compact rows render and increase the blank gap between separate messages without changing wrapped-line spacing.
Fixes#563