mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-07-26 14:58:12 +00:00
feat(keyboard): selectable main/additional script for the on-screen keyboard
Page 0 was hardcoded to Latin -- Cyrillic/Greek could only ever be the second, cycled-to page. Settings > Keyboard's Alphabet row splits into Main (which script the keyboard opens on by default) and Additional (the second one reached via #@/abc), so a Cyrillic/Greek typist can make their own script the default instead of always landing on Latin first. Setting Additional equal to Main collapses back to a 2-page cycle (that script + Symbols), same rule the old Latin-hardcoded design already used implicitly. KeyboardWidget.h: cellStr()/t9GroupStr() now dispatch through scriptCellStr()/scriptT9GroupStr(), treating Latin as an ordinary peer of Cyrillic/Greek instead of a special case; scriptHint() replaces altAlphabetHint() so the #@/abc key's "next page" hint is correct regardless of which script that lands on; the accent popup's gating checks the current page's actual script instead of assuming page 0 is always Latin. Removed the now-dead pageIsAltAlphabet(). NodePrefs gains keyboard_main_alphabet (schema sentinel 0xC0DE001F -> 0xC0DE0020, same append-at-tail/clamp-on-load pattern as every prior schema growth this file uses). Verified via a real build that the new field lands in existing tail padding -- sizeof(NodePrefs) is unchanged at 2712. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -520,6 +520,12 @@ void DataStore::loadPrefsInt(const char *filename, NodePrefs& _prefs, double& no
|
||||
rd(&_prefs.bot_commands_room, sizeof(_prefs.bot_commands_room));
|
||||
if (_prefs.bot_commands_room > 1) _prefs.bot_commands_room = 0;
|
||||
|
||||
// → 0xC0DE0020: append keyboard_main_alphabet at the tail. A pre-0x20 file
|
||||
// has the old sentinel bytes / EOF here; clamp anything out of range to 0
|
||||
// (Latin), matching the keyboard's original always-Latin-main behaviour.
|
||||
rd(&_prefs.keyboard_main_alphabet, sizeof(_prefs.keyboard_main_alphabet));
|
||||
if (_prefs.keyboard_main_alphabet >= NodePrefs::KB_ALPHABET_COUNT) _prefs.keyboard_main_alphabet = 0;
|
||||
|
||||
// Schema sentinel: bumped on layout changes. Mismatch means an older file
|
||||
// (or a different schema); rd() already zero-inits any fields not present,
|
||||
// so we just log it — next savePrefs writes the current sentinel.
|
||||
@@ -723,6 +729,7 @@ void DataStore::savePrefs(const NodePrefs& _prefs, double node_lat, double node_
|
||||
file.write((uint8_t *)_prefs.bot_reply_room, sizeof(_prefs.bot_reply_room));
|
||||
file.write((uint8_t *)&_prefs.bot_commands_ch, sizeof(_prefs.bot_commands_ch));
|
||||
file.write((uint8_t *)&_prefs.bot_commands_room, sizeof(_prefs.bot_commands_room));
|
||||
file.write((uint8_t *)&_prefs.keyboard_main_alphabet, sizeof(_prefs.keyboard_main_alphabet));
|
||||
|
||||
// Tail sentinel — must be last. See NodePrefs::SCHEMA_SENTINEL. Its write is
|
||||
// the one we check: once the flash fills, writes return 0, so a good
|
||||
|
||||
Reference in New Issue
Block a user