[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43424] trunk/blender/intern/ghost/intern/ GHOST_SystemWin32.cpp: patch [#29856] UTF-8 copy&paste for Win32 GHOST

Lockal S lockalsash at gmail.com
Mon Jan 16 16:00:36 CET 2012


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 {



More information about the Bf-blender-cvs mailing list