forked from bartvdbraak/blender
patch [#29856] UTF-8 copy&paste for Win32 GHOST
This commit is contained in:
parent
3b12a4b92b
commit
efc6be2002
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user