diff options
author | peter1138 <peter1138@openttd.org> | 2006-11-16 22:05:33 +0000 |
---|---|---|
committer | peter1138 <peter1138@openttd.org> | 2006-11-16 22:05:33 +0000 |
commit | 1a4f1c8177f7ee351cb0096e3456d055b97dc60a (patch) | |
tree | 4fb6c0fac873efffc85cef437baa70d50d51fdfb /win32.c | |
parent | 40d647ddde652bb8f1c7b4215279cc82d01ca38f (diff) | |
download | openttd-1a4f1c8177f7ee351cb0096e3456d055b97dc60a.tar.xz |
(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.
Diffstat (limited to 'win32.c')
-rw-r--r-- | win32.c | 76 |
1 files changed, 52 insertions, 24 deletions
@@ -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; } |