[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45012] trunk/blender: Adds support for utf paths on Windows.
Alexander Kuznetsov
kuzsasha at gmail.com
Tue Mar 20 03:17:43 CET 2012
Revision: 45012
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45012
Author: alexk
Date: 2012-03-20 02:17:37 +0000 (Tue, 20 Mar 2012)
Log Message:
-----------
Adds support for utf paths on Windows.
Not all file formats/calls are supported yet. It will be expended.
Please from now on use BLI_fopen, BLI_* for file manipulations.
For non-windows systems BLI_fopen just calls fopen.
For Windows, the utf-8 string is translated to utf-16 string in order to call UTF version of the function.
Modified Paths:
--------------
trunk/blender/build_files/scons/tools/Blender.py
trunk/blender/intern/CMakeLists.txt
trunk/blender/intern/SConscript
trunk/blender/intern/ghost/CMakeLists.txt
trunk/blender/intern/ghost/SConscript
trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp
trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
trunk/blender/intern/ghost/intern/GHOST_WindowWin32.cpp
trunk/blender/intern/ghost/intern/GHOST_WindowWin32.h
trunk/blender/source/blender/blenkernel/intern/blender.c
trunk/blender/source/blender/blenkernel/intern/customdata_file.c
trunk/blender/source/blender/blenkernel/intern/image.c
trunk/blender/source/blender/blenkernel/intern/movieclip.c
trunk/blender/source/blender/blenkernel/intern/packedFile.c
trunk/blender/source/blender/blenkernel/intern/particle_system.c
trunk/blender/source/blender/blenkernel/intern/pointcache.c
trunk/blender/source/blender/blenkernel/intern/text.c
trunk/blender/source/blender/blenlib/BLI_fileops.h
trunk/blender/source/blender/blenlib/BLI_winstuff.h
trunk/blender/source/blender/blenlib/CMakeLists.txt
trunk/blender/source/blender/blenlib/SConscript
trunk/blender/source/blender/blenlib/intern/dynlib.c
trunk/blender/source/blender/blenlib/intern/fileops.c
trunk/blender/source/blender/blenlib/intern/path_util.c
trunk/blender/source/blender/blenlib/intern/storage.c
trunk/blender/source/blender/blenlib/intern/winstuff.c
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/blenloader/intern/runtime.c
trunk/blender/source/blender/blenloader/intern/writefile.c
trunk/blender/source/blender/editors/armature/reeb.c
trunk/blender/source/blender/editors/curve/editfont.c
trunk/blender/source/blender/editors/physics/physics_fluid.c
trunk/blender/source/blender/editors/space_file/fsmenu.c
trunk/blender/source/blender/editors/space_text/text_ops.c
trunk/blender/source/blender/imbuf/CMakeLists.txt
trunk/blender/source/blender/imbuf/SConscript
trunk/blender/source/blender/imbuf/intern/bmp.c
trunk/blender/source/blender/imbuf/intern/cineon/cineonlib.c
trunk/blender/source/blender/imbuf/intern/cineon/dpxlib.c
trunk/blender/source/blender/imbuf/intern/cineon/logImageLib.c
trunk/blender/source/blender/imbuf/intern/indexer.c
trunk/blender/source/blender/imbuf/intern/iris.c
trunk/blender/source/blender/imbuf/intern/jp2.c
trunk/blender/source/blender/imbuf/intern/jpeg.c
trunk/blender/source/blender/imbuf/intern/png.c
trunk/blender/source/blender/imbuf/intern/radiance_hdr.c
trunk/blender/source/blender/imbuf/intern/readimage.c
trunk/blender/source/blender/imbuf/intern/targa.c
trunk/blender/source/blender/imbuf/intern/thumbs.c
trunk/blender/source/blender/imbuf/intern/thumbs_blend.c
trunk/blender/source/blender/imbuf/intern/util.c
trunk/blender/source/blender/modifiers/intern/MOD_fluidsim_util.c
trunk/blender/source/blender/python/intern/bpy_interface.c
trunk/blender/source/blender/render/intern/source/voxeldata.c
trunk/blender/source/blender/windowmanager/CMakeLists.txt
trunk/blender/source/blender/windowmanager/SConscript
trunk/blender/source/blender/windowmanager/intern/wm_files.c
trunk/blender/source/creator/CMakeLists.txt
trunk/blender/source/creator/creator.c
Added Paths:
-----------
trunk/blender/intern/utfconv/
trunk/blender/intern/utfconv/CMakeLists.txt
trunk/blender/intern/utfconv/SConscript
trunk/blender/intern/utfconv/utf_winfunc.c
trunk/blender/intern/utfconv/utf_winfunc.h
trunk/blender/intern/utfconv/utfconv.c
trunk/blender/intern/utfconv/utfconv.h
Modified: trunk/blender/build_files/scons/tools/Blender.py
===================================================================
--- trunk/blender/build_files/scons/tools/Blender.py 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/build_files/scons/tools/Blender.py 2012-03-20 02:17:37 UTC (rev 45012)
@@ -340,6 +340,7 @@
if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs.append(env['BF_PTHREADS_INC'])
+ incs.append('#/intern/utfconv')
env.Append(CPPDEFINES=defs)
env.Append(CPPPATH=incs)
Modified: trunk/blender/intern/CMakeLists.txt
===================================================================
--- trunk/blender/intern/CMakeLists.txt 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/CMakeLists.txt 2012-03-20 02:17:37 UTC (rev 45012)
@@ -66,3 +66,8 @@
add_subdirectory(cycles)
endif()
+
+#Only Windows needs utf16 converter
+if(WIN32)
+ add_subdirectory(utfconv)
+endif()
\ No newline at end of file
Modified: trunk/blender/intern/SConscript
===================================================================
--- trunk/blender/intern/SConscript 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/SConscript 2012-03-20 02:17:37 UTC (rev 45012)
@@ -3,6 +3,7 @@
SConscript(['audaspace/SConscript',
'string/SConscript',
+ 'utfconv/SConscript',
'ghost/SConscript',
'guardedalloc/SConscript',
'moto/SConscript',
Modified: trunk/blender/intern/ghost/CMakeLists.txt
===================================================================
--- trunk/blender/intern/ghost/CMakeLists.txt 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/CMakeLists.txt 2012-03-20 02:17:37 UTC (rev 45012)
@@ -281,6 +281,10 @@
${WINTAB_INC}
)
+ list(APPEND INC
+ ../utfconv
+ )
+
list(APPEND SRC
intern/GHOST_DisplayManagerWin32.cpp
intern/GHOST_SystemWin32.cpp
Modified: trunk/blender/intern/ghost/SConscript
===================================================================
--- trunk/blender/intern/ghost/SConscript 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/SConscript 2012-03-20 02:17:37 UTC (rev 45012)
@@ -110,6 +110,7 @@
if window_system in ('win32-vc', 'win32-mingw', 'cygwin', 'linuxcross', 'win64-vc'):
incs = env['BF_WINTAB_INC'] + ' ' + incs
+ incs += ' ../utfconv'
if window_system in ('win32-vc', 'win64-vc'):
env.BlenderLib ('bf_intern_ghost', sources, Split(incs), defines=defs, libtype=['intern','player'], priority = [40,15]) #, cc_compileflags=env['CCFLAGS'].append('/WX') )
Modified: trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/intern/GHOST_DropTargetWin32.cpp 2012-03-20 02:17:37 UTC (rev 45012)
@@ -34,6 +34,9 @@
#include "GHOST_DropTargetWin32.h"
#include <ShellApi.h>
+#include "utf_winfunc.h"
+#include "utfconv.h"
+
#ifdef GHOST_DEBUG
// utility
void printLastError(void);
@@ -267,20 +270,12 @@
{
if ( ::DragQueryFileW ( hdrop, nfile, fpath, MAX_PATH ) > 0 )
{
- if ( !WideCharToANSI(fpath, temp_path) )
+ if ( !(temp_path = alloc_utf_8_from_16(fpath, 0)) )
{
continue;
}
// Just ignore paths that could not be converted verbatim.
- if (strpbrk(temp_path, "?"))
- {
-#ifdef GHOST_DEBUG
- ::printf("\ndiscarding path that contains illegal characters: %s", temp_path);
-#endif // GHOST_DEBUG
- ::free(temp_path);
- temp_path = NULL;
- continue;
- }
+
strArray->strings[nvalid] = (GHOST_TUns8*) temp_path;
strArray->count = nvalid+1;
nvalid++;
@@ -309,7 +304,7 @@
if(pDataObject->GetData(&fmtetc, &stgmed) == S_OK)
{
LPCWSTR wstr = (LPCWSTR)::GlobalLock(stgmed.hGlobal);
- if ( !WideCharToANSI(wstr, tmp_string) )
+ if ( !(tmp_string = alloc_utf_8_from_16((wchar_t*)wstr, 0)) )
{
::GlobalUnlock(stgmed.hGlobal);
return NULL;
Modified: trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemPathsWin32.cpp 2012-03-20 02:17:37 UTC (rev 45012)
@@ -35,6 +35,7 @@
#define _WIN32_IE 0x0501
#endif
#include <shlobj.h>
+#include "utfconv.h"
#if defined(__MINGW32__) || defined(__CYGWIN__)
@@ -70,11 +71,14 @@
const GHOST_TUns8* GHOST_SystemPathsWin32::getSystemDir() const
{
- static char knownpath[MAX_PATH];
- HRESULT hResult = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath);
+ static char knownpath[MAX_PATH*3] = {0}; /* 1 utf-16 might translante into 3 utf-8. 2 utf-16 translates into 4 utf-8*/
+ wchar_t knownpath_16[MAX_PATH];
+ HRESULT hResult = SHGetFolderPathW(NULL, CSIDL_COMMON_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath_16);
+
if (hResult == S_OK)
{
+ conv_utf_16_to_8(knownpath_16,knownpath,MAX_PATH*3);
return (GHOST_TUns8*)knownpath;
}
@@ -83,11 +87,14 @@
const GHOST_TUns8* GHOST_SystemPathsWin32::getUserDir() const
{
- static char knownpath[MAX_PATH];
- HRESULT hResult = SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath);
+ static char knownpath[MAX_PATH*3] = {0};
+ wchar_t knownpath_16[MAX_PATH];
+ HRESULT hResult = SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, knownpath_16);
+
if (hResult == S_OK)
{
+ conv_utf_16_to_8(knownpath_16,knownpath,MAX_PATH*3);
return (GHOST_TUns8*)knownpath;
}
@@ -96,8 +103,11 @@
const GHOST_TUns8* GHOST_SystemPathsWin32::getBinaryDir() const
{
- static char fullname[MAX_PATH];
- if(GetModuleFileName(0, fullname, MAX_PATH)) {
+ static char fullname[MAX_PATH*3] = {0};
+ wchar_t fullname_16[MAX_PATH*3];
+
+ if(GetModuleFileNameW(0, fullname_16, MAX_PATH)) {
+ conv_utf_16_to_8(fullname_16,fullname,MAX_PATH*3);
return (GHOST_TUns8*)fullname;
}
@@ -107,5 +117,7 @@
void GHOST_SystemPathsWin32::addToSystemRecentFiles(const char* filename) const
{
/* SHARD_PATH resolves to SHARD_PATHA for non-UNICODE build */
- SHAddToRecentDocs(SHARD_PATH,filename);
+ UTF16_ENCODE(filename)
+ SHAddToRecentDocs(SHARD_PATHW,filename_16);
+ UTF16_UN_ENCODE(filename)
}
Modified: trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp
===================================================================
--- trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp 2012-03-20 01:33:24 UTC (rev 45011)
+++ trunk/blender/intern/ghost/intern/GHOST_SystemWin32.cpp 2012-03-20 02:17:37 UTC (rev 45012)
@@ -60,6 +60,8 @@
#endif
#endif
+#include "utfconv.h"
+
#include "GHOST_DisplayManagerWin32.h"
#include "GHOST_EventButton.h"
#include "GHOST_EventCursor.h"
@@ -292,8 +294,8 @@
}
// Process all the events waiting for us
- while (::PeekMessage(&msg, 0, 0, 0, PM_REMOVE) != 0) {
- ::DispatchMessage(&msg);
+ while (::PeekMessageW(&msg, 0, 0, 0, PM_REMOVE) != 0) {
+ ::DispatchMessageW(&msg);
anyProcessed = true;
}
} while (waitForEvent && !anyProcessed);
@@ -394,7 +396,7 @@
}
if (success) {
- WNDCLASS wc;
+ WNDCLASSW wc;
wc.style= CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc= s_wndProc;
wc.cbClsExtra= 0;
@@ -408,10 +410,10 @@
wc.hCursor = ::LoadCursor(0, IDC_ARROW);
wc.hbrBackground= (HBRUSH)::GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = 0;
- wc.lpszClassName= GHOST_WindowWin32::getWindowClassName();
+ wc.lpszClassName= L"GHOST_WindowClass";
// Use RegisterClassEx for setting small icon
- if (::RegisterClass(&wc) == 0) {
+ if (::RegisterClassW(&wc) == 0) {
success = GHOST_kFailure;
}
}
@@ -719,16 +721,18 @@
char utf8_char[6] = {0};
char ascii = 0;
- wchar_t utf16[2]={0};
+ wchar_t utf16[3]={0};
BYTE state[256] ={0};
- GetKeyboardState(state);
+ int r;
+ GetKeyboardState((PBYTE)state);
- if(ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout))
- WideCharToMultiByte(CP_UTF8, 0,
- (wchar_t*)utf16, 1,
- (LPSTR) utf8_char, 5,
- NULL,NULL); else *utf8_char = 0;
+ if(r = ToUnicodeEx(vk, 0, state, utf16, 2, 0, system->m_keylayout))
+ if((r>0 && r<3)){utf16[r]=0;
+
+ conv_utf_16_to_8(utf16,utf8_char,6);}
+ else if (r==-1) utf8_char[0] = '\0';
+
if(!keyDown) {utf8_char[0] = '\0'; ascii='\0';}
@@ -1189,8 +1193,7 @@
* DefWindowProc returns.
*/
break;
-
- ////////////////////////////////////////////////////////////////////////
+ ////////////////////////////////////////////////////////////////////////
// Other events
////////////////////////////////////////////////////////////////////////
case WM_GETTEXT:
@@ -1239,17 +1242,17 @@
}
if (!eventHandled)
- lResult = ::DefWindowProc(hwnd, msg, wParam, lParam);
+ lResult = ::DefWindowProcW(hwnd, msg, wParam, lParam);
return lResult;
}
GHOST_TUns8* GHOST_SystemWin32::getClipboard(bool selection) const
{
- wchar_t *buffer;
char *temp_buff;
if ( IsClipboardFormatAvailable(CF_UNICODETEXT) && OpenClipboard(NULL) ) {
+ wchar_t *buffer;
size_t len = 0;
HANDLE hData = GetClipboardData( CF_UNICODETEXT );
if (hData == NULL) {
@@ -1262,9 +1265,7 @@
return NULL;
}
- 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);
+ temp_buff = alloc_utf_8_from_16(buffer,0);
/* Buffer mustn't be accessed after CloseClipboard
it would like accessing free-d memory */
@@ -1272,6 +1273,31 @@
CloseClipboard();
return (GHOST_TUns8*)temp_buff;
+ } else if ( IsClipboardFormatAvailable(CF_TEXT) && OpenClipboard(NULL) ) {
+ char *buffer;
+ size_t len = 0;
+ HANDLE hData = GetClipboardData( CF_TEXT );
+ if (hData == NULL) {
+ CloseClipboard();
+ return NULL;
+ }
+ buffer = (char*)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';
+
+ /* Buffer mustn't be accessed after CloseClipboard
+ it would like accessing free-d memory */
+ GlobalUnlock( hData );
+ CloseClipboard();
+
+ return (GHOST_TUns8*)temp_buff;
} else {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list