diff --git a/src/graphics/draw/MessageRenderer.cpp b/src/graphics/draw/MessageRenderer.cpp index fc66a3337..529b2702c 100644 --- a/src/graphics/draw/MessageRenderer.cpp +++ b/src/graphics/draw/MessageRenderer.cpp @@ -785,7 +785,7 @@ std::vector calculateLineHeights(const std::vector &lines, con return rowHeights; } -void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &packet) +void handleNewMessage(OLEDDisplay *display, const StoredMessage &sm, const meshtastic_MeshPacket &packet) { if (packet.from != 0) { hasUnreadMessage = true; @@ -800,7 +800,22 @@ void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &pack // Banner logic const meshtastic_NodeInfoLite *node = nodeDB->getMeshNode(packet.from); - const char *longName = (node && node->has_user) ? node->user.long_name : nullptr; + char longName[48] = "???"; + if (node && node->user.long_name) { + strncpy(longName, node->user.long_name, sizeof(longName) - 1); + longName[sizeof(longName) - 1] = '\0'; + } + int availWidth = display->getWidth() - (isHighResolution ? 40 : 20); + if (availWidth < 0) + availWidth = 0; + + size_t origLen = strlen(longName); + while (longName[0] && display->getStringWidth(longName) > availWidth) { + longName[strlen(longName) - 1] = '\0'; + } + if (strlen(longName) < origLen) { + strcat(longName, "..."); + } const char *msgRaw = reinterpret_cast(packet.decoded.payload.bytes); char banner[256]; diff --git a/src/graphics/draw/MessageRenderer.h b/src/graphics/draw/MessageRenderer.h index 80bd0f236..76b7f9d1f 100644 --- a/src/graphics/draw/MessageRenderer.h +++ b/src/graphics/draw/MessageRenderer.h @@ -54,7 +54,7 @@ void resetScrollState(); void setThreadFor(const StoredMessage &sm, const meshtastic_MeshPacket &packet); // Handles a new incoming/outgoing message: banner, wake, thread select, scroll reset -void handleNewMessage(const StoredMessage &sm, const meshtastic_MeshPacket &packet); +void handleNewMessage(OLEDDisplay *display, const StoredMessage &sm, const meshtastic_MeshPacket &packet); // Clear Message Line Cache from Message Renderer void clearMessageCache(); diff --git a/src/modules/CannedMessageModule.cpp b/src/modules/CannedMessageModule.cpp index 30503a45e..d315867ab 100644 --- a/src/modules/CannedMessageModule.cpp +++ b/src/modules/CannedMessageModule.cpp @@ -2199,11 +2199,27 @@ ProcessMessage CannedMessageModule::handleReceived(const meshtastic_MeshPacket & // Show overlay banner if (screen) { + auto *display = screen->getDisplayDevice(); graphics::BannerOverlayOptions opts; static char buf[128]; const char *channelName = channels.getName(this->channel); - const char *nodeName = getNodeName(this->incoming); + const char *src = getNodeName(this->incoming); + char nodeName[48]; + strncpy(nodeName, src, sizeof(nodeName) - 1); + nodeName[sizeof(nodeName) - 1] = '\0'; + + int availWidth = display->getWidth() - (graphics::isHighResolution ? 60 : 30); + if (availWidth < 0) + availWidth = 0; + + size_t origLen = strlen(nodeName); + while (nodeName[0] && display->getStringWidth(nodeName) > availWidth) { + nodeName[strlen(nodeName) - 1] = '\0'; + } + if (strlen(nodeName) < origLen) { + strcat(nodeName, "..."); + } // Calculate signal quality and bars based on preset, SNR, and RSSI float snrLimit = getSnrLimit(config.lora.modem_preset); diff --git a/src/modules/TextMessageModule.cpp b/src/modules/TextMessageModule.cpp index 877946289..df3076ff7 100644 --- a/src/modules/TextMessageModule.cpp +++ b/src/modules/TextMessageModule.cpp @@ -6,7 +6,9 @@ #include "buzz.h" #include "configuration.h" #include "graphics/Screen.h" +#include "graphics/SharedUIDisplay.h" #include "graphics/draw/MessageRenderer.h" +#include "main.h" TextMessageModule *textMessageModule; ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPacket &mp) @@ -24,7 +26,9 @@ ProcessMessage TextMessageModule::handleReceived(const meshtastic_MeshPacket &mp const StoredMessage &sm = messageStore.addFromPacket(mp); // Pass message to renderer (banner + thread switching + scroll reset) - graphics::MessageRenderer::handleNewMessage(sm, mp); + // Use the global Screen singleton to retrieve the current OLED display + auto *display = screen ? screen->getDisplayDevice() : nullptr; + graphics::MessageRenderer::handleNewMessage(display, sm, mp); #endif // Only trigger screen wake if configuration allows it if (shouldWakeOnReceivedMessage()) {