Implemented support for unicode on Win32

Closes #51
This commit is contained in:
Daniel Collin 2013-01-01 12:25:48 +01:00
parent 6e64405aee
commit 74bd0fba9c
9 changed files with 97 additions and 44 deletions

View File

@ -1,5 +1,14 @@
#pragma once #pragma once
#if defined(_WIN32)
int Dialog_open(wchar_t* dest);
int Dialog_save(wchar_t* dest);
#else
int Dialog_open(char* dest); int Dialog_open(char* dest);
int Dialog_save(char* dest); int Dialog_save(char* dest);
#endif

View File

@ -17,8 +17,8 @@
#include "../../sync/base.h" #include "../../sync/base.h"
#include "../../sync/data.h" #include "../../sync/data.h"
extern void Window_setTitle(const char* title); extern void Window_setTitle(const text_t* title);
extern void Window_populateRecentList(const char** files); extern void Window_populateRecentList(const text_t** files);
static void updateNeedsSaving(); static void updateNeedsSaving();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -54,10 +54,10 @@ static EditorData s_editorData;
static CopyData s_copyData; static CopyData s_copyData;
static int s_undoLevel = 0; static int s_undoLevel = 0;
static bool reset_tracks = true; static bool reset_tracks = true;
static char s_filenames[5][2048]; static text_t s_filenames[5][2048];
static char* s_loadedFilename = 0; static text_t* s_loadedFilename = 0;
static char* s_recentFiles[] = static text_t* s_recentFiles[] =
{ {
s_filenames[0], s_filenames[0],
s_filenames[1], s_filenames[1],
@ -68,47 +68,71 @@ static char* s_recentFiles[] =
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
char** Editor_getRecentFiles() text_t** Editor_getRecentFiles()
{ {
return (char**)s_recentFiles; return (text_t**)s_recentFiles;
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const char* getMostRecentFile() const text_t* getMostRecentFile()
{ {
return s_recentFiles[0]; return s_recentFiles[0];
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setMostRecentFile(const char* filename) static void textCopy(text_t* dest, const text_t* src)
{
#if defined(_WIN32)
wcscpy_s(dest, 2048, src);
#else
strcpy(dest, src);
#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static int textCmp(text_t* t0, const text_t* t1)
{
#if defined(_WIN32)
return wcscmp(t0, t1);
#else
return strcmp(t0, t1);
#endif
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setMostRecentFile(const text_t* filename)
{ {
int i; int i;
// move down all files // move down all files
for (i = 3; i >= 0; --i) for (i = 3; i >= 0; --i)
strcpy(s_recentFiles[i+1], s_recentFiles[i]); textCopy(s_recentFiles[i+1], s_recentFiles[i]);
strcpy(s_recentFiles[0], filename); textCopy(s_recentFiles[0], filename);
s_loadedFilename = s_recentFiles[0]; s_loadedFilename = s_recentFiles[0];
// check if the string was already present and remove it if that is the case by compacting the array // check if the string was already present and remove it if that is the case by compacting the array
for (i = 1; i < 5; ++i) for (i = 1; i < 5; ++i)
{ {
if (!strcmp(s_recentFiles[i], filename)) if (!textCmp(s_recentFiles[i], filename))
{ {
for (; i < 4; ++i) for (; i < 4; ++i)
strcpy(s_recentFiles[i], s_recentFiles[i + 1]); textCopy(s_recentFiles[i], s_recentFiles[i + 1]);
break; break;
} }
} }
Window_populateRecentList((const char**)s_recentFiles); Window_populateRecentList((const text_t**)s_recentFiles);
} }
//
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static inline struct sync_track** getTracks() static inline struct sync_track** getTracks()
@ -1261,13 +1285,20 @@ void Editor_timedUpdate()
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void setWindowTitle(const char* path, bool needsSave) static void setWindowTitle(const text_t* path, bool needsSave)
{ {
char windowTitle[4096]; text_t windowTitle[4096];
#if defined(_WIN32)
if (needsSave)
swprintf_s(windowTitle, sizeof(windowTitle), L"RocketEditor - (%s) *", path);
else
swprintf_s(windowTitle, sizeof(windowTitle), L"RocketEditor - (%s)", path);
#else
if (needsSave) if (needsSave)
sprintf(windowTitle, "RocketEditor - (%s) *", path); sprintf(windowTitle, "RocketEditor - (%s) *", path);
else else
sprintf(windowTitle, "RocketEditor - (%s)", path); sprintf(windowTitle, "RocketEditor - (%s)", path);
#endif
Window_setTitle(windowTitle); Window_setTitle(windowTitle);
} }
@ -1291,7 +1322,7 @@ void updateNeedsSaving()
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
static void onFinishedLoad(const char* path) static void onFinishedLoad(const text_t* path)
{ {
Editor_update(); Editor_update();
setWindowTitle(path, false); setWindowTitle(path, false);
@ -1303,8 +1334,8 @@ static void onFinishedLoad(const char* path)
void Editor_loadRecentFile(int id) void Editor_loadRecentFile(int id)
{ {
char path[2048]; text_t path[2048];
strcpy(path, s_recentFiles[id]); // must be unique buffer when doing set mostRecent textCopy(path, s_recentFiles[id]); // must be unique buffer when doing set mostRecent
if (LoadSave_loadRocketXML(path, getTrackData())) if (LoadSave_loadRocketXML(path, getTrackData()))
onFinishedLoad(path); onFinishedLoad(path);
@ -1314,7 +1345,7 @@ void Editor_loadRecentFile(int id)
static void onOpen() static void onOpen()
{ {
char currentFile[2048]; text_t currentFile[2048];
if (LoadSave_loadRocketXMLDialog(currentFile, getTrackData())) if (LoadSave_loadRocketXMLDialog(currentFile, getTrackData()))
onFinishedLoad(currentFile); onFinishedLoad(currentFile);
@ -1324,7 +1355,7 @@ static void onOpen()
static bool onSaveDialog() static bool onSaveDialog()
{ {
char path[2048]; text_t path[2048];
int ret; int ret;
if (!(ret = LoadSave_saveRocketXMLDialog(path, getTrackData()))) if (!(ret = LoadSave_saveRocketXMLDialog(path, getTrackData())))

View File

@ -16,7 +16,7 @@ void Editor_updateTrackScroll();
void Editor_loadRecentFile(int file); void Editor_loadRecentFile(int file);
bool Editor_saveBeforeExit(); bool Editor_saveBeforeExit();
char** Editor_getRecentFiles(); text_t** Editor_getRecentFiles();
enum enum
{ {

View File

@ -317,7 +317,7 @@ static int renderChannel(struct TrackInfo* info, int startX, Track* trackData, b
const int endPos = info->endPos; const int endPos = info->endPos;
struct sync_track* track = 0; struct sync_track* track = 0;
const uint32_t color = trackData->color; const uint32_t color = trackData->color;
bool folded; bool folded = false;
if (!valuesOnly) if (!valuesOnly)
{ {

View File

@ -146,13 +146,18 @@ static void parseXml(mxml_node_t* rootNode, TrackData* trackData)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int LoadSave_loadRocketXML(const char* path, TrackData* trackData) int LoadSave_loadRocketXML(const text_t* path, TrackData* trackData)
{ {
FILE* fp = 0; FILE* fp = 0;
mxml_node_t* tree = 0; mxml_node_t* tree = 0;
#if defined(_WIN32)
if (_wfopen_s(&fp, path, L"r") != 0)
return false;
#else
if (!(fp = fopen(path, "r"))) if (!(fp = fopen(path, "r")))
return false; return false;
#endif
if (!(tree = mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK))) if (!(tree = mxmlLoadFile(NULL, fp, MXML_TEXT_CALLBACK)))
{ {
@ -170,7 +175,7 @@ int LoadSave_loadRocketXML(const char* path, TrackData* trackData)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int LoadSave_loadRocketXMLDialog(char* path, TrackData* trackData) int LoadSave_loadRocketXMLDialog(text_t* path, TrackData* trackData)
{ {
if (!Dialog_open(path)) if (!Dialog_open(path))
return false; return false;
@ -238,7 +243,7 @@ static void setElementFloat(mxml_node_t* node, char* attr, float v)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int LoadSave_saveRocketXML(const char* path, TrackData* trackData) int LoadSave_saveRocketXML(const text_t* path, TrackData* trackData)
{ {
mxml_node_t* xml; mxml_node_t* xml;
mxml_node_t* tracks; mxml_node_t* tracks;
@ -251,7 +256,7 @@ int LoadSave_saveRocketXML(const char* path, TrackData* trackData)
// save groups that are folded // save groups that are folded
for (p = 0; p < trackData->groupCount; ++p) for (p = 0; p < (size_t)trackData->groupCount; ++p)
{ {
mxml_node_t* node; mxml_node_t* node;
Group* group = &trackData->groups[p]; Group* group = &trackData->groups[p];
@ -288,7 +293,13 @@ int LoadSave_saveRocketXML(const char* path, TrackData* trackData)
} }
} }
#if defined(_WIN32)
_wfopen_s(&fp, path, L"wt");
#else
fp = fopen(path, "wt"); fp = fopen(path, "wt");
#endif
mxmlSaveFile(xml, fp, whitespaceCallback); mxmlSaveFile(xml, fp, whitespaceCallback);
fclose(fp); fclose(fp);
@ -297,7 +308,7 @@ int LoadSave_saveRocketXML(const char* path, TrackData* trackData)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int LoadSave_saveRocketXMLDialog(char* path, TrackData* trackData) int LoadSave_saveRocketXMLDialog(text_t* path, TrackData* trackData)
{ {
if (!Dialog_save(path)) if (!Dialog_save(path))
return false; return false;

View File

@ -1,9 +1,11 @@
#pragma once #pragma once
#include <Emgui.h>
struct TrackData; struct TrackData;
int LoadSave_loadRocketXML(const char* path, struct TrackData* trackData); int LoadSave_loadRocketXML(const text_t* path, struct TrackData* trackData);
int LoadSave_loadRocketXMLDialog(char* path, struct TrackData* trackData); int LoadSave_loadRocketXMLDialog(text_t* path, struct TrackData* trackData);
int LoadSave_saveRocketXML(const char* path, struct TrackData* trackData); int LoadSave_saveRocketXML(const text_t* path, struct TrackData* trackData);
int LoadSave_saveRocketXMLDialog(char* path, struct TrackData* trackData); int LoadSave_saveRocketXMLDialog(text_t* path, struct TrackData* trackData);

View File

@ -2,7 +2,7 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int Dialog_open(char* path, int pathSize) int Dialog_open(wchar_t* path, int pathSize)
{ {
OPENFILENAME ofn; OPENFILENAME ofn;
@ -11,7 +11,7 @@ int Dialog_open(char* path, int pathSize)
ofn.lpstrFile = path; ofn.lpstrFile = path;
ofn.lpstrFile[0] = '\0'; ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = pathSize; ofn.nMaxFile = pathSize;
ofn.lpstrFilter = "All\0*.*\0Rocket\0*.Rocket\0"; ofn.lpstrFilter = L"All\0*.*\0Rocket\0*.Rocket\0";
ofn.nFilterIndex = 1; ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL; ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0; ofn.nMaxFileTitle = 0;

View File

@ -37,7 +37,7 @@ static void closeWindow()
DestroyWindow(s_window); DestroyWindow(s_window);
} }
UnregisterClass("GLRocket", s_instance); UnregisterClass(L"GLRocket", s_instance);
} }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@ -49,7 +49,7 @@ void swapBuffers()
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
bool createWindow(const char* title, int width, int height) bool createWindow(const wchar_t* title, int width, int height)
{ {
GLuint format; GLuint format;
WNDCLASS wc; WNDCLASS wc;
@ -93,14 +93,14 @@ bool createWindow(const char* title, int width, int height)
wc.lpfnWndProc = (WNDPROC)WndProc; wc.lpfnWndProc = (WNDPROC)WndProc;
wc.hInstance = s_instance; wc.hInstance = s_instance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszClassName = "RocketEditor"; wc.lpszClassName = L"RocketEditor";
wc.hIcon = LoadIcon(s_instance, IDI_APPLICATION); wc.hIcon = LoadIcon(s_instance, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU); wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
if (!RegisterClass(&wc)) if (!RegisterClass(&wc))
{ {
MessageBox(0, "Failed To Register Window Class", "ERROR", MB_OK | MB_ICONEXCLAMATION); MessageBox(0, L"Failed To Register Window Class", L"ERROR", MB_OK | MB_ICONEXCLAMATION);
return FALSE; return FALSE;
} }
@ -110,7 +110,7 @@ bool createWindow(const char* title, int width, int height)
AdjustWindowRectEx(&rect, style, FALSE, exStyle); AdjustWindowRectEx(&rect, style, FALSE, exStyle);
// Create The Window // Create The Window
if (!(s_window = CreateWindowEx(exStyle, "RocketEditor", title, style | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, if (!(s_window = CreateWindowEx(exStyle, L"RocketEditor", title, style | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
0, 0, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, s_instance, NULL))) 0, 0, rect.right - rect.left, rect.bottom - rect.top, NULL, NULL, s_instance, NULL)))
{ {
closeWindow(); // Reset The Display closeWindow(); // Reset The Display
@ -157,7 +157,7 @@ bool createWindow(const char* title, int width, int height)
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void Window_setTitle(const char* title) void Window_setTitle(const wchar_t* title)
{ {
SetWindowText(s_window, title); SetWindowText(s_window, title);
} }
@ -343,7 +343,7 @@ int WINAPI WinMain(HINSTANCE instance, HINSTANCE prevInstance, LPSTR cmndLine, i
memset(&msg, 0, sizeof(MSG)); memset(&msg, 0, sizeof(MSG));
if (!createWindow("RocketEditor", 800, 600)) if (!createWindow(L"RocketEditor", 800, 600))
return 0; return 0;
accel = LoadAccelerators(instance, MAKEINTRESOURCE(IDR_ACCELERATOR)); accel = LoadAccelerators(instance, MAKEINTRESOURCE(IDR_ACCELERATOR));

View File

@ -2,11 +2,11 @@ local macosx = {
Env = { Env = {
CPPDEFS = { "EMGUI_MACOSX" }, CPPDEFS = { "EMGUI_MACOSX" },
CCOPTS = { CCOPTS = {
-- "-Weverything", "-Wall",
"-Wno-deprecated-declarations", -- TickCount issue no Mountain Lion (needs to be fixed) "-Wno-deprecated-declarations", -- TickCount issue no Mountain Lion (needs to be fixed)
"-I.", "-DMACOSX", "-Wall", "-I.", "-DMACOSX", "-Wall",
{ "-O0", "-g"; Config = "*-*-debug" }, { "-O0", "-g"; Config = "*-*-debug" },
{ "-O3"; Config = "*-*-release" }, { "-O4"; Config = "*-*-release" },
}, },
}, },
@ -17,7 +17,7 @@ local win32 = {
Env = { Env = {
GENERATE_PDB = "1", GENERATE_PDB = "1",
CCOPTS = { CCOPTS = {
"/W4", "/I.", "/DWIN32", "/D_CRT_SECURE_NO_WARNINGS", "/W4", "/I.", "/WX", "/DUNICODE", "/D_UNICODE", "/DWIN32", "/D_CRT_SECURE_NO_WARNINGS", "/wd4996",
{ "/Od"; Config = "*-*-debug" }, { "/Od"; Config = "*-*-debug" },
{ "/O2"; Config = "*-*-release" }, { "/O2"; Config = "*-*-release" },
}, },