diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ui.cc | 15 | ||||
-rw-r--r-- | src/utf8.cc | 20 | ||||
-rw-r--r-- | src/utf8.hh | 4 |
3 files changed, 30 insertions, 9 deletions
@@ -29,6 +29,7 @@ #include "ui.hh" #include "msg.h" #include "timeout.hh" +#include "utf8.hh" using namespace fltk; @@ -1068,17 +1069,13 @@ void UI::set_tab_title(const char *label) snprintf(title, 128, "Dillo: %s", label); if (*label) { // Make a label for this tab - size_t tab_chars = 18; + size_t tab_chars = 18, label_len = strlen(label); + + if (label_len > tab_chars) + tab_chars = a_Utf8_end_of_char(label, tab_chars - 1) + 1; snprintf(title, tab_chars + 1, "%s", label); - if (strlen(label) > tab_chars) { - while (label[tab_chars] & 0x80 && !(label[tab_chars] & 0x40) && - tab_chars < 23) { - // In the middle of a multibyte UTF-8 character. - title[tab_chars] = label[tab_chars]; - tab_chars++; - } + if (label_len > tab_chars) snprintf(title + tab_chars, 4, "..."); - } // Avoid unnecessary redraws if (strcmp(this->label(), title)) { this->copy_label(title); diff --git a/src/utf8.cc b/src/utf8.cc index 76a752c9..261024fb 100644 --- a/src/utf8.cc +++ b/src/utf8.cc @@ -16,6 +16,26 @@ // C++ functions with C linkage ---------------------------------------------- /* + * Return index of the last byte of the UTF-8-encoded character that str + i + * points to or into. + */ +uint_t a_Utf8_end_of_char(const char *str, uint_t i) +{ + /* We can almost get what we want from utf8fwd(p+1,...)-1, but that + * does not work for the last character in a string, and the fn makes some + * assumptions that do not suit us. + * Here's something very simpleminded instead: + */ + if (str && *str && (str[i] & 0x80)) { + int internal_bytes = (str[i] & 0x40) ? 0 : 1; + + while (((str[i + 1] & 0xc0) == 0x80) && (++internal_bytes < 4)) + i++; + } + return i; +} + +/* * Write UTF-8 encoding of ucs into buf and return number of bytes written. */ int a_Utf8_encode(unsigned int ucs, char *buf) diff --git a/src/utf8.hh b/src/utf8.hh index f4d4bced..e861d600 100644 --- a/src/utf8.hh +++ b/src/utf8.hh @@ -5,6 +5,10 @@ extern "C" { #endif /* __cplusplus */ + +#include "d_size.h" + +uint_t a_Utf8_end_of_char(const char *str, uint_t i); int a_Utf8_encode(unsigned int ucs, char *buf); int a_Utf8_test(const char* src, unsigned int srclen); |