From f660d48e6ad59e7cca747c27cadeb06b483e1969 Mon Sep 17 00:00:00 2001 From: peter1138 Date: Thu, 16 Nov 2006 22:05:33 +0000 Subject: (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come. --- win32.c | 76 ++++++++++++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 52 insertions(+), 24 deletions(-) (limited to 'win32.c') diff --git a/win32.c b/win32.c index 4070f8546..b8e34c4d5 100644 --- a/win32.c +++ b/win32.c @@ -926,39 +926,67 @@ void DeterminePaths(void) */ bool InsertTextBufferClipboard(Textbuf *tb) { - if (IsClipboardFormatAvailable(CF_TEXT)) { - HGLOBAL cbuf; - const byte *data, *dataptr; - uint16 width = 0; - uint16 length = 0; + HGLOBAL cbuf; + char utf8_buf[512]; + const char *ptr; - OpenClipboard(NULL); - cbuf = GetClipboardData(CF_TEXT); - data = GlobalLock(cbuf); // clipboard data - dataptr = data; + WChar c; + uint16 width, length; - for (; IsValidAsciiChar(*dataptr, CS_ALPHANUMERAL) && (tb->length + length) < (tb->maxlength - 1) && - (tb->maxwidth == 0 || width + tb->width + GetCharacterWidth(FS_NORMAL, (byte)*dataptr) <= tb->maxwidth); dataptr++) { - width += GetCharacterWidth(FS_NORMAL, (byte)*dataptr); - length++; - } + if (IsClipboardFormatAvailable(CF_UNICODETEXT)) { + int bytec; - if (length == 0) return false; + OpenClipboard(NULL); + cbuf = GetClipboardData(CF_UNICODETEXT); - memmove(tb->buf + tb->caretpos + length, tb->buf + tb->caretpos, tb->length - tb->caretpos); - memcpy(tb->buf + tb->caretpos, data, length); - tb->width += width; - tb->caretxoffs += width; + ptr = GlobalLock(cbuf); + bytec = WideCharToMultiByte(CP_UTF8, 0, (wchar_t*)ptr, -1, utf8_buf, lengthof(utf8_buf), NULL, NULL); + GlobalUnlock(cbuf); + CloseClipboard(); - tb->length += length; - tb->caretpos += length; - tb->buf[tb->length] = '\0'; // terminating zero + if (bytec == 0) { + DEBUG(misc, 0) ("[utf8] Error converting '%s'. Errno %d", ptr, GetLastError()); + return false; + } + } else if (IsClipboardFormatAvailable(CF_TEXT)) { + OpenClipboard(NULL); + cbuf = GetClipboardData(CF_TEXT); + ptr = GlobalLock(cbuf); + ttd_strlcpy(utf8_buf, ptr, lengthof(utf8_buf)); GlobalUnlock(cbuf); CloseClipboard(); - return true; + } else { + return false; } - return false; + + width = length = 0; + + for (ptr = utf8_buf; (c = Utf8Consume(&ptr)) != '\0';) { + byte charwidth; + + if (!IsPrintable(c)) break; + if (tb->length + length >= tb->maxlength - 1) break; + charwidth = GetCharacterWidth(FS_NORMAL, c); + + if (tb->maxwidth != 0 && width + tb->width + charwidth > tb->maxwidth) break; + + width += charwidth; + length += Utf8CharLen(c); + } + + if (length == 0) return false; + + memmove(tb->buf + tb->caretpos + length, tb->buf + tb->caretpos, tb->length - tb->caretpos); + memcpy(tb->buf + tb->caretpos, utf8_buf, length); + tb->width += width; + tb->caretxoffs += width; + + tb->length += length; + tb->caretpos += length; + tb->buf[tb->length] = '\0'; // terminating zero + + return true; } -- cgit v1.2.3-54-g00ecf