patch [#29856] UTF-8 copy&paste for Win32 GHOST
authorSv. Lockal <lockalsash@gmail.com>
Mon, 16 Jan 2012 15:00:28 +0000 (15:00 +0000)
committerSv. Lockal <lockalsash@gmail.com>
Mon, 16 Jan 2012 15:00:28 +0000 (15:00 +0000)
intern/ghost/intern/GHOST_SystemWin32.cpp

index 4ae87da4efeb0773bda5216f289085ec666c3aed..9cae2c27e65f17be4c6be82f3c2bef3016c8af19 100644 (file)
@@ -1240,26 +1240,25 @@ LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam,
 
 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 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const
 
        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 {