This patch is to split UTF-8 word by characters and not byte.
Issue reported at
https://github.com/window-maker/wmaker/issues/65Moved the existing UTF-8 functions from wtextfield.c to WINGsP.h to
be available to all modules.
---
WINGs/WINGs/
WINGsP.h.in | 31 +++++++++++++++++++++++++++++++
WINGs/wmisc.c | 11 +++++++----
WINGs/wtextfield.c | 29 -----------------------------
3 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/WINGs/WINGs/
WINGsP.h.in b/WINGs/WINGs/
WINGsP.h.inindex 2c36b269..02d288f3 100644
--- a/WINGs/WINGs/
WINGsP.h.in+++ b/WINGs/WINGs/
WINGsP.h.in@@ -686,6 +686,37 @@ void W_BroadcastMessage(W_View *targetParent, XEvent *event);
void W_DispatchMessage(W_View *target, XEvent *event);
+/* ---[ UTF-8 helpers ]--------------------------------------------------- */
+
+static inline int oneUTF8CharBackward(const char *str, int len)
+{
+
const unsigned char *ustr = (const unsigned char *)str;
+
int pos = 0;
+
+
while (len-- > 0 && ustr[--pos] >= 0x80 && ustr[pos] <= 0xbf) ;
+
return pos;
+}
+
+static inline int oneUTF8CharForward(const char *str, int len)
+{
+
const unsigned char *ustr = (const unsigned char *)str;
+
int pos = 0;
+
+
while (len-- > 0 && ustr[++pos] >= 0x80 && ustr[pos] <= 0xbf) ;
+
return pos;
+}
+
+// find the beginning of the UTF8 char pointed by str
+static inline int seekUTF8CharStart(const char *str, int len)
+{
+
const unsigned char *ustr = (const unsigned char *)str;
+
int pos = 0;
+
+
while (len-- > 0 && ustr[pos] >= 0x80 && ustr[pos] <= 0xbf)
+
--pos;
+
return pos;
+}
+
#ifdef __cplusplus
}
diff --git a/WINGs/wmisc.c b/WINGs/wmisc.c
index ba4c8a6a..e14ad176 100644
--- a/WINGs/wmisc.c
+++ b/WINGs/wmisc.c
@@ -122,11 +122,14 @@ static int fitText(const char *text, WMFont * font, int width, int wrap)
word1 = word2;
}
-
for (i = word1; i < word2; i++) {
-
w = WMWidthOfString(font, text, i);
-
if (w > width) {
+
/* Advance character by character (not byte by byte) */
+
i = word1;
+
while (i < word2) {
+
int next_i = i + oneUTF8CharForward(text + i, word2 - i);
+
w = WMWidthOfString(font, text, next_i);
+
if (w > width)
break;
-
}
+
i = next_i;
}
/* keep words complete if possible */
diff --git a/WINGs/wtextfield.c b/WINGs/wtextfield.c
index 52b577e5..4d25a3e5 100644
--- a/WINGs/wtextfield.c
+++ b/WINGs/wtextfield.c
@@ -122,35 +122,6 @@ static WMSelectionProcs selectionHandler = {
#define TEXT_WIDTH2(tPtr, start, end) (WMWidthOfString((tPtr)->font, \
&((tPtr)->text[(start)]), (end) - (start)))
-static inline int oneUTF8CharBackward(const char *str, int len)
-{
-
const unsigned char *ustr = (const unsigned char *)str;
-
int pos = 0;
-
-
while (len-- > 0 && ustr[--pos] >= 0x80 && ustr[pos] <= 0xbf) ;
-
return pos;
-}
-
-static inline int oneUTF8CharForward(const char *str, int len)
-{
-
const unsigned char *ustr = (const unsigned char *)str;
-
int pos = 0;
-
-
while (len-- > 0 && ustr[++pos] >= 0x80 && ustr[pos] <= 0xbf) ;
-
return pos;
-}
-
-// find the beginning of the UTF8 char pointed by str
-static inline int seekUTF8CharStart(const char *str, int len)
-{
-
const unsigned char *ustr = (const unsigned char *)str;
-
int pos = 0;
-
-
while (len-- > 0 && ustr[pos] >= 0x80 && ustr[pos] <= 0xbf)
-
--pos;
-
return pos;
-}
-
static void normalizeRange(TextField * tPtr, WMRange * range)
{
if (range->position < 0 && range->count < 0)
--
2.43.0