summaryrefslogtreecommitdiff
path: root/win32.c
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2006-11-16 22:05:33 +0000
committerpeter1138 <peter1138@openttd.org>2006-11-16 22:05:33 +0000
commitf660d48e6ad59e7cca747c27cadeb06b483e1969 (patch)
tree4fb6c0fac873efffc85cef437baa70d50d51fdfb /win32.c
parent1b0e95539fdaa72fcb07fb7a216bf1fde5502633 (diff)
downloadopenttd-f660d48e6ad59e7cca747c27cadeb06b483e1969.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.c76
1 files changed, 52 insertions, 24 deletions
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;
}