diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp index 8ae2a897df..13f5f5fb00 100644 --- a/Marlin/src/lcd/ultralcd.cpp +++ b/Marlin/src/lcd/ultralcd.cpp @@ -204,33 +204,36 @@ millis_t next_button_update_ms; SETCURSOR(x, y); if (!string) return; + auto _newline = [&x, &y]() { + x = 0; y++; // move x to string len (plus space) + SETCURSOR(0, y); // simulate carriage return + }; + uint8_t *p = (uint8_t*)string; wchar_t ch; if (wordwrap) { - uint8_t *wrd = p, c = 0; + uint8_t *wrd = nullptr, c = 0; + // find the end of the part for (;;) { + if (!wrd) wrd = p; // Get word start /before/ advancing p = get_utf8_value_cb(p, cb_read_byte, &ch); - const bool eol = !ch; + const bool eol = !ch; // zero ends the string + // End or a break between phrases? if (eol || ch == ' ' || ch == '-' || ch == '+' || ch == '.') { - if (!c && ch == ' ') continue; // collapse extra spaces - if (x + c > LCD_WIDTH && x >= (LCD_WIDTH) / 4) { // should it wrap? - x = 0; y++; // move x to string len (plus space) - SETCURSOR(0, y); // simulate carriage return - } + if (!c && ch == ' ') { if (wrd) wrd++; continue; } // collapse extra spaces + // Past the right and the word is not too long? + if (x + c > LCD_WIDTH && x >= (LCD_WIDTH) / 4) _newline(); // should it wrap? c += !eol; // +1 so the space will be printed x += c; // advance x to new position while (c) { // character countdown --c; // count down to zero wrd = get_utf8_value_cb(wrd, cb_read_byte, &ch); // get characters again - lcd_put_wchar(ch); // word (plus space) to the LCD + lcd_put_wchar(ch); // character to the LCD } - if (eol) break; // all done + if (eol) break; // all done! wrd = nullptr; // set up for next word } - else { - if (!wrd) wrd = p; // starting a new word? - c++; // count word characters - } + else c++; // count word characters } } else { @@ -239,10 +242,7 @@ millis_t next_button_update_ms; if (!ch) break; lcd_put_wchar(ch); x++; - if (x >= LCD_WIDTH) { - x = 0; y++; - SETCURSOR(0, y); - } + if (x >= LCD_WIDTH) _newline(); } } }