diff --git a/src/helpers/esp32/TouchPrefsStore.cpp b/src/helpers/esp32/TouchPrefsStore.cpp index ef3527c..0b96df1 100644 --- a/src/helpers/esp32/TouchPrefsStore.cpp +++ b/src/helpers/esp32/TouchPrefsStore.cpp @@ -35,7 +35,7 @@ static bool s_begun = false; // short read (→ treat as absent → defaults); `ver` lets later builds add fields. static const char* KEY_CFG = "cfg"; static const uint16_t TOUCH_CFG_MAGIC = 0x5743; // 'WC' (WadaCfg) -static const uint8_t TOUCH_CFG_VER = 16; // v2 sig_probe/poll; v3 tz_zone; v4 hide_node_name; v5 map_night/map_zoom; v6 map text/marker visibility; v7 app_grid_large; v8 ui_scale; v9 tb_keypad; v10 sleep_idle; v11 nav_keys; v12 map_zoom_buttons; v13 nav_dir_keys; v14 home_is_drawer; v15 kbd_nav default ON (one-time migrate); v16 nav_scroll_keys +static const uint8_t TOUCH_CFG_VER = 17; // v2 sig_probe/poll; v3 tz_zone; v4 hide_node_name; v5 map_night/map_zoom; v6 map text/marker visibility; v7 app_grid_large; v8 ui_scale; v9 tb_keypad; v10 sleep_idle; v11 nav_keys; v12 map_zoom_buttons; v13 nav_dir_keys; v14 home_is_drawer; v15 kbd_nav default ON (one-time migrate); v16 nav_scroll_keys; v17 notify_new_contact // Defaults (kept identical to the historical per-key defaults). static const uint16_t DEFAULT_SCREEN_TIMEOUT_S = 20; @@ -88,6 +88,7 @@ struct __attribute__((packed)) TouchCfg { uint8_t nav_dir_keys[6]; // keyboard-nav control keys (ASCII): up,down,left,right,select,back — v13 (trailing) uint8_t home_is_drawer; // Home tab defaults to the app drawer (1) vs the Commander screen (0, default) — v14 (trailing) uint8_t nav_scroll_keys[2]; // keyboard-nav scroll keys (ASCII): scroll-up, scroll-down — v16 (trailing) + uint8_t notify_new_contact;// toast/chip when a contact is auto-discovered (bool) — v17 (trailing) }; static TouchCfg s_cfg; @@ -152,6 +153,7 @@ static void cfgSetDefaults(TouchCfg& c) { { const char* d = "wzadsq"; for (int i = 0; i < 6; i++) c.nav_dir_keys[i] = (uint8_t)d[i]; } // default W/Z/A/D/S/Q c.home_is_drawer = 0; // default: Home = Commander screen c.nav_scroll_keys[0] = 'f'; c.nav_scroll_keys[1] = 'c'; // default scroll-up F / scroll-down C + c.notify_new_contact = 1; // default: show the new-contact toast (preserve prior behaviour) } // Persist the whole blob using the same end()/begin(RW)/put/end()/begin(RO) @@ -727,6 +729,17 @@ bool touchPrefsSetHideNodeName(bool hide) { return cfgFlush(); } +bool touchPrefsGetNewContactToast() { + if (!s_begun) touchPrefsBegin(); + return s_cfg.notify_new_contact != 0; // default = show the toast +} + +bool touchPrefsSetNewContactToast(bool on) { + if (!s_begun) touchPrefsBegin(); + s_cfg.notify_new_contact = on ? 1 : 0; + return cfgFlush(); +} + bool touchPrefsGetMapNight() { if (!s_begun) touchPrefsBegin(); return s_cfg.map_night != 0; diff --git a/src/helpers/esp32/TouchPrefsStore.h b/src/helpers/esp32/TouchPrefsStore.h index 7f58b6f..ec9f548 100644 --- a/src/helpers/esp32/TouchPrefsStore.h +++ b/src/helpers/esp32/TouchPrefsStore.h @@ -148,6 +148,11 @@ bool touchPrefsSetHomeIsDrawer(bool on); bool touchPrefsGetHideNodeName(); bool touchPrefsSetHideNodeName(bool hide); +/** Show the low-key toast/chip when a contact is auto-discovered/added. + * Default true (toast shown). Off keeps the diag-log line + tab badge. */ +bool touchPrefsGetNewContactToast(); +bool touchPrefsSetNewContactToast(bool on); + /** Store all device data (identity/prefs/contacts/channels) on the SD card under * /meshcomod instead of internal SPIFFS. T-Deck only; read at boot before data * loads, so changing it requires a reboot. Default false (SPIFFS). */ diff --git a/src/ui-touch/UITask.cpp b/src/ui-touch/UITask.cpp index 76d4f41..06c3698 100644 --- a/src/ui-touch/UITask.cpp +++ b/src/ui-touch/UITask.cpp @@ -3256,26 +3256,35 @@ static void composerAutoGrowCb(lv_event_t* e) { // .cpp) so a hold doesn't auto-repeat — it cleanly long-presses instead. static const char* const kAccA[] = {"à","á","â","ä","ã","å"}; static const char* const kAccA_u[] = {"À","Á","Â","Ä","Ã","Å"}; -static const char* const kAccE[] = {"è","é","ê","ë"}; -static const char* const kAccE_u[] = {"È","É","Ê","Ë"}; +static const char* const kAccE[] = {"è","é","ê","ë","ě"}; +static const char* const kAccE_u[] = {"È","É","Ê","Ë","Ě"}; static const char* const kAccI[] = {"ì","í","î","ï"}; static const char* const kAccI_u[] = {"Ì","Í","Î","Ï"}; static const char* const kAccO[] = {"ò","ó","ô","ö","õ","ø"}; static const char* const kAccO_u[] = {"Ò","Ó","Ô","Ö","Õ","Ø"}; -static const char* const kAccU[] = {"ù","ú","û","ü"}; -static const char* const kAccU_u[] = {"Ù","Ú","Û","Ü"}; +static const char* const kAccU[] = {"ù","ú","û","ü","ů"}; +static const char* const kAccU_u[] = {"Ù","Ú","Û","Ü","Ů"}; static const char* const kAccN[] = {"ñ"}; static const char* const kAccN_u[] = {"Ñ"}; -static const char* const kAccC[] = {"ç"}; -static const char* const kAccC_u[] = {"Ç"}; +static const char* const kAccC[] = {"ç","č"}; +static const char* const kAccC_u[] = {"Ç","Č"}; static const char* const kAccS[] = {"ß","ś","š"}; static const char* const kAccY[] = {"ý","ÿ"}; +// Czech carons / ring — base letters that otherwise carry no Latin-1 accent. +static const char* const kAccT[] = {"ť"}; +static const char* const kAccT_u[] = {"Ť"}; +static const char* const kAccZ[] = {"ž"}; +static const char* const kAccZ_u[] = {"Ž"}; +static const char* const kAccR[] = {"ř"}; +static const char* const kAccR_u[] = {"Ř"}; struct AccentSet { char key; const char* const* v; uint8_t n; }; static const AccentSet kAccentSets[] = { - {'a',kAccA,6},{'A',kAccA_u,6},{'e',kAccE,4},{'E',kAccE_u,4}, + {'a',kAccA,6},{'A',kAccA_u,6},{'e',kAccE,5},{'E',kAccE_u,5}, {'i',kAccI,4},{'I',kAccI_u,4},{'o',kAccO,6},{'O',kAccO_u,6}, - {'u',kAccU,4},{'U',kAccU_u,4},{'n',kAccN,1},{'N',kAccN_u,1}, - {'c',kAccC,1},{'C',kAccC_u,1},{'s',kAccS,3},{'y',kAccY,2}, + {'u',kAccU,5},{'U',kAccU_u,5},{'n',kAccN,1},{'N',kAccN_u,1}, + {'c',kAccC,2},{'C',kAccC_u,2},{'s',kAccS,3},{'y',kAccY,2}, + {'t',kAccT,1},{'T',kAccT_u,1},{'z',kAccZ,1},{'Z',kAccZ_u,1}, + {'r',kAccR,1},{'R',kAccR_u,1}, }; static const AccentSet* accentLookup(const char* key) { if (!key || !key[0] || key[1]) return nullptr; // single ASCII-char keys only @@ -3996,7 +4005,7 @@ static const char* const k_emoji_items[] = { "\xF0\x9F\x92\xAF","\xE2\x9C\x85","\xE2\x9D\x8C","\xE2\x9D\x97", "\xE2\x9D\x93","\xE2\x9A\xA0","\xF0\x9F\x92\xA9","\xE2\xAD\x90", "\xF0\x9F\x8C\x9F","\xE2\x9A\xA1","\xE2\x98\x80","\xE2\x98\x81", - "\xE2\x9D\x84","\xE2\x98\x94","\xE2\x98\x95","\xF0\x9F\x8D\xBB", + "\xE2\x9D\x84","\xE2\x98\x94","\xE2\x98\x95","\xF0\x9F\x8D\xBA","\xF0\x9F\x8D\xBB", "\xF0\x9F\x8D\x95","\xF0\x9F\x8E\x82","\xF0\x9F\x8E\x81","\xF0\x9F\x92\xAC", "\xF0\x9F\x92\xA4","\xF0\x9F\x92\xA5", // objects @@ -6066,6 +6075,14 @@ static void buildRadioSettings() { lv_obj_center(l); } +// New-contact toast toggle (Auto-add page). Persists immediately like the +// auto-add switches; default ON. Diag-log line + tab badge are unaffected — this +// only gates the low-key chip in UITask::notify(). +static void toggleNewContactToastCb(lv_event_t* e) { + if (lv_event_get_code(e) != LV_EVENT_VALUE_CHANGED) return; + touchPrefsSetNewContactToast(lv_obj_has_state(lv_event_get_target(e), LV_STATE_CHECKED)); +} + static void buildAutoAddSettings() { lv_obj_t* body = createSettingsModal("Auto-add contacts", SettingsModalKind::AutoAdd); NodePrefs* prefs = the_mesh.getNodePrefs(); @@ -6085,6 +6102,17 @@ static void buildAutoAddSettings() { mk_switch("Overwrite oldest", &g_set_modal.auto_overwrite_sw); g_set_modal.manual_add_sw = nullptr; // master "manual add" removed — per-type switches are authoritative now + // "Notify on new contact" — a UI pref (not a NodePrefs autoadd bit), so it gets + // its own callback + persistence rather than mk_switch's autoAddSwitchCb. + { + int h = settingsRowLabel(body, y, 6, "Notify on new contact", COLOR_SUB, nullptr, 56); + lv_obj_t* sw = lv_switch_create(body); + lv_obj_align(sw, LV_ALIGN_TOP_RIGHT, 0, y); + if (touchPrefsGetNewContactToast()) lv_obj_add_state(sw, LV_STATE_CHECKED); + lv_obj_add_event_cb(sw, toggleNewContactToastCb, LV_EVENT_VALUE_CHANGED, nullptr); + y += LV_MAX(34, h + 12); + } + lv_obj_t* hops_l = lv_label_create(body); lv_label_set_text(hops_l, TR("Max hops (0..64)")); lv_obj_set_style_text_color(hops_l, lv_color_hex(COLOR_SUB), LV_PART_MAIN); @@ -14334,6 +14362,14 @@ static void homeUnreadClickedCb(lv_event_t* e) { goToTab(CHAT_INBOX_TAB_INDEX); } +// Status-bar unread badge (✉ N) → Chats inbox. Wired on the bar's left_label; +// only fires while updateGlobalStatusBar has flagged the badge state CLICKABLE, +// so non-badge left-zone states keep the bar's control-center / Back tap. +static void statusBarUnreadCb(lv_event_t* e) { + if (lv_event_get_code(e) != LV_EVENT_CLICKED) return; + goToTab(CHAT_INBOX_TAB_INDEX); +} + // ---- App drawer (full-screen grid launcher) ---- // A toggle-in alternative to the command-centre home. The full implementation // lives below openControlCenter (it links to the tool openers defined there); @@ -24165,6 +24201,11 @@ static void buildGlobalStatusBar() { lv_obj_set_style_text_color(g_statusbar.left_label, lv_color_hex(COLOR_TEXT), LV_PART_MAIN); lv_obj_set_style_text_font(g_statusbar.left_label, &g_font_14, LV_PART_MAIN); lv_obj_align(g_statusbar.left_label, LV_ALIGN_LEFT_MID, 6, 0); + // Tapping the unread badge (✉ N) jumps to the Chats inbox. The CLICKABLE flag is + // toggled per-tick in updateGlobalStatusBar so only the badge state intercepts the + // tap; every other left-zone state falls through to the bar's control-center tap. + lv_obj_set_ext_click_area(g_statusbar.left_label, 8); + lv_obj_add_event_cb(g_statusbar.left_label, statusBarUnreadCb, LV_EVENT_CLICKED, nullptr); // Channel-settings gear — left of the thread name, shown only inside a channel // chat (updateGlobalStatusBar toggles it + shifts the name). Opens the @@ -24336,6 +24377,7 @@ static void updateGlobalStatusBar() { } // ---- Left zone ---- + bool unread_badge = false; // set true only by the branches that render the ✉ count if (s_settings_open_cat >= 0) { // A settings detail sheet is open: the bar carries its Back chevron + the page // title (the sheet has no header of its own; tapping the bar goes Back). @@ -24356,6 +24398,7 @@ static void updateGlobalStatusBar() { if (total_unread > 99) snprintf(ub, sizeof ub, "99+"); else snprintf(ub, sizeof ub, "%d", total_unread); snprintf(buf, sizeof(buf), LV_SYMBOL_ENVELOPE " %s %s", ub, s_chat_title); lv_label_set_text(g_statusbar.left_label, buf); + unread_badge = true; } else { lv_label_set_text(g_statusbar.left_label, s_chat_title); } @@ -24418,6 +24461,7 @@ static void updateGlobalStatusBar() { if (total_unread > 99) snprintf(buf, sizeof(buf), LV_SYMBOL_ENVELOPE " 99+"); else snprintf(buf, sizeof(buf), LV_SYMBOL_ENVELOPE " %d", total_unread); lv_label_set_text(g_statusbar.left_label, buf); + unread_badge = true; } else { // No unread → blank the left zone entirely. Operator complaint was // the envelope was always lit even with an empty inbox, which read @@ -24427,6 +24471,14 @@ static void updateGlobalStatusBar() { } } + // Activate the unread→Chats shortcut only while the ✉ count is shown; other + // left-zone states (Back chevron, profile name, OSM credit, blank) keep the + // bar's normal control-center / Back tap. + if (g_statusbar.left_label) { + if (unread_badge) lv_obj_add_flag(g_statusbar.left_label, LV_OBJ_FLAG_CLICKABLE); + else lv_obj_clear_flag(g_statusbar.left_label, LV_OBJ_FLAG_CLICKABLE); + } + // ---- Connection icon ---- #if defined(ESP32) && defined(MULTI_TRANSPORT_COMPANION) const bool wifi_up = (WiFi.status() == WL_CONNECTED); @@ -29323,12 +29375,17 @@ void UITask::notify(UIEventType t) { } // Background traffic (also reflected in the tab badges): show a subtle, low-key // chip rather than the prominent centre alert toast, so it's less intrusive. - strncpy(_alert, msg, sizeof(_alert) - 1); - _alert[sizeof(_alert) - 1] = '\0'; - _alert_expiry = millis() + 1100UL; + // New-contact discovery can be spammy in a busy mesh, so its chip is opt-out in + // Settings -> Auto-add; when suppressed we still log the diag line + tab badge. + const bool toast = (t != UIEventType::newContactMessage) || touchPrefsGetNewContactToast(); + if (toast) { + strncpy(_alert, msg, sizeof(_alert) - 1); + _alert[sizeof(_alert) - 1] = '\0'; + _alert_expiry = millis() + 1100UL; + } #if defined(HAS_TOUCH_UI) pushDiagLine(msg); - showSubtleNotifyLvgl(msg, 1100); + if (toast) showSubtleNotifyLvgl(msg, 1100); #endif } diff --git a/src/ui-touch/emoji_data.c b/src/ui-touch/emoji_data.c index 147d75e..653187c 100644 --- a/src/ui-touch/emoji_data.c +++ b/src/ui-touch/emoji_data.c @@ -505,6 +505,10 @@ static const lv_img_dsc_t d_1f40c = { { LV_IMG_CF_TRUE_COLOR_ALPHA, 0, 0, 16, 16 static const uint8_t e_1f41e[] = {0,0,1,0,0,0,31,0,1,0,0,1,0,0,1,44,99,5,0,0,0,110,107,102,110,107,74,110,99,133,0,0,0,170,82,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,107,22,0,0,0,0,0,0,0,0,0,0,0,0,239,115,39,110,107,115,142,107,34,110,107,193,77,107,60,0,0,1,239,123,2,0,0,0,0,0,0,0,0,0,77,107,17,142,107,91,110,107,111,115,140,20,146,124,14,239,115,86,203,82,162,45,99,81,0,0,0,175,115,150,110,107,106,170,170,3,239,123,4,0,0,0,0,0,0,0,0,0,110,107,103,110,99,113,110,107,58,106,74,134,203,82,209,110,107,255,167,49,255,17,173,246,146,189,159,73,66,207,255,47,6,0,0,0,0,248,2,0,0,0,0,0,0,0,0,0,78,107,43,110,99,160,0,0,0,80,148,150,138,82,255,69,41,248,69,41,253,7,66,255,40,74,255,227,184,253,195,248,176,138,186,63,0,0,0,231,121,4,239,123,4,0,0,0,109,107,41,110,107,192,174,83,70,20,190,230,7,50,253,69,25,254,134,33,255,69,33,254,227,192,251,227,248,255,4,177,255,199,169,255,77,123,112,0,0,0,0,0,0,0,0,0,0,0,0,207,115,66,105,122,224,36,137,255,37,129,253,69,121,255,101,73,255,69,161,255,227,248,255,227,248,255,101,57,251,36,81,254,8,194,244,207,91,107,110,107,113,0,0,0,0,248,1,175,91,88,199,209,227,195,208,252,227,248,254,195,248,255,228,248,255,37,241,255,4,193,255,101,73,255,69,129,254,227,216,254,37,233,241,142,99,130,110,107,87,0,0,0,0,0,0,142,115,149,8,122,255,101,9,252,36,185,255,69,105,255,69,89,255,69,225,255,69,129,255,134,1,255,69,105,255,195,248,254,4,241,248,44,123,145,0,0,0,0,0,0,0,0,0,175,99,125,199,161,248,4,145,255,36,177,254,134,17,255,134,17,255,69,177,255,37,225,255,36,153,255,36,177,255,195,240,252,37,249,255,45,115,213,239,83,6,0,0,0,44,99,10,175,91,168,166,209,178,163,248,255,227,248,254,36,153,255,36,145,255,227,248,255,37,249,255,4,209,255,134,17,255,36,129,251,101,249,255,77,107,170,0,0,0,0,0,0,110,107,155,142,91,126,171,146,138,4,249,255,227,248,252,228,224,255,101,81,255,4,169,255,36,249,255,36,193,255,101,49,254,4,161,252,102,233,234,143,91,206,77,107,81,0,0,0,77,107,12,0,0,0,174,91,211,167,201,213,162,248,255,36,169,252,134,1,252,69,105,254,4,249,254,36,241,253,195,248,249,4,249,255,195,248,88,207,83,46,77,107,115,0,0,0,0,0,0,170,82,3,110,99,58,110,99,202,4,241,177,228,248,255,36,193,255,4,233,255,227,248,255,37,241,255,4,249,255,227,248,177,10,248,3,0,0,0,0,0,0,0,0,0,239,123,2,0,0,0,110,107,51,110,99,197,243,44,16,163,248,89,227,248,192,227,248,231,227,248,235,36,241,209,4,241,127,69,249,6,0,248,1,170,170,3,181,82,3,0,0,0,239,123,2,170,82,3,110,107,161,78,107,50,0,0,0,0,0,0,0,0,0,195,224,19,4,249,23,0,248,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}; static const lv_img_dsc_t d_1f41e = { { LV_IMG_CF_TRUE_COLOR_ALPHA, 0, 0, 16, 16 }, sizeof(e_1f41e), e_1f41e }; +static const uint8_t e_1f37a[] = {0,0,0,0,0,0,255,255,2,0,0,0,46,254,22,55,255,178,186,255,232,121,255,208,212,254,81,0,0,0,255,255,2,0,248,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,255,147,121,255,223,255,255,255,255,255,255,255,255,255,154,255,251,178,254,69,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,254,98,253,255,255,255,255,255,255,255,253,255,255,255,255,255,253,255,255,255,187,255,255,56,255,199,80,246,19,255,255,1,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,56,255,241,255,255,252,255,255,252,255,255,255,255,255,255,255,255,255,255,255,253,255,255,255,122,255,255,146,246,34,255,255,3,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,25,239,167,55,255,255,189,255,253,222,255,255,89,255,255,89,255,255,56,255,253,55,255,254,247,238,216,255,157,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,52,230,125,89,255,255,56,255,252,23,255,255,81,238,255,82,238,255,49,238,254,172,237,255,84,238,226,255,255,193,223,255,156,28,231,27,0,0,0,0,0,0,0,0,0,0,0,0,176,229,131,89,255,255,43,229,252,166,228,255,134,220,255,69,220,255,68,220,255,192,219,255,111,213,240,25,190,237,218,222,255,93,239,160,0,0,0,0,0,0,0,0,0,0,0,0,241,229,137,122,255,255,101,220,252,160,219,255,2,220,255,164,228,255,226,219,253,34,228,255,110,221,206,206,74,20,23,198,136,60,231,223,0,0,0,0,0,0,0,0,0,0,0,0,17,230,138,154,255,255,134,228,252,2,220,255,100,220,255,100,228,255,2,220,253,97,236,255,206,229,202,0,0,0,92,239,82,60,231,228,0,0,0,0,0,0,0,0,0,0,0,0,49,238,142,153,255,255,197,228,253,98,228,255,196,228,255,33,220,255,98,228,253,193,244,255,238,237,200,0,0,0,92,239,136,219,222,223,0,0,0,0,0,0,0,0,0,0,0,0,146,238,145,219,255,255,36,237,253,35,237,255,69,237,255,161,236,255,194,236,253,33,253,255,13,238,202,255,255,93,125,239,245,150,181,167,0,0,0,0,0,0,0,0,0,0,0,0,113,238,149,50,255,255,131,245,252,33,245,255,99,245,255,132,245,255,33,245,254,96,253,255,79,238,242,94,231,255,150,181,217,239,123,38,0,0,0,0,0,0,0,0,0,0,0,0,218,222,158,197,245,255,128,253,254,161,253,255,228,253,255,161,253,255,128,253,255,162,253,255,86,214,212,212,148,99,140,115,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,239,219,26,231,254,136,229,245,130,245,252,129,245,253,98,245,253,134,229,246,85,214,237,61,231,208,0,0,0,0,0,0,85,173,3,0,0,0,0,0,0,0,0,0,0,0,0,251,222,163,28,223,252,252,222,255,121,214,247,87,214,249,120,214,243,187,214,252,28,223,255,251,222,195,251,222,15,239,255,2,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,231,71,251,230,162,252,222,207,252,222,226,252,222,221,251,222,194,27,231,118,125,239,16,0,0,0,255,255,1,0,0,0,0,0,0,0,0,0}; +static const lv_img_dsc_t d_1f37a = { { LV_IMG_CF_TRUE_COLOR_ALPHA, 0, 0, 16, 16 }, sizeof(e_1f37a), e_1f37a }; +static const uint8_t e_1f37b[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,2,0,0,0,68,249,65,100,249,52,101,249,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,239,251,2,115,254,5,197,249,48,100,249,86,36,249,142,64,248,61,114,255,14,89,255,119,154,255,137,186,255,126,56,255,66,0,0,0,85,253,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,32,2,249,106,102,250,63,220,255,165,221,255,233,255,255,255,255,255,255,255,255,255,155,255,237,192,252,5,0,0,0,255,255,2,255,255,2,255,255,2,89,255,39,187,255,166,252,255,158,253,255,193,187,255,219,254,255,255,255,255,255,255,255,252,255,255,249,221,255,251,123,255,215,254,255,24,255,255,19,0,0,0,255,255,5,0,0,0,88,255,115,255,255,255,255,255,255,255,255,255,255,255,255,189,255,252,156,255,254,189,255,255,121,255,254,212,254,255,216,238,224,187,214,200,186,214,215,125,239,50,0,0,0,255,255,42,91,247,117,188,255,250,154,255,249,122,255,253,255,255,253,255,255,255,255,255,255,121,255,255,49,246,254,232,228,254,76,229,255,30,215,94,121,214,105,60,231,158,158,247,100,251,222,234,252,222,221,240,237,252,101,228,255,199,228,255,122,255,255,23,255,255,122,255,253,174,237,254,100,220,255,2,220,253,165,236,255,26,239,140,255,255,10,60,231,189,60,231,185,85,181,43,191,247,165,106,245,255,192,219,252,7,229,255,214,246,255,2,220,255,142,229,239,35,220,253,67,220,255,131,228,254,224,244,255,113,238,212,127,231,143,121,214,209,93,239,174,0,0,0,156,247,209,70,245,255,2,237,253,112,246,255,48,246,255,224,219,252,115,238,237,80,246,255,225,236,255,165,245,254,96,253,254,73,254,245,187,214,211,51,165,67,218,222,202,61,223,142,90,247,238,98,253,255,131,245,254,199,245,255,68,245,255,6,237,247,213,238,228,51,255,255,195,253,255,226,253,255,160,253,255,199,237,251,220,214,183,255,255,5,84,173,70,123,206,189,142,254,250,96,253,255,193,253,255,96,253,255,64,253,255,201,237,231,95,231,136,176,246,246,229,253,251,130,245,249,138,221,246,121,214,255,28,223,203,90,239,13,0,0,0,158,247,142,181,238,250,112,238,241,78,238,245,9,246,246,226,253,254,78,246,189,255,231,54,184,222,255,53,214,255,120,214,255,188,214,251,61,231,186,93,247,36,0,0,0,121,206,5,154,214,157,57,198,240,58,198,251,90,198,251,123,206,247,185,222,255,251,230,188,255,231,10,61,231,119,62,231,158,61,231,127,124,247,62,0,0,0,0,0,0,255,255,1,0,0,0,170,82,6,181,181,79,182,189,140,214,189,176,214,189,195,248,189,197,154,214,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,2,0,0,0}; +static const lv_img_dsc_t d_1f37b = { { LV_IMG_CF_TRUE_COLOR_ALPHA, 0, 0, 16, 16 }, sizeof(e_1f37b), e_1f37b }; typedef struct { uint32_t cp; const lv_img_dsc_t* dsc; } EmojiGlyph; static const EmojiGlyph kGlyphs[] = { { 0x200Du, &d_zero }, @@ -554,6 +558,8 @@ static const EmojiGlyph kGlyphs[] = { { 0x1F340u, &d_1f340 }, { 0x1F341u, &d_1f341 }, { 0x1F342u, &d_1f342 }, + { 0x1F37Au, &d_1f37a }, + { 0x1F37Bu, &d_1f37b }, { 0x1F381u, &d_1f381 }, { 0x1F388u, &d_1f388 }, { 0x1F389u, &d_1f389 }, @@ -761,7 +767,7 @@ static const EmojiGlyph kGlyphs[] = { { 0x1F9D0u, &d_1f9d0 }, { 0x1F9E1u, &d_1f9e1 }, }; -const uint16_t kEmojiGlyphCount = 250; +const uint16_t kEmojiGlyphCount = 252; const lv_img_dsc_t* emojiGlyphLookup(uint32_t cp) { int lo = 0, hi = (int)(sizeof(kGlyphs)/sizeof(kGlyphs[0])) - 1; diff --git a/src/ui-touch/emoji_data.h b/src/ui-touch/emoji_data.h index 7492690..072d118 100644 --- a/src/ui-touch/emoji_data.h +++ b/src/ui-touch/emoji_data.h @@ -1,5 +1,5 @@ // AUTO-GENERATED by scripts/build/gen-emoji-font.py — do not edit. -// 250 Noto colour emoji baked to RGB565+alpha at 16px. +// 252 Noto colour emoji baked to RGB565+alpha at 16px. #pragma once #include "lvgl.h" #ifdef __cplusplus