Revision: 43424
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43424
Author:   lockal
Date:     2012-01-16 15:00:28 +0000 (Mon, 16 Jan 2012)
Log Message:
-----------
patch [#29856] UTF-8 copy&paste for Win32 GHOST

Modified Paths:
--------------
    trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp

Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp     2012-01-16 
14:13:41 UTC (rev 43423)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp     2012-01-16 
15:00:28 UTC (rev 43424)
@@ -1240,26 +1240,25 @@
 
 GHOST_TUns8* GHOST_SystemWin32::getClipboard(bool selection) const 
 {
-       char *buffer;
+       wchar_t *buffer;
        char *temp_buff;
        
-       if ( IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL) ) {
+       if ( IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL) 
) {
                size_t len = 0;
-               HANDLE hData = GetClipboardData( CF_TEXT );
+               HANDLE hData = GetClipboardData( CF_UNICODETEXT );
                if (hData == NULL) {
                        CloseClipboard();
                        return NULL;
                }
-               buffer = (char*)GlobalLock( hData );
+               buffer = (wchar_t*)GlobalLock( hData );
                if (!buffer) {
                        CloseClipboard();
                        return NULL;
                }
                
-               len = strlen(buffer);
-               temp_buff = (char*) malloc(len+1);
-               strncpy(temp_buff, buffer, len);
-               temp_buff[len] = '\0';
+               len = WideCharToMultiByte(CP_UTF8, 0, buffer, -1, NULL, 0, 
NULL, NULL);
+               temp_buff = (char*) malloc(len);
+               WideCharToMultiByte(CP_UTF8, 0, buffer, -1, temp_buff, len, 
NULL, NULL);
                
                /* Buffer mustn't be accessed after CloseClipboard
                   it would like accessing free-d memory */
@@ -1278,18 +1277,20 @@
 
        if (OpenClipboard(NULL)) {
                HLOCAL clipbuffer;
-               char *data;
+               wchar_t *data;
                
                if (buffer) {
                        EmptyClipboard();
                        
-                       clipbuffer = 
LocalAlloc(LMEM_FIXED,((strlen(buffer)+1)));
-                       data = (char*)GlobalLock(clipbuffer);
-
-                       strcpy(data, (char*)buffer);
-                       data[strlen(buffer)] = '\0';
+                       int wlen = MultiByteToWideChar(CP_UTF8, 0, buffer, -1, 
NULL, 0);
+                       
+                       clipbuffer = LocalAlloc(LMEM_FIXED, wlen * 
sizeof(wchar_t));
+                       data = (wchar_t*)GlobalLock(clipbuffer);
+                       
+                       MultiByteToWideChar(CP_UTF8, 0, buffer, -1, data, wlen);
+                       
                        LocalUnlock(clipbuffer);
-                       SetClipboardData(CF_TEXT,clipbuffer);
+                       SetClipboardData(CF_UNICODETEXT,clipbuffer);
                }
                CloseClipboard();
        } else {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to