From 94c7fcd10127c91f575ef8ec5a76c353248ebcc3 Mon Sep 17 00:00:00 2001
From: Rodrigo Braz Monteiro <zeratul@cellosoft.com>
Date: Fri, 25 Jan 2008 23:16:29 +0000
Subject: [PATCH] Fixed assdraw3 to compile on MSVC with Unicode on. Thanks to
 TheFluff for the perl script to do the conversion.

Originally committed to SVN as r1839.
---
 aegisub/version.cpp              |   2 +-
 assdraw/src/assdraw.cpp          | 179 +++++++++++++++++--------------
 assdraw/src/assdraw.hpp          |   3 +-
 assdraw/src/assdraw.rc           |  52 ++++-----
 assdraw/src/assdraw_settings.cpp |  18 ++--
 assdraw/src/canvas.cpp           |  88 +++++++--------
 assdraw/src/canvas.hpp           |   3 +-
 assdraw/src/cmd.cpp              |  16 +--
 assdraw/src/convert.bat          |   2 +
 assdraw/src/dlgctrl.cpp          |  32 +++---
 assdraw/src/engine.cpp           |  22 ++--
 assdraw/src/library.cpp          |  24 ++---
 assdraw/src/settings.cpp         |  68 ++++++------
 assdraw/src/t-stringifier.pl     |  58 ++++++++++
 14 files changed, 321 insertions(+), 246 deletions(-)
 create mode 100644 assdraw/src/convert.bat
 create mode 100644 assdraw/src/t-stringifier.pl

diff --git a/aegisub/version.cpp b/aegisub/version.cpp
index e50541003..6fb95202e 100644
--- a/aegisub/version.cpp
+++ b/aegisub/version.cpp
@@ -78,7 +78,7 @@ struct VersionInfoStruct {
 		wxString SCMStr, VersionStr;
 
 		// Update this whenever a new version is released
-		VersionNumber = _T("v2.00");
+		VersionNumber = _T("v2.0.0");
 #ifdef _DEBUG
 		IsDebug = true;
 #else
diff --git a/assdraw/src/assdraw.cpp b/assdraw/src/assdraw.cpp
index 132c01882..a6f228f99 100644
--- a/assdraw/src/assdraw.cpp
+++ b/assdraw/src/assdraw.cpp
@@ -43,6 +43,19 @@
 #include <wx/dynlib.h>
 #include <wx/stdpaths.h>
 
+
+/////////////
+// Libraries
+#ifdef __VISUALC__
+#pragma comment(lib, "comctl32.lib")
+#ifdef __WXDEBUG__
+#pragma comment(lib, "wxmsw28ud_propgrid.lib")
+#else
+#pragma comment(lib, "wxmsw28u_propgrid.lib")
+#endif
+#endif
+
+
 //DEFINE_EVENT_TYPE(wxEVT_SETTINGS_CHANGED)
 
 // initialize wxWidget to accept our App class
@@ -84,7 +97,7 @@ END_EVENT_TABLE()
 // the application class: ASSDrawApp
 // ----------------------------------------------------------------------------
 
-// 'Main program' equivalent: the program execution "starts" here
+// 'Main program' equivalent: the program execution _T("starts") here
 bool ASSDrawApp::OnInit()
 {
     // create the main application window
@@ -152,12 +165,12 @@ ASSDrawFrame::ASSDrawFrame( wxApp *app, const wxString& title, const wxPoint& po
 	// settings
 	/*
 	settingsdlg = NULL;
-	wxString settingsdllfile = wxFileName(::wxGetCwd(), "settings.dll").GetFullPath();
+	wxString settingsdllfile = wxFileName(::wxGetCwd(), _T("settings.dll")).GetFullPath();
 
 	if (::wxFileExists(settingsdllfile))
 	{
 		wxDynamicLibrary settingsdll(settingsdllfile);
-		wxString symbol("CreateASSDrawSettingsDialogInstance");
+		wxString symbol(_T("CreateASSDrawSettingsDialogInstance"));
 		if (settingsdll.IsLoaded() && settingsdll.HasSymbol(symbol)) 
 		{
 			typedef ASSDrawSettingsDialog* (*FuncType)(wxWindow*,ASSDrawFrame*,int);
@@ -169,7 +182,7 @@ ASSDrawFrame::ASSDrawFrame( wxApp *app, const wxString& title, const wxPoint& po
 			//SetTitle(settingsdllfile);
 			//settingsdlg = func(NULL,this, 809131);
 			//settingsdlg->Init();
-			//m_mgr.AddPane(settingsdlg, wxAuiPaneInfo().Name(wxT("settings")).Caption(wxT("Settings")).Right().Layer(3).Position(0).CloseButton(true).BestSize(wxSize(240, 480)).MinSize(wxSize(200, 200)));
+			//m_mgr.AddPane(settingsdlg, wxAuiPaneInfo().Name(_T("settings")).Caption(_T("Settings")).Right().Layer(3).Position(0).CloseButton(true).BestSize(wxSize(240, 480)).MinSize(wxSize(200, 200)));
 		}
 	}
 	*/
@@ -185,25 +198,25 @@ ASSDrawFrame::ASSDrawFrame( wxApp *app, const wxString& title, const wxPoint& po
 
 	config->SetPath(_T("info"));
 	wxString version;
-	config->Read("version", &version);
-	config->SetPath("..");
+	config->Read(_T("version"), &version);
+	config->SetPath(_T(".."));
 
 	default_perspective = m_mgr.SavePerspective(); // back up default perspective
-	config->SetPath("perspective");
+	config->SetPath(_T("perspective"));
 	wxString perspective;
-	if (config->Read("perspective", &perspective) && version == VERSION) m_mgr.LoadPerspective(perspective, false);
-	config->SetPath("..");
+	if (config->Read(_T("perspective"), &perspective) && version == VERSION) m_mgr.LoadPerspective(perspective, false);
+	config->SetPath(_T(".."));
 
-	config->SetPath("library");
+	config->SetPath(_T("library"));
 	int n = 0;
-	config->Read("n", &n);
+	config->Read(_T("n"), &n);
 	for (int i = 0; i < n; i++)
 	{
 		wxString libcmds;
-		config->Read(wxString::Format("%d",i), &libcmds);
+		config->Read(wxString::Format(_T("%d"),i), &libcmds);
 		shapelib->AddShapePreview(libcmds);		
 	}
-	config->SetPath("..");
+	config->SetPath(_T(".."));
 	
     m_mgr.Update();
 	m_canvas->SetFocus();
@@ -222,12 +235,12 @@ ASSDrawFrame::ASSDrawFrame( wxApp *app, const wxString& title, const wxPoint& po
 	wxDateTime now = wxDateTime::Now();
 	if (now.IsLaterThan(expire))
 	{
-	 	wxMessageDialog expired(this, "Thank you for trying ASSDraw3. This beta version has expired. Please visit http://malakith.net/aegisub/index.php?topic=912.0 to get the latest release. Visit now?", wxT("Beta version"), wxYES_NO | wxICON_INFORMATION);
+	 	wxMessageDialog expired(this, _T("Thank you for trying ASSDraw3. This beta version has expired. Please visit http://malakith.net/aegisub/index.php?topic=912.0 to get the latest release. Visit now?"), _T("Beta version"), wxYES_NO | wxICON_INFORMATION);
 	 	if (expired.ShowModal() == wxID_YES)
-			::wxLaunchDefaultBrowser(wxString("http://malakith.net/aegisub/index.php?topic=912.0"));
+			::wxLaunchDefaultBrowser(wxString(_T("http://malakith.net/aegisub/index.php?topic=912.0")));
 		Close();
 	}
-	SetTitle(wxString::Format("%s beta %d (expires %s)", TITLE, BETAVERSION, expire.FormatDate().c_str()));
+	SetTitle(wxString::Format(_T("%s beta %d (expires %s)"), TITLE, BETAVERSION, expire.FormatDate().c_str()));
 	#endif
 
 	if (firsttime)
@@ -236,16 +249,16 @@ ASSDrawFrame::ASSDrawFrame( wxApp *app, const wxString& title, const wxPoint& po
 		_About(3);
 
 	helpcontroller.SetParentWindow(this);
-	helpcontroller.Initialize(wxFileName(::wxGetCwd(), "ASSDraw3.chm").GetFullPath());
+	helpcontroller.Initialize(wxFileName(::wxGetCwd(), _T("ASSDraw3.chm")).GetFullPath());
 }
 
 void ASSDrawFrame::SetToolBars()
 {
     drawtbar = new wxToolBar(this, wxID_ANY, __DPDS__ , wxTB_FLAT | wxTB_TEXT | wxTB_NODIVIDER | wxTB_HORIZONTAL);
-	drawtbar->AddTool(TB_CLEAR, _T("Clear"), wxBITMAP(new_), wxNullBitmap, wxITEM_NORMAL, "", TIPS_CLEAR);
-    //tbar->AddTool(TB_EDITSRC, _T("Source"), wxBITMAP(src_), wxNullBitmap, wxITEM_NORMAL, "", TIPS_EDITSRC);
-    drawtbar->AddCheckTool(TB_PREVIEW, _T("Preview"), wxBITMAP(preview_), wxNullBitmap, "", TIPS_PREVIEW);
-    //drawtbar->AddTool(TB_TRANSFORM, _T("Transform"), wxBITMAP(rot_), wxNullBitmap, wxITEM_NORMAL, "", TIPS_TRANSFORM);
+	drawtbar->AddTool(TB_CLEAR, _T("Clear"), wxBITMAP(new_), wxNullBitmap, wxITEM_NORMAL, _T(""), TIPS_CLEAR);
+    //tbar->AddTool(TB_EDITSRC, _T("Source"), wxBITMAP(src_), wxNullBitmap, wxITEM_NORMAL, _T(""), TIPS_EDITSRC);
+    drawtbar->AddCheckTool(TB_PREVIEW, _T("Preview"), wxBITMAP(preview_), wxNullBitmap, _T(""), TIPS_PREVIEW);
+    //drawtbar->AddTool(TB_TRANSFORM, _T("Transform"), wxBITMAP(rot_), wxNullBitmap, wxITEM_NORMAL, _T(""), TIPS_TRANSFORM);
 	zoomslider = new wxSlider(drawtbar, TB_ZOOMSLIDER, 1000, 100, 5000, __DPDS__ );
 	//zoomslider->SetSize(280, zoomslider->GetSize().y);
 	zoomslider->Connect(wxEVT_SCROLL_LINEUP, wxScrollEventHandler(ASSDrawFrame::OnZoomSliderChanged), NULL, this);
@@ -257,35 +270,35 @@ void ASSDrawFrame::SetToolBars()
 	drawtbar->AddControl(zoomslider);
     drawtbar->Realize();
 
-    m_mgr.AddPane(drawtbar, wxAuiPaneInfo().Name(wxT("drawtbar")).Caption(TBNAME_DRAW).
+    m_mgr.AddPane(drawtbar, wxAuiPaneInfo().Name(_T("drawtbar")).Caption(TBNAME_DRAW).
                   ToolbarPane().Top().Position(0).Dockable(true).LeftDockable(false).RightDockable(false));
 
     modetbar = new wxToolBar(this, wxID_ANY, __DPDS__ , wxTB_FLAT | wxTB_TEXT | wxTB_NODIVIDER | wxTB_HORIZONTAL);
-    modetbar->AddRadioTool(MODE_ARR, _T("Drag"), wxBITMAP(arr_), wxNullBitmap, "", TIPS_ARR);
-    modetbar->AddRadioTool(MODE_M, _T("Move"), wxBITMAP(m_), wxNullBitmap, "", TIPS_M);
-    //modetbar->AddRadioTool(MODE_N, _T("Move*"), wxBITMAP(n_), wxNullBitmap, "", TIPS_N);
-    modetbar->AddRadioTool(MODE_L, _T("Line"), wxBITMAP(l_), wxNullBitmap, "", TIPS_L);
-    modetbar->AddRadioTool(MODE_B, _T("Bezier"), wxBITMAP(b_), wxNullBitmap, "", TIPS_B);
-    //modetbar->AddRadioTool(MODE_S, _T("Spline"), wxBITMAP(s_), wxNullBitmap, "", TIPS_S);
-    //modetbar->AddRadioTool(MODE_P, _T("Extend"), wxBITMAP(p_), wxNullBitmap, "", TIPS_P);
-    //modetbar->AddRadioTool(MODE_C, _T("Close"), wxBITMAP(c_), wxNullBitmap, "", TIPS_C);
-    modetbar->AddRadioTool(MODE_DEL, _T("Delete"), wxBITMAP(del_), wxNullBitmap, "", TIPS_DEL);
-    modetbar->AddRadioTool(MODE_SCALEROTATE, _T("Scale/Rotate"), wxBITMAP(sc_rot_), wxNullBitmap, "", TIPS_SCALEROTATE);
-    modetbar->AddRadioTool(MODE_NUT_BILINEAR, _T("Bilinear"), wxBITMAP(nut_), wxNullBitmap, "", TIPS_NUTB);
-    //modetbar->AddRadioTool(MODE_NUT_PERSPECTIVE, _T("NUT:P"), wxBITMAP(arr_), wxNullBitmap, "", "");
+    modetbar->AddRadioTool(MODE_ARR, _T("Drag"), wxBITMAP(arr_), wxNullBitmap, _T(""), TIPS_ARR);
+    modetbar->AddRadioTool(MODE_M, _T("Move"), wxBITMAP(m_), wxNullBitmap, _T(""), TIPS_M);
+    //modetbar->AddRadioTool(MODE_N, _T("Move*"), wxBITMAP(n_), wxNullBitmap, _T(""), TIPS_N);
+    modetbar->AddRadioTool(MODE_L, _T("Line"), wxBITMAP(l_), wxNullBitmap, _T(""), TIPS_L);
+    modetbar->AddRadioTool(MODE_B, _T("Bezier"), wxBITMAP(b_), wxNullBitmap, _T(""), TIPS_B);
+    //modetbar->AddRadioTool(MODE_S, _T("Spline"), wxBITMAP(s_), wxNullBitmap, _T(""), TIPS_S);
+    //modetbar->AddRadioTool(MODE_P, _T("Extend"), wxBITMAP(p_), wxNullBitmap, _T(""), TIPS_P);
+    //modetbar->AddRadioTool(MODE_C, _T("Close"), wxBITMAP(c_), wxNullBitmap, _T(""), TIPS_C);
+    modetbar->AddRadioTool(MODE_DEL, _T("Delete"), wxBITMAP(del_), wxNullBitmap, _T(""), TIPS_DEL);
+    modetbar->AddRadioTool(MODE_SCALEROTATE, _T("Scale/Rotate"), wxBITMAP(sc_rot_), wxNullBitmap, _T(""), TIPS_SCALEROTATE);
+    modetbar->AddRadioTool(MODE_NUT_BILINEAR, _T("Bilinear"), wxBITMAP(nut_), wxNullBitmap, _T(""), TIPS_NUTB);
+    //modetbar->AddRadioTool(MODE_NUT_PERSPECTIVE, _T("NUT:P"), wxBITMAP(arr_), wxNullBitmap, _T(""), _T(""));
     modetbar->Realize();
 
-    m_mgr.AddPane(modetbar, wxAuiPaneInfo().Name(wxT("modetbar")).Caption(TBNAME_MODE).
+    m_mgr.AddPane(modetbar, wxAuiPaneInfo().Name(_T("modetbar")).Caption(TBNAME_MODE).
                   ToolbarPane().Top().Position(1).Dockable(true).LeftDockable(false).RightDockable(false));
 
     bgimgtbar = new wxToolBar(this, wxID_ANY, __DPDS__ , wxTB_FLAT | wxTB_TEXT | wxTB_NODIVIDER | wxTB_HORIZONTAL);
 	bgimgtbar->SetToolBitmapSize(wxSize(24,15));
-    bgimgtbar->AddCheckTool(DRAG_DWG, _T("Pan drawing"), wxBITMAP(pan_shp), wxNullBitmap, "", TIPS_DWG);
-    bgimgtbar->AddCheckTool(DRAG_BGIMG, _T("Pan background"), wxBITMAP(pan_bg), wxNullBitmap, "", TIPS_BGIMG);
-    //bgimgtbar->AddRadioTool(DRAG_BOTH, _T("Pan both"), wxBITMAP(pan_both), wxNullBitmap, "", TIPS_BOTH);
+    bgimgtbar->AddCheckTool(DRAG_DWG, _T("Pan drawing"), wxBITMAP(pan_shp), wxNullBitmap, _T(""), TIPS_DWG);
+    bgimgtbar->AddCheckTool(DRAG_BGIMG, _T("Pan background"), wxBITMAP(pan_bg), wxNullBitmap, _T(""), TIPS_BGIMG);
+    //bgimgtbar->AddRadioTool(DRAG_BOTH, _T("Pan both"), wxBITMAP(pan_both), wxNullBitmap, _T(""), TIPS_BOTH);
     bgimgtbar->Realize();
 
-    m_mgr.AddPane(bgimgtbar, wxAuiPaneInfo().Name(wxT("bgimgtbar")).Caption(TBNAME_BGIMG).
+    m_mgr.AddPane(bgimgtbar, wxAuiPaneInfo().Name(_T("bgimgtbar")).Caption(TBNAME_BGIMG).
                   ToolbarPane().Top().Position(2).Dockable(true).LeftDockable(false).RightDockable(false));
 	
 }
@@ -318,37 +331,37 @@ void ASSDrawFrame::SetMenus()
 	bgimgMenu->Append(DRAG_DWG, _T("Pan/Zoom &Drawing\tShift+F1"), TIPS_DWG, wxITEM_CHECK);
 	bgimgMenu->Append(DRAG_BGIMG, _T("Pan/Zoom Back&ground\tShift+F2"), TIPS_BGIMG, wxITEM_CHECK);
 	bgimgMenu->AppendSeparator();
-	bgimgMenu->Append(MENU_BGIMG_ALPHA, _T("Set background image opacity"), "");
+	bgimgMenu->Append(MENU_BGIMG_ALPHA, _T("Set background image opacity"), _T(""));
 	wxMenu* reposbgMenu = new wxMenu;
-	reposbgMenu->Append( MENU_REPOS_BGTOPLEFT, "Top left\tCtrl+Shift+7" );
-	reposbgMenu->Append( MENU_REPOS_BGTOPRIGHT, "Top right\tCtrl+Shift+9" );
-	reposbgMenu->Append( MENU_REPOS_BGCENTER, "&Center\tCtrl+Shift+5" );
-	reposbgMenu->Append( MENU_REPOS_BGBOTLEFT, "Bottom left\tCtrl+Shift+1" );
-	reposbgMenu->Append( MENU_REPOS_BGBOTRIGHT, "Bottom right\tCtrl+Shift+3" );
+	reposbgMenu->Append( MENU_REPOS_BGTOPLEFT, _T("Top left\tCtrl+Shift+7") );
+	reposbgMenu->Append( MENU_REPOS_BGTOPRIGHT, _T("Top right\tCtrl+Shift+9") );
+	reposbgMenu->Append( MENU_REPOS_BGCENTER, _T("&Center\tCtrl+Shift+5") );
+	reposbgMenu->Append( MENU_REPOS_BGBOTLEFT, _T("Bottom left\tCtrl+Shift+1") );
+	reposbgMenu->Append( MENU_REPOS_BGBOTRIGHT, _T("Bottom right\tCtrl+Shift+3") );
 	bgimgMenu->Append(MENU_BGIMG_RECENTER, _T("Reposition [&0, 0]"), reposbgMenu);
-	bgimgMenu->Append(MENU_BGIMG_REMOVE, _T("Remove background\tShift+Del"), "");
+	bgimgMenu->Append(MENU_BGIMG_REMOVE, _T("Remove background\tShift+Del"), _T(""));
 
 	wxMenu* reposMenu = new wxMenu;
-	reposMenu->Append( MENU_REPOS_TOPLEFT, "Top left\tCtrl+7" );
-	reposMenu->Append( MENU_REPOS_TOPRIGHT, "Top right\tCtrl+9" );
-	reposMenu->Append( MENU_REPOS_CENTER, "&Center\tCtrl+5" );
-	reposMenu->Append( MENU_REPOS_BOTLEFT, "Bottom left\tCtrl+1" );
-	reposMenu->Append( MENU_REPOS_BOTRIGHT, "Bottom right\tCtrl+3" );
+	reposMenu->Append( MENU_REPOS_TOPLEFT, _T("Top left\tCtrl+7") );
+	reposMenu->Append( MENU_REPOS_TOPRIGHT, _T("Top right\tCtrl+9") );
+	reposMenu->Append( MENU_REPOS_CENTER, _T("&Center\tCtrl+5") );
+	reposMenu->Append( MENU_REPOS_BOTLEFT, _T("Bottom left\tCtrl+1") );
+	reposMenu->Append( MENU_REPOS_BOTRIGHT, _T("Bottom right\tCtrl+3") );
 
 	tbarMenu = new wxMenu;
 	tbarMenu->AppendCheckItem(MENU_TB_DRAW, TBNAME_DRAW);
 	tbarMenu->AppendCheckItem(MENU_TB_MODE, TBNAME_MODE);
 	tbarMenu->AppendCheckItem(MENU_TB_BGIMG, TBNAME_BGIMG);
 	tbarMenu->AppendSeparator();
-	tbarMenu->Append(MENU_TB_ALL, "Show all");
-	tbarMenu->Append(MENU_TB_NONE, "Hide all");
-	tbarMenu->Append(MENU_TB_DOCK, "Dock all");
-	tbarMenu->Append(MENU_TB_UNDOCK, "Undock all");
+	tbarMenu->Append(MENU_TB_ALL, _T("Show all"));
+	tbarMenu->Append(MENU_TB_NONE, _T("Hide all"));
+	tbarMenu->Append(MENU_TB_DOCK, _T("Dock all"));
+	tbarMenu->Append(MENU_TB_UNDOCK, _T("Undock all"));
 
 	viewMenu = new wxMenu;
 	viewMenu->Append(MENU_LIBRARY, _T("&Library"), TIPS_LIBRARY, wxITEM_CHECK);
 	if (settingsdlg)
-		viewMenu->Append(MENU_SETTINGS, _T("&Settings"), "", wxITEM_CHECK);
+		viewMenu->Append(MENU_SETTINGS, _T("&Settings"), _T(""), wxITEM_CHECK);
 	viewMenu->Append(MENU_TBAR, _T("&Toolbars"), tbarMenu);
 	viewMenu->Append(MENU_RECENTER, _T("Reposition [&0, 0]"), reposMenu);
 	viewMenu->AppendSeparator();
@@ -372,41 +385,41 @@ void ASSDrawFrame::SetMenus()
 
 void ASSDrawFrame::SetPanes()
 {
-	m_mgr.AddPane(shapelib, wxAuiPaneInfo().Name(wxT("library")).Caption(wxT("Shapes Library")).
+	m_mgr.AddPane(shapelib, wxAuiPaneInfo().Name(_T("library")).Caption(_T("Shapes Library")).
                   Right().Layer(2).Position(0).CloseButton(true).BestSize(wxSize(120, 480)).MinSize(wxSize(100, 200)));
 
-	m_mgr.AddPane(m_canvas, wxAuiPaneInfo().Name(wxT("canvas")).CenterPane());
+	m_mgr.AddPane(m_canvas, wxAuiPaneInfo().Name(_T("canvas")).CenterPane());
 
-	m_mgr.AddPane(srctxtctrl, wxAuiPaneInfo().Name(wxT("commands")).Caption(wxT("Drawing commands")).
+	m_mgr.AddPane(srctxtctrl, wxAuiPaneInfo().Name(_T("commands")).Caption(_T("Drawing commands")).
                   Bottom().Layer(1).CloseButton(false).BestSize(wxSize(320, 48)));
 	
 	if (settingsdlg)
-		m_mgr.AddPane(settingsdlg, wxAuiPaneInfo().Name(wxT("settings")).Caption(wxT("Settings")).
+		m_mgr.AddPane(settingsdlg, wxAuiPaneInfo().Name(_T("settings")).Caption(_T("Settings")).
                   Right().Layer(3).Position(0).CloseButton(true).BestSize(wxSize(240, 480)).MinSize(wxSize(200, 200)).Show(false));
 }
 
 ASSDrawFrame::~ASSDrawFrame()
 {
-	config->SetPath("info");
-	config->Write("assdraw3.exe", wxStandardPaths::Get().GetExecutablePath());
-	config->Write("version", VERSION);
-	config->SetPath("..");
+	config->SetPath(_T("info"));
+	config->Write(_T("assdraw3.exe"), wxStandardPaths::Get().GetExecutablePath());
+	config->Write(_T("version"), VERSION);
+	config->SetPath(_T(".."));
 
 	SaveSettings();
 	
-	config->SetPath("perspective");
-	config->Write("perspective", m_mgr.SavePerspective());
-	config->SetPath("..");
+	config->SetPath(_T("perspective"));
+	config->Write(_T("perspective"), m_mgr.SavePerspective());
+	config->SetPath(_T(".."));
 
-	config->DeleteGroup("library");
-	config->SetPath("library");
+	config->DeleteGroup(_T("library"));
+	config->SetPath(_T("library"));
 	typedef std::vector< ASSDrawShapePreview *> PrevVec;
 	PrevVec shapes = shapelib->GetShapePreviews();
 	int n = shapes.size();
-	config->Write("n", n);
+	config->Write(_T("n"), n);
 	for (int i = 0; i < n; i++)
-		config->Write(wxString::Format("%d",i), shapes[i]->GenerateASS());
-	config->SetPath("..");
+		config->Write(wxString::Format(_T("%d"),i), shapes[i]->GenerateASS());
+	config->SetPath(_T(".."));
 
 	wxFileOutputStream cfgf(configfile);
 	config->Save(cfgf);
@@ -424,7 +437,7 @@ void ASSDrawFrame::_Clear()
 	if (msgb.ShowModal() == wxID_OK)
 	{
 		m_canvas->RefreshUndocmds();
-		m_canvas->AddUndo("Clear canvas");
+		m_canvas->AddUndo(_T("Clear canvas"));
 		m_canvas->ResetEngine(true);
 	    wxSize siz = m_canvas->GetClientSize();
 		m_canvas->ChangeZoomLevelTo(DEFAULT_SCALE, wxPoint(siz.x / 2, siz.y / 2));
@@ -486,7 +499,7 @@ void ASSDrawFrame::_Transform()
 			transformdlg->xformvals.f6,
 			transformdlg->xformvals.f7,
 			transformdlg->xformvals.f8 );
-		m_canvas->AddUndo("Transform");
+		m_canvas->AddUndo(_T("Transform"));
 		m_canvas->RefreshDisplay();
 		UpdateUndoRedoMenu();
 	}
@@ -688,25 +701,25 @@ void ASSDrawFrame::UndoOrRedo(bool isundo)
 void ASSDrawFrame::UpdateUndoRedoMenu()
 {
 	wxString nextUndo = m_canvas->GetTopUndo();
-	if (nextUndo.IsSameAs(""))
+	if (nextUndo.IsSameAs(_T("")))
 	{
-		drawMenu->SetLabel(MENU_UNDO, "Undo\tCtrl+Z");
+		drawMenu->SetLabel(MENU_UNDO, _T("Undo\tCtrl+Z"));
 		drawMenu->Enable(MENU_UNDO, false);
 	}
 	else
 	{
-		drawMenu->SetLabel(MENU_UNDO, wxString::Format("Undo: %s\tCtrl+Z", nextUndo.c_str()));
+		drawMenu->SetLabel(MENU_UNDO, wxString::Format(_T("Undo: %s\tCtrl+Z"), nextUndo.c_str()));
 		drawMenu->Enable(MENU_UNDO, true);
 	}
 	wxString nextRedo = m_canvas->GetTopRedo();
-	if (nextRedo.IsSameAs(""))
+	if (nextRedo.IsSameAs(_T("")))
 	{
-		drawMenu->SetLabel(MENU_REDO, "Redo\tCtrl+Y");
+		drawMenu->SetLabel(MENU_REDO, _T("Redo\tCtrl+Y"));
 		drawMenu->Enable(MENU_REDO, false);
 	}
 	else
 	{
-		drawMenu->SetLabel(MENU_REDO, wxString::Format("Redo: %s\tCtrl+Y", nextRedo.c_str()));
+		drawMenu->SetLabel(MENU_REDO, wxString::Format(_T("Redo: %s\tCtrl+Y"), nextRedo.c_str()));
 		drawMenu->Enable(MENU_REDO, true);
 	}
 }
@@ -714,7 +727,7 @@ void ASSDrawFrame::UpdateUndoRedoMenu()
 void ASSDrawFrame::UpdateFrameUI(unsigned level)
 {
 	bool hasbg = m_canvas->HasBackgroundImage();
-	int zoom = (int) round(m_canvas->GetScale() * 100.0);
+	int zoom = (int) ((m_canvas->GetScale() * 100.0)+0.5);
 	switch (level)
 	{
 	case 0: // all
@@ -749,7 +762,7 @@ void ASSDrawFrame::UpdateFrameUI(unsigned level)
 		#endif
 	case 3:	// zoom slider
 		zoomslider->SetValue(zoom);
-		SetStatusText( wxString::Format("%d%%", zoom), 2 );
+		SetStatusText( wxString::Format(_T("%d%%"), zoom), 2 );
 		zoomslider->Enable(m_canvas->GetDragMode().drawing && m_canvas->CanZoom());
 	}
 }
@@ -758,7 +771,7 @@ void ASSDrawFrame::OnClose(wxCloseEvent &event)
 {
 	if (event.CanVeto() && behaviors.confirmquit)
 	{
-		if (wxMessageDialog(this, wxT("Do you want to close ASSDraw3 now?"), wxT("Confirmation"), wxOK | wxCANCEL).ShowModal() == wxID_OK)
+		if (wxMessageDialog(this, _T("Do you want to close ASSDraw3 now?"), _T("Confirmation"), wxOK | wxCANCEL).ShowModal() == wxID_OK)
 			Destroy();	
 		else
 			event.Veto();
diff --git a/assdraw/src/assdraw.hpp b/assdraw/src/assdraw.hpp
index 065383d74..1ebd4dc4f 100644
--- a/assdraw/src/assdraw.hpp
+++ b/assdraw/src/assdraw.hpp
@@ -40,6 +40,7 @@
 #include "_common.hpp"
 
 #include <vector>
+#include <wx/wxprec.h>
 #include <wx/aui/aui.h>
 #include <wx/fileconf.h>
 #include <wx/help.h>
@@ -50,7 +51,7 @@
 #include "library.hpp" // shape library
 
 //#define BETAVERSION 2
-#define VERSION "3.0 final"
+#define VERSION _T("3.0 final")
 
 // this header file declares the following classes
 class ASSDrawApp;
diff --git a/assdraw/src/assdraw.rc b/assdraw/src/assdraw.rc
index 1ee736c0d..162d9bd91 100644
--- a/assdraw/src/assdraw.rc
+++ b/assdraw/src/assdraw.rc
@@ -28,38 +28,38 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
 
 // Icon with lowest ID value placed first to ensure application icon
 // remains consistent on all systems.
-APPICO                  ICON                    "../tsukasa.ico"
+APPICO                  ICON                    "tsukasa.ico"
 
 /////////////////////////////////////////////////////////////////////////////
 //
 // Bitmap
 //
 
-ASSDRAW3_               BITMAP                  "../bitmaps/assdraw3.bmp"
-NEW_                    BITMAP                  "../bitmaps/new_.bmp"
-SRC_                    BITMAP                  "../bitmaps/src_.bmp"
-PREVIEW_                BITMAP                  "../bitmaps/preview_.bmp"
-ARR_                    BITMAP                  "../bitmaps/arr_.bmp"
-M_                      BITMAP                  "../bitmaps/m_.bmp"
-N_                      BITMAP                  "../bitmaps/n_.bmp"
-L_                      BITMAP                  "../bitmaps/l_.bmp"
-B_                      BITMAP                  "../bitmaps/b_.bmp"
-S_                      BITMAP                  "../bitmaps/s_.bmp"
-P_                      BITMAP                  "../bitmaps/p_.bmp"
-C_                      BITMAP                  "../bitmaps/c_.bmp"
-DEL_                    BITMAP                  "../bitmaps/del_.bmp"
-NUT_                    BITMAP                  "../bitmaps/nut_.bmp"
-SC_ROT_                 BITMAP                  "../bitmaps/sc_rot_.bmp"
-ROT_                    BITMAP                  "../bitmaps/rot_.bmp"
-HELP_                   BITMAP                  "../bitmaps/help_.bmp"
-TRANSFORM               BITMAP                  "../bitmaps/transform.bmp"
-PAN_SHP                 BITMAP                  "../bitmaps/pan_shp.bmp"
-PAN_BG                  BITMAP                  "../bitmaps/pan_bg.bmp"
-//PAN_BOTH                BITMAP                  "../bitmaps/pan_both.bmp"
-ADD                     BITMAP                  "../bitmaps/add_.bmp"
-CHECK                   BITMAP                  "../bitmaps/check_.bmp"
-UNCHECK                 BITMAP                  "../bitmaps/uncheck_.bmp"
-DELCROSS                BITMAP                  "../bitmaps/del_cross.bmp"
+ASSDRAW3_               BITMAP                  "bitmaps/assdraw3.bmp"
+NEW_                    BITMAP                  "bitmaps/new_.bmp"
+SRC_                    BITMAP                  "bitmaps/src_.bmp"
+PREVIEW_                BITMAP                  "bitmaps/preview_.bmp"
+ARR_                    BITMAP                  "bitmaps/arr_.bmp"
+M_                      BITMAP                  "bitmaps/m_.bmp"
+N_                      BITMAP                  "bitmaps/n_.bmp"
+L_                      BITMAP                  "bitmaps/l_.bmp"
+B_                      BITMAP                  "bitmaps/b_.bmp"
+S_                      BITMAP                  "bitmaps/s_.bmp"
+P_                      BITMAP                  "bitmaps/p_.bmp"
+C_                      BITMAP                  "bitmaps/c_.bmp"
+DEL_                    BITMAP                  "bitmaps/del_.bmp"
+NUT_                    BITMAP                  "bitmaps/nut_.bmp"
+SC_ROT_                 BITMAP                  "bitmaps/sc_rot_.bmp"
+ROT_                    BITMAP                  "bitmaps/rot_.bmp"
+HELP_                   BITMAP                  "bitmaps/help_.bmp"
+TRANSFORM               BITMAP                  "bitmaps/transform.bmp"
+PAN_SHP                 BITMAP                  "bitmaps/pan_shp.bmp"
+PAN_BG                  BITMAP                  "bitmaps/pan_bg.bmp"
+//PAN_BOTH                BITMAP                  "bitmaps/pan_both.bmp"
+ADD                     BITMAP                  "bitmaps/add_.bmp"
+CHECK                   BITMAP                  "bitmaps/check_.bmp"
+UNCHECK                 BITMAP                  "bitmaps/uncheck_.bmp"
+DELCROSS                BITMAP                  "bitmaps/del_cross.bmp"
 
 #ifdef APSTUDIO_INVOKED
 /////////////////////////////////////////////////////////////////////////////
diff --git a/assdraw/src/assdraw_settings.cpp b/assdraw/src/assdraw_settings.cpp
index 860cdcd18..0a4f8dcec 100644
--- a/assdraw/src/assdraw_settings.cpp
+++ b/assdraw/src/assdraw_settings.cpp
@@ -97,7 +97,7 @@ void ASSDrawFrame::ApplySettings()
 		wxColourToAggRGBA(colors.library_shape, shapes[i]->rgba_shape);
 	shapelib->libarea->Refresh();
 	
-	m_canvas->SetDrawCmdSet(wxT(behaviors.parse_spc? "m n l b s p c _":"m n l b _"));
+	m_canvas->SetDrawCmdSet(behaviors.parse_spc? _T("m n l b s p c _"):_T("m n l b _"));
 
 	UpdateASSCommandStringToSrcTxtCtrl(m_canvas->GenerateASS());
 }
@@ -122,9 +122,9 @@ void ASSDrawFrame::OnSettingsChanged(wxCommandEvent& event)
 
 void ASSDrawFrame::LoadSettings()
 {
-	#define CFGREADCOLOR(color) if (config->Read(#color, &tmpstr)) color.Set(tmpstr);
-	#define CFGREAD(var) config->Read(#var, &var);
-	config->SetPath("settings");
+	#define CFGREADCOLOR(color) if (config->Read(wxString(#color,wxConvUTF8), &tmpstr)) color.Set(tmpstr);
+	#define CFGREAD(var) config->Read(wxString(#var,wxConvUTF8), &var);
+	config->SetPath(_T("settings"));
 	wxString tmpstr;
 	CFGREADCOLOR(colors.canvas_bg)
 	CFGREADCOLOR(colors.canvas_shape_normal)
@@ -152,14 +152,14 @@ void ASSDrawFrame::LoadSettings()
 	CFGREAD(behaviors.parse_spc)
 	CFGREAD(behaviors.nosplashscreen)
 	CFGREAD(behaviors.confirmquit)
-	config->SetPath("..");
+	config->SetPath(_T(".."));
 }
 
 void ASSDrawFrame::SaveSettings()
 {
-	#define CFGWRITE(var) config->Write(#var, var);
-	#define CFGWRITECOLOR(color) config->Write(#color, color.GetAsString(wxC2S_HTML_SYNTAX));
-	config->SetPath("settings");
+	#define CFGWRITE(var) config->Write(wxString(#var,wxConvUTF8), var);
+	#define CFGWRITECOLOR(color) config->Write(wxString(#color,wxConvUTF8), color.GetAsString(wxC2S_HTML_SYNTAX));
+	config->SetPath(_T("settings"));
 	CFGWRITECOLOR(colors.canvas_bg)
 	CFGWRITECOLOR(colors.canvas_shape_normal)
 	CFGWRITECOLOR(colors.canvas_shape_preview)
@@ -186,5 +186,5 @@ void ASSDrawFrame::SaveSettings()
 	CFGWRITE(behaviors.parse_spc)
 	CFGWRITE(behaviors.nosplashscreen)
 	CFGWRITE(behaviors.confirmquit)
-	config->SetPath("..");
+	config->SetPath(_T(".."));
 }
diff --git a/assdraw/src/canvas.cpp b/assdraw/src/canvas.cpp
index ab8eadeca..f480ef44a 100644
--- a/assdraw/src/canvas.cpp
+++ b/assdraw/src/canvas.cpp
@@ -121,7 +121,7 @@ ASSDrawCanvas::ASSDrawCanvas(wxWindow *parent, ASSDrawFrame *frame, int extrafla
 	// cursor = crosshair
 	SetCursor( *wxCROSS_CURSOR );
 
-	bgimg.alpha_dlg = new wxDialog(this, wxID_ANY, wxString("Background image opacity"));
+	bgimg.alpha_dlg = new wxDialog(this, wxID_ANY, wxString(_T("Background image opacity")));
 	bgimg.alpha_slider = new wxSlider(bgimg.alpha_dlg, TB_BGALPHA_SLIDER, 50, 0, 100, __DPDS__ , wxSL_LABELS);
 	bgimg.alpha_slider->SetSize(280, bgimg.alpha_slider->GetSize().y);
 	bgimg.alpha_dlg->Fit();
@@ -149,7 +149,7 @@ ASSDrawCanvas::~ASSDrawCanvas()
 void ASSDrawCanvas::ParseASS(wxString str, bool addundo)
 {
 	if (addundo)
-		AddUndo(wxT("Modify drawing commands"));
+		AddUndo(_T("Modify drawing commands"));
 
 	ASSDrawEngine::ParseASS(str);
 
@@ -309,7 +309,7 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
 						rectbound2[rectbound2upd].x += diff.x, rectbound2[rectbound2upd].y += diff.y;
 						rectbound2[rectbound2upd2].x += diff.x, rectbound2[rectbound2upd2].y += diff.y;
 					}
-					undodesc = "Bilinear transform";
+					undodesc = _T("Bilinear transform");
 					*dragAnchor_left = mouse_point;
 					break;
 				case MODE_SCALEROTATE:
@@ -400,7 +400,7 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
 					}
 					UpdateTranformModeRectCenter();
 					//*dragAnchor_left = mouse_point;
-					undodesc = "Scale";
+					undodesc = _T("Scale");
 					break;
 				}
 			
@@ -429,12 +429,12 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
 					EnforceC1Continuity (mousedownAt_point->cmd_main, mousedownAt_point);
 											
 					RefreshDisplay();
-					if (undodesc == "")
+					if (undodesc == _T(""))
 					{
 						if (mousedownAt_point->type == MP)
-							undodesc = wxT("Drag point");
+							undodesc = _T("Drag point");
 						else
-							undodesc = wxT("Drag control point");
+							undodesc = _T("Drag control point");
 					}
 				}
 			} 
@@ -448,7 +448,7 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
 					pointsys->originx = wxp.x;
 					pointsys->originy = wxp.y;
 					RefreshDisplay();
-					undodesc = wxT("Move origin");
+					undodesc = _T("Move origin");
 				}          
 			}
 			else if (dragAnchor_left != NULL)
@@ -494,7 +494,7 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
 					}
 					UpdateNonUniformTransformation();
 					RefreshDisplay();
-					undodesc = "Rotate";
+					undodesc = _T("Rotate");
 				}
 			}
 			else if (CanMove()) 
@@ -598,12 +598,12 @@ void ASSDrawCanvas::OnMouseMove(wxMouseEvent &event)
     if (hasStatusBar)
 	{
         m_frame->SetStatusText( 
-            wxString::Format( wxT("%5d %5d"), (int)wx, (int)wy ), 0 );
+            wxString::Format( _T("%5d %5d"), (int)wx, (int)wy ), 0 );
         if (pointedAt_point == NULL || 
              (newcommand != NULL && !newcommand->initialized) )
-           m_frame->SetStatusText( wxT(""), 1 );
+           m_frame->SetStatusText( _T(""), 1 );
         else
-           m_frame->SetStatusText( wxT(" ") + pointedAt_point->cmd_main->ToString().Upper(), 1 );
+           m_frame->SetStatusText( _T(" ") + pointedAt_point->cmd_main->ToString().Upper(), 1 );
 	}
 
 }
@@ -626,11 +626,11 @@ void ASSDrawCanvas::ProcessOnMouseLeftUp()
 		switch (newcommand->type)
 		{
 		case M:
-			undodesc = wxT("Add a new M"); break;
+			undodesc = _T("Add a new M"); break;
 		case L:
-			undodesc = wxT("Add a new L"); break;
+			undodesc = _T("Add a new L"); break;
 		case B:
-			undodesc = wxT("Add a new B"); break;
+			undodesc = _T("Add a new B"); break;
 		}
 		newcommand = NULL;
 		// we need to manually refresh the GUI to draw the new control points
@@ -655,11 +655,11 @@ void ASSDrawCanvas::ProcessOnMouseLeftUp()
 			switch (t)
 			{
 			case M:
-				undodesc = wxT("Delete a M"); break;
+				undodesc = _T("Delete a M"); break;
 			case L:
-				undodesc = wxT("Delete a L"); break;
+				undodesc = _T("Delete a L"); break;
 			case B:
-				undodesc = wxT("Delete a B"); break;
+				undodesc = _T("Delete a B"); break;
 			}
 		}
 		else
@@ -690,10 +690,10 @@ void ASSDrawCanvas::ProcessOnMouseLeftUp()
 	rectbound2upd2 = -1;
     backupowner = NONE;
 
-	if (!undodesc.IsSameAs(""))
+	if (!undodesc.IsSameAs(_T("")))
 	{
 		AddUndo( undodesc );
-		undodesc = "";
+		undodesc = _T("");
 		RefreshUndocmds();
 	}
 
@@ -834,10 +834,10 @@ void ASSDrawCanvas::ProcessOnMouseRightUp()
 	rectbound2upd2 = -1;
     backupowner = NONE;
 
-	if (!undodesc.IsSameAs(""))
+	if (!undodesc.IsSameAs(_T("")))
 	{
 		AddUndo( undodesc );
-		undodesc = "";
+		undodesc = _T("");
 		RefreshUndocmds();
 	}
 
@@ -882,14 +882,14 @@ void ASSDrawCanvas::OnMouseRightDClick(wxMouseEvent& event)
 		switch (dblclicked_point_right->cmd_main->type)
 		{
 			case L:
-				menu->Append(MENU_DRC_LNTOBEZ, "Convert to Bezier curve (B command)");
+				menu->Append(MENU_DRC_LNTOBEZ, _T("Convert to Bezier curve (B command)"));
 				break;
 			case B:
 				if (dblclicked_point_right->type != MP) break;
-				menu->AppendCheckItem(MENU_DRC_BEZTOLN, "Convert to line (L command)");
+				menu->AppendCheckItem(MENU_DRC_BEZTOLN, _T("Convert to line (L command)"));
 				if (dblclicked_point_right->cmd_next && dblclicked_point_right->cmd_next->type == B)
 				{
-					menu->AppendCheckItem(MENU_DRC_C1CONTBEZ, "Smooth connection");
+					menu->AppendCheckItem(MENU_DRC_C1CONTBEZ, _T("Smooth connection"));
 					if (static_cast<DrawCmd_B*>(dblclicked_point_right->cmd_main)->C1Cont)
 						menu->Check(MENU_DRC_C1CONTBEZ, true);
 				}
@@ -899,7 +899,7 @@ void ASSDrawCanvas::OnMouseRightDClick(wxMouseEvent& event)
 	}
 	else
 	{
-		menu->Append(MENU_DRC_MOVE00, "Move [0,0] here");
+		menu->Append(MENU_DRC_MOVE00, _T("Move [0,0] here"));
 		menu->AppendSeparator();
 		menu->AppendRadioItem(MODE_ARR, _T("Mode: D&rag"));
 		menu->AppendRadioItem(MODE_M, _T("Mode: Draw &M"));
@@ -1083,7 +1083,7 @@ void ASSDrawCanvas::MoveCanvasBackground(double xamount, double yamount)
 void ASSDrawCanvas::OnSelect_ConvertLineToBezier(wxCommandEvent& WXUNUSED(event))
 {
 	if (!dblclicked_point_right) return;
-	AddUndo( wxT("Convert Line to Bezier") );
+	AddUndo( _T("Convert Line to Bezier") );
 	DrawCmd_B *newB = new DrawCmd_B(dblclicked_point_right->x(), dblclicked_point_right->y(), 
 		pointsys, dblclicked_point_right->cmd_main);
 	InsertCmd ( newB, dblclicked_point_right->cmd_main );
@@ -1099,7 +1099,7 @@ void ASSDrawCanvas::OnSelect_ConvertLineToBezier(wxCommandEvent& WXUNUSED(event)
 void ASSDrawCanvas::OnSelect_ConvertBezierToLine(wxCommandEvent& WXUNUSED(event))
 {
 	if (!dblclicked_point_right) return;
-	AddUndo( wxT("Convert Bezier to Line") );
+	AddUndo( _T("Convert Bezier to Line") );
 	DrawCmd_L *newL = new DrawCmd_L(dblclicked_point_right->x(), dblclicked_point_right->y(), pointsys, dblclicked_point_right->cmd_main);
 	InsertCmd ( newL, dblclicked_point_right->cmd_main );
 	ClearPointsSelection();
@@ -1115,14 +1115,14 @@ void ASSDrawCanvas::OnSelect_C1ContinuityBezier(wxCommandEvent& WXUNUSED(event))
 {
 	if (!dblclicked_point_right) return;
 	DrawCmd_B *cmdb = static_cast<DrawCmd_B*>(dblclicked_point_right->cmd_main);
-	AddUndo( wxT(cmdb->C1Cont? "Unset continuous":"Set continuous") );
+	AddUndo( cmdb->C1Cont? _T("Unset continuous"):_T("Set continuous") );
 	cmdb->C1Cont = !cmdb->C1Cont;
 	RefreshUndocmds();
 }
 
 void ASSDrawCanvas::OnSelect_Move00Here(wxCommandEvent& WXUNUSED(event))
 {
-	AddUndo( wxT("Move origin") );
+	AddUndo( _T("Move origin") );
 	int wx, wy;
 	pointsys->FromWxPoint(mouse_point, wx, wy);
 	wxPoint wxp = pointsys->ToWxPoint(wx, wy);
@@ -1175,7 +1175,7 @@ void ASSDrawCanvas::EnforceC1Continuity (DrawCmd* cmd, Point* pnt)
 // Undo/Redo system
 void ASSDrawCanvas::AddUndo( wxString desc ) 
 {
-	PrepareUndoRedo(_undo, false, "", desc);
+	PrepareUndoRedo(_undo, false, _T(""), desc);
 	undos.push_back( _undo );
 	// also empty redos
 	redos.clear();
@@ -1194,7 +1194,7 @@ bool ASSDrawCanvas::UndoOrRedo(bool isundo)
 	// push into sub
 	UndoRedo nr(r);
 	PrepareUndoRedo(nr, true, GenerateASS(), r.desc); 
-	//PrepareUndoRedo(nr, false, "", r.desc);
+	//PrepareUndoRedo(nr, false, _T(""), r.desc);
 	sub->push_back( nr );
 	// parse
 	r.Export(this);
@@ -1226,7 +1226,7 @@ bool ASSDrawCanvas::Redo()
 wxString ASSDrawCanvas::GetTopUndo()
 {
 	if (undos.empty())
-		return "";
+		return _T("");
 	else
 		return undos.back().desc;
 }
@@ -1234,7 +1234,7 @@ wxString ASSDrawCanvas::GetTopUndo()
 wxString ASSDrawCanvas::GetTopRedo()
 {
 	if (redos.empty())
-		return "";
+		return _T("");
 	else
 		return redos.back().desc;
 }
@@ -1500,7 +1500,7 @@ void ASSDrawCanvas::DoDraw( RendererBase& rbase, RendererPrimitives& rprim, Rend
 				t.size(8.0);
 				wxPoint pxy = hilite_point->ToWxPoint(true);
 				t.start_point(pxy.x + 5, pxy.y -5 );
-				t.text(wxString::Format("%d,%d", hilite_point->x(), hilite_point->y()));
+				t.text(wxString::Format(_T("%d,%d"), hilite_point->x(), hilite_point->y()).mb_str(wxConvUTF8));
 				agg::conv_stroke< agg::gsv_text > pt(t);
 				pt.line_cap(agg::round_cap);
 				pt.line_join(agg::round_join);
@@ -1575,7 +1575,7 @@ void ASSDrawCanvas::DoDraw( RendererBase& rbase, RendererPrimitives& rprim, Rend
 				txt.flip(true);
 				txt.size(6.0);
 				txt.start_point(s, 20);
-				txt.text(wxString::Format("%d", t));
+				txt.text(wxString::Format(_T("%d"), t).mb_str(wxConvUTF8));
 				agg::conv_stroke< agg::gsv_text > pt(txt);
 				rasterizer.add_path(pt);
 			}
@@ -1615,7 +1615,7 @@ void ASSDrawCanvas::DoDraw( RendererBase& rbase, RendererPrimitives& rprim, Rend
 				txt.flip(true);
 				txt.size(6.0);
 				txt.start_point(12, s);
-				txt.text(wxString::Format("%d", t));
+				txt.text(wxString::Format(_T("%d"), t).mb_str(wxConvUTF8));
 				agg::conv_stroke< agg::gsv_text > pt(txt);
 				rasterizer.add_path(pt);
 			}
@@ -1641,14 +1641,14 @@ void ASSDrawCanvas::DoDraw( RendererBase& rbase, RendererPrimitives& rprim, Rend
 void ASSDrawCanvas::ReceiveBackgroundImageFileDropEvent(const wxString& filename)
 {
 	const wxChar *shortfname = wxFileName::FileName(filename).GetFullName().c_str();
-	m_frame->SetStatusText(wxString::Format("Loading '%s' as canvas background ...", shortfname), 1);
+	m_frame->SetStatusText(wxString::Format(_T("Loading '%s' as canvas background ..."), shortfname), 1);
 	wxImage img;
 	img.LoadFile(filename);
 	if (img.IsOk())
 	{
 		SetBackgroundImage(img, filename);
 	}
-	m_frame->SetStatusText(wxT("Canvas background loaded"), 1);
+	m_frame->SetStatusText(_T("Canvas background loaded"), 1);
 }
 
 void ASSDrawCanvas::RemoveBackgroundImage()
@@ -1657,7 +1657,7 @@ void ASSDrawCanvas::RemoveBackgroundImage()
 	bgimg.bgimg = NULL;
 	if (bgimg.bgbmp) delete bgimg.bgbmp;
 	bgimg.bgbmp = NULL;
-	bgimg.bgimgfile = "";
+	bgimg.bgimgfile = _T("");
 	RefreshDisplay();
 	drag_mode = DRAGMODE();
 	bgimg.alpha_dlg->Show(false);
@@ -1834,7 +1834,7 @@ void ASSDrawCanvas::UpdateNonUniformTransformation()
 void ASSDrawCanvas::CustomOnKeyDown(wxKeyEvent &event)
 {
 	int keycode = event.GetKeyCode();
-	//m_frame->SetStatusText(wxString::Format("Key: %d", keycode));
+	//m_frame->SetStatusText(wxString::Format(_T("Key: %d"), keycode));
 	double scrollamount = (event.GetModifiers() == wxMOD_CMD? 10.0:1.0);	
     if (event.GetModifiers() == wxMOD_SHIFT)
 	{
@@ -1885,7 +1885,7 @@ void ASSDrawCanvas::CustomOnKeyDown(wxKeyEvent &event)
 					while(it != cmds.end())
 					{
 						wxPoint point = (*it)->m_point->ToWxPoint();
-						double distance = sqrt(pow(point.x - mouse_point.x, 2) + pow(point.y - mouse_point.y, 2));
+						double distance = sqrt(pow(double(point.x - mouse_point.x), 2) + pow(double(point.y - mouse_point.y), 2));
 						if (nearest == NULL || distance < dist)
 						{
 							nearest = (*it)->m_point;
@@ -1895,7 +1895,7 @@ void ASSDrawCanvas::CustomOnKeyDown(wxKeyEvent &event)
 						while (it2 != (*it)->controlpoints.end())
 						{
 							wxPoint point = (*it2)->ToWxPoint();
-							double distance = sqrt(pow(point.x - mouse_point.x, 2) + pow(point.y - mouse_point.y, 2));
+							double distance = sqrt(pow((double)point.x - mouse_point.x, 2) + pow((double)point.y - mouse_point.y, 2));
 							if (nearest == NULL || distance < dist)
 							{
 								nearest = (*it2);
@@ -2020,7 +2020,7 @@ void UndoRedo::Export(ASSDrawCanvas *canvas)
 	if (canvas->bgimg.bgimgfile != this->bgimgfile)
 	{
 		canvas->RemoveBackgroundImage();
-		if (!this->bgimgfile.IsSameAs("<clipboard>") && ::wxFileExists(this->bgimgfile))
+		if (!this->bgimgfile.IsSameAs(_T("<clipboard>")) && ::wxFileExists(this->bgimgfile))
 		{
 			canvas->bgimg.alpha = this->bgalpha;
 			canvas->ReceiveBackgroundImageFileDropEvent(this->bgimgfile);
diff --git a/assdraw/src/canvas.hpp b/assdraw/src/canvas.hpp
index 23f4abf4b..aee896ee2 100644
--- a/assdraw/src/canvas.hpp
+++ b/assdraw/src/canvas.hpp
@@ -279,7 +279,7 @@ protected:
 	// after the bounding quadrangle has changed, update the shape to fill up inside it
 	virtual void UpdateNonUniformTransformation();
 
-	friend class UndoRedo;
+	friend struct UndoRedo;
 	
 	DECLARE_EVENT_TABLE()
 };
@@ -295,6 +295,7 @@ public:
 	virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
 	{
 		m_canvas->ReceiveBackgroundImageFileDropEvent(filenames.Item(0));
+		return true;
 	}
 
 protected:
diff --git a/assdraw/src/cmd.cpp b/assdraw/src/cmd.cpp
index 5c3ee3eee..4d0aa88c9 100644
--- a/assdraw/src/cmd.cpp
+++ b/assdraw/src/cmd.cpp
@@ -68,7 +68,7 @@ DrawCmd_L::DrawCmd_L ( int x, int y, PointSystem *ps, DrawCmd *prev )
 // to ASS drawing command
 wxString DrawCmd_L::ToString()
 {
-     return wxString::Format(wxT("l %d %d"), m_point->x(), m_point->y());
+     return wxString::Format(_T("l %d %d"), m_point->x(), m_point->y());
 }
 
 
@@ -129,9 +129,9 @@ wxString DrawCmd_B::ToString()
 	Point* c1 = (*iterate++);
 	Point* c2 = (*iterate);
 	if (initialized)
-		return wxString::Format(wxT("b %d %d %d %d %d %d"), c1->x(), c1->y(), c2->x(), c2->y(), m_point->x(), m_point->y());
+		return wxString::Format(_T("b %d %d %d %d %d %d"), c1->x(), c1->y(), c2->x(), c2->y(), m_point->x(), m_point->y());
 	else
-		return wxString::Format(wxT("b ? ? ? ? %d %d"), m_point->x(), m_point->y());
+		return wxString::Format(_T("b ? ? ? ? %d %d"), m_point->x(), m_point->y());
 }
 
 
@@ -162,7 +162,7 @@ DrawCmd_S::DrawCmd_S
 		int ix = *it; it++;
 		int iy = *it; it++;
 		n++;
-		//::wxLogMessage("%d %d\n", ix, iy);
+		//::wxLogMessage(_T("%d %d\n"), ix, iy);
 		controlpoints.push_back( new Point( ix, iy, ps, CP, this, n ) );
 	}
 
@@ -202,11 +202,11 @@ wxString DrawCmd_S::ToString()
 	for (; iterate != controlpoints.end(); iterate++)
 	{
 		if (initialized)
-			assout = wxString::Format(wxT("%s %d %d"), assout.c_str(), (*iterate)->x(), (*iterate)->y()); 
+			assout = wxString::Format(_T("%s %d %d"), assout.c_str(), (*iterate)->x(), (*iterate)->y()); 
 		else
-			assout = wxString::Format(wxT("%s ? ?"), assout.c_str());
+			assout = wxString::Format(_T("%s ? ?"), assout.c_str());
 	}
-	assout = wxString::Format(wxT("%s %d %d"), assout.c_str(), m_point->x(), m_point->y());
-	if (closed) assout = wxString::Format(wxT("%s c"), assout.c_str());
+	assout = wxString::Format(_T("%s %d %d"), assout.c_str(), m_point->x(), m_point->y());
+	if (closed) assout = wxString::Format(_T("%s c"), assout.c_str());
 	return assout;
 }
diff --git a/assdraw/src/convert.bat b/assdraw/src/convert.bat
new file mode 100644
index 000000000..255b89fc4
--- /dev/null
+++ b/assdraw/src/convert.bat
@@ -0,0 +1,2 @@
+perl t-stringifier.pl agg_bcspline.h agg_conv_bcspline.h agg_vcgen_bcspline.h resource.h agg_bcspline.cpp agg_vcgen_bcspline.cpp assdraw.cpp assdraw_settings.cpp canvas.cpp canvas_mouse.cpp cmd.cpp dlgctrl.cpp engine.cpp library.cpp settings.cpp
+pause
\ No newline at end of file
diff --git a/assdraw/src/dlgctrl.cpp b/assdraw/src/dlgctrl.cpp
index 1ee6f9b89..37e5a6991 100644
--- a/assdraw/src/dlgctrl.cpp
+++ b/assdraw/src/dlgctrl.cpp
@@ -52,7 +52,7 @@ END_EVENT_TABLE()
 // ----------------------------------------------------------------------------
 
 ASSDrawSrcTxtCtrl::ASSDrawSrcTxtCtrl(wxWindow *parent, ASSDrawFrame *frame)
-	: wxTextCtrl(parent, wxID_ANY, "", __DPDS__ , wxTE_MULTILINE )
+	: wxTextCtrl(parent, wxID_ANY, _T(""), __DPDS__ , wxTE_MULTILINE )
 {
 	m_frame = frame;
 }
@@ -67,7 +67,7 @@ void ASSDrawSrcTxtCtrl::CustomOnChar(wxKeyEvent &event)
 	case WXK_TAB:
 		break; //do nothing
 	default:
-		//m_frame->SetTitle(wxString::Format("Key: %d", event.GetKeyCode()));
+		//m_frame->SetTitle(wxString::Format(_T("Key: %d"), event.GetKeyCode()));
 		event.Skip(true);
 	}
 	
@@ -185,14 +185,14 @@ void ASSDrawTransformDlg::OnTemplatesCombo(wxCommandEvent &event)
 	if (pos == -1)
 		return;
 
-	txtctrl_m11->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f1) );
-	txtctrl_m12->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f2) );
-	txtctrl_m21->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f3) );
-	txtctrl_m22->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f4) );
-	txtctrl_mx->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f5) );
-	txtctrl_my->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f6) );
-	txtctrl_nx->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f7) );
-	txtctrl_ny->SetValue( wxString::Format("%.1f", combo_templatesValues[pos].f8) );
+	txtctrl_m11->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f1) );
+	txtctrl_m12->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f2) );
+	txtctrl_m21->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f3) );
+	txtctrl_m22->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f4) );
+	txtctrl_mx->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f5) );
+	txtctrl_my->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f6) );
+	txtctrl_nx->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f7) );
+	txtctrl_ny->SetValue( wxString::Format(_T("%.1f"), combo_templatesValues[pos].f8) );
 }
 
 void ASSDrawTransformDlg::EndModal(int retCode)
@@ -217,7 +217,7 @@ void ASSDrawTransformDlg::EndModal(int retCode)
 	if (ok)
 		wxDialog::EndModal(wxID_OK);
 	else
-	    wxMessageBox("One or more values entered are not real numbers.\nPlease fix.", _T("Value error"), wxOK | wxICON_INFORMATION, m_frame);
+	    wxMessageBox(_T("One or more values entered are not real numbers.\nPlease fix."), _T("Value error"), wxOK | wxICON_INFORMATION, m_frame);
 
 }
 
@@ -228,7 +228,7 @@ ASSDrawAboutDlg::ASSDrawAboutDlg(ASSDrawFrame *parent, unsigned timeout)
 	SetBackgroundColour(*wxWHITE);
 	htmlwin = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxSize(396, 200), wxHW_DEFAULT_STYLE | wxSIMPLE_BORDER);
 	htmlwin->SetPage(
-"<html><body> \
+_T("<html><body> \
 <p>ASSDraw3 is a tool for designing shapes to be used in ASS subtitle file. \
 <p>To add lines or curves, initiate the draw mode by clicking on the drawing tools. \
 Then, either click on empty space or drag from an existing point to add the new lines/curves. \
@@ -253,7 +253,7 @@ Control points for Bezier curves are generated once you release the mouse button
 <li> jfs, ArchMageZeratul, RoRo and everyone at Aegisub's forum <a href=\"http://malakith.net/aegisub\">http://malakith.net/aegisub</a> for all suggestions and supports. \
 </ul> \
 <p>ai-chan recommends Aegisub for all your subtitle and typesetting needs! \
-</body></html>"
+</body></html>")
 	);	
 	htmlwin->Connect(wxEVT_COMMAND_HTML_LINK_CLICKED, wxHtmlLinkEventHandler(ASSDrawAboutDlg::OnURL), NULL, this);
 	
@@ -263,7 +263,7 @@ Control points for Bezier curves are generated once you release the mouse button
 	
 	sizer->Add(new BigStaticBitmapCtrl(this, wxBITMAP(assdraw3_), *wxWHITE, this), 1, wxEXPAND);
 	sizer->Add(htmlwin, 1, wxLEFT | wxRIGHT, 2);
-	sizer->Add(new wxStaticText(this, wxID_ANY, wxString::Format("Version: %s", VERSION)), 1, wxEXPAND | wxALL, 2);
+	sizer->Add(new wxStaticText(this, wxID_ANY, wxString::Format(_T("Version: %s"), VERSION)), 1, wxEXPAND | wxALL, 2);
 	sizer->Add(new wxButton(this, wxID_OK), 0, wxALIGN_CENTER | wxBOTTOM, 10);
 	SetSizer(sizer);
 	sizer->Layout();
@@ -286,13 +286,13 @@ int ASSDrawAboutDlg::ShowModal()
 {
 	if (time_out > 0)
 		timer.Start(time_out * 1000, true);
-	wxDialog::ShowModal();
+	return wxDialog::ShowModal();
 }
 
 void ASSDrawAboutDlg::OnURL(wxHtmlLinkEvent &event)
 {
 	wxString URL(event.GetLinkInfo().GetHref());
-	if (URL.StartsWith("http://"))
+	if (URL.StartsWith(_T("http://")))
 		::wxLaunchDefaultBrowser(URL);
 	else
 		event.Skip(true);
diff --git a/assdraw/src/engine.cpp b/assdraw/src/engine.cpp
index fa23da684..101e2f9cc 100644
--- a/assdraw/src/engine.cpp
+++ b/assdraw/src/engine.cpp
@@ -139,7 +139,7 @@ ASSDrawEngine::ASSDrawEngine( wxWindow *parent, int extraflags )
 	setfitviewpoint = false;
 	rgba_shape = agg::rgba(0,0,1);
 	color_bg = PixelFormat::AGGType::color_type(255, 255, 255);
-	drawcmdset = wxT("m n l b s p c _"); //the spaces and underscore are in there for a reason, guess?
+	drawcmdset = _T("m n l b s p c _"); //the spaces and underscore are in there for a reason, guess?
 	ResetEngine();
 }
 
@@ -156,10 +156,10 @@ int ASSDrawEngine::ParseASS ( wxString str )
 	str.Replace(_T("\t"), _T(""));
 	str.Replace(_T("\r"), _T(""));
 	str.Replace(_T("\n"), _T(""));
-	str = str.Lower() + wxT(" _ _");
+	str = str.Lower() + _T(" _ _");
 	// we don't use regex because the pattern is too simple
-	wxStringTokenizer tkz( str, wxT(" ") );
-	wxString currcmd(wxT(""));
+	wxStringTokenizer tkz( str, _T(" ") );
+	wxString currcmd(_T(""));
 	std::vector<int> val;
 	wxString token;
 	long tmp_int;
@@ -180,7 +180,7 @@ int ASSDrawEngine::ParseASS ( wxString str )
 				done = true;
 				
 				// N
-				if (currcmd.IsSameAs(wxT("n")) && val.size() >= 2)
+				if (currcmd.IsSameAs(_T("n")) && val.size() >= 2)
 				{
 					tmp_n_pnt.x = val[0], tmp_n_pnt.y = val[1];
 					n_collected = true;
@@ -194,7 +194,7 @@ int ASSDrawEngine::ParseASS ( wxString str )
 				if (s_command != NULL)
 				{
 					bool ends = true;
-					if (currcmd.IsSameAs(wxT("p"))&& val.size() >= 2)
+					if (currcmd.IsSameAs(_T("p"))&& val.size() >= 2)
 					{
 						s_command->m_point->type = CP;
 						s_command->m_point->num = s_command->controlpoints.size() + 1;
@@ -202,7 +202,7 @@ int ASSDrawEngine::ParseASS ( wxString str )
 						s_command->m_point = new Point(val[0], val[1], pointsys, MP, s_command);
 						ends = false;
 					}
-					else if (currcmd.IsSameAs(wxT("c")))
+					else if (currcmd.IsSameAs(_T("c")))
 						s_command->closed = true;
 
 					if (ends)
@@ -213,11 +213,11 @@ int ASSDrawEngine::ParseASS ( wxString str )
 				}
 				
 				// M
-				if (currcmd.IsSameAs(wxT("m")) && val.size() >= 2)
+				if (currcmd.IsSameAs(_T("m")) && val.size() >= 2)
 					AppendCmd ( M, val[0], val[1] );
 				
 				// L
-				if (currcmd.IsSameAs(wxT("l")) && val.size() >= 2)
+				if (currcmd.IsSameAs(_T("l")) && val.size() >= 2)
 				{
 					AppendCmd ( L, val[0], val[1] );
 					val.erase(val.begin(), val.begin()+2);
@@ -227,7 +227,7 @@ int ASSDrawEngine::ParseASS ( wxString str )
 				}
 				
 				// B
-				if (currcmd.IsSameAs(wxT("b")) && val.size() >= 6)
+				if (currcmd.IsSameAs(_T("b")) && val.size() >= 6)
 				{
 					AppendCmd ( new DrawCmd_B(val[4], val[5], val[0], val[1],
 					val[2], val[3], pointsys, LastCmd()) );
@@ -238,7 +238,7 @@ int ASSDrawEngine::ParseASS ( wxString str )
 				}
 				
 				// S
-				if (currcmd.IsSameAs(wxT("s")) && val.size() >= 6)
+				if (currcmd.IsSameAs(_T("s")) && val.size() >= 6)
 				{
 					int num = (val.size() / 2) * 2;
 					std::vector<int> val2;
diff --git a/assdraw/src/library.cpp b/assdraw/src/library.cpp
index 1f6932eb0..170a4846c 100644
--- a/assdraw/src/library.cpp
+++ b/assdraw/src/library.cpp
@@ -40,7 +40,7 @@ ASSDrawShapePreview::ASSDrawShapePreview( wxWindow *parent, ASSDrawShapeLibrary
 	shapelib = _shapelib;
 	if (ParseASS(initialcmds) > 0)
 		SetFitToViewPointOnNextPaint(5, 5);
-	cb = new wxCheckBox(this, wxID_ANY, "");
+	cb = new wxCheckBox(this, wxID_ANY, _T(""));
 }
 
 void ASSDrawShapePreview::OnSize(wxSizeEvent& event)
@@ -72,11 +72,11 @@ ASSDrawShapeLibrary::ASSDrawShapeLibrary( wxWindow *parent, ASSDrawFrame *frame
 	
 	wxToolBar *tbar = new wxToolBar(this, wxID_ANY, __DPDS__ , wxTB_HORIZONTAL | wxNO_BORDER | wxTB_FLAT | wxTB_NODIVIDER);
 	tbar->SetMargins(0, 3);
-	tbar->AddTool(TOOL_SAVE, wxBITMAP(add), "Save canvas");
+	tbar->AddTool(TOOL_SAVE, wxBITMAP(add), _T("Save canvas"));
 	tbar->AddSeparator();
-	tbar->AddTool(TOOL_CHECK, wxBITMAP(check), "Select all");
-	tbar->AddTool(TOOL_UNCHECK, wxBITMAP(uncheck), "Select none");
-	tbar->AddTool(TOOL_DELETE, wxBITMAP(delcross), "Delete selected");
+	tbar->AddTool(TOOL_CHECK, wxBITMAP(check), _T("Select all"));
+	tbar->AddTool(TOOL_UNCHECK, wxBITMAP(uncheck), _T("Select none"));
+	tbar->AddTool(TOOL_DELETE, wxBITMAP(delcross), _T("Delete selected"));
 
 	libarea = new wxScrolledWindow(this, wxID_ANY, __DPDS__ , wxScrolledWindowStyle | wxSIMPLE_BORDER);
 	libarea->SetBackgroundColour(wxColour(0xFF, 0xFF, 0x99));
@@ -152,17 +152,17 @@ void ASSDrawShapeLibrary::OnMouseRightClick(wxMouseEvent &event)
 	{
 		activepreview = prev;
 		wxMenu *menu = new wxMenu;
-		wxMenuItem *menuload = new wxMenuItem(menu, MENU_LOAD, wxT("Load to canvas"));
+		wxMenuItem *menuload = new wxMenuItem(menu, MENU_LOAD, _T("Load to canvas"));
 		wxFont f = menuload->GetFont();
 		f.SetWeight(wxFONTWEIGHT_BOLD);
 		menuload->SetFont(f);
 		menu->Append(menuload);
-		//menu->Append(MENU_LOAD, wxT("Load to canvas"))->GetFont().SetWeight(wxFONTWEIGHT_BOLD);
-		menu->Append(MENU_COPYCLIPBOARD, wxT("Copy commands to clipboard"));
-		menu->Append(MENU_SAVECANVAS, wxT("Save canvas here"));
+		//menu->Append(MENU_LOAD, _T("Load to canvas"))->GetFont().SetWeight(wxFONTWEIGHT_BOLD);
+		menu->Append(MENU_COPYCLIPBOARD, _T("Copy commands to clipboard"));
+		menu->Append(MENU_SAVECANVAS, _T("Save canvas here"));
 		wxMenu *submenu = new wxMenu;
-		submenu->Append(MENU_DELETE, wxT("Confirm delete?"));
-		menu->Append(MENU_DUMMY, wxT("Delete from library"), submenu);
+		submenu->Append(MENU_DELETE, _T("Confirm delete?"));
+		menu->Append(MENU_DUMMY, _T("Delete from library"), submenu);
 		PopupMenu(menu);
 		delete menu;
 	}
@@ -251,7 +251,7 @@ std::vector< ASSDrawShapePreview *> ASSDrawShapeLibrary::GetShapePreviews()
 
 void ASSDrawShapeLibrary::LoadToCanvas(ASSDrawShapePreview *preview)
 {
-	m_frame->m_canvas->AddUndo("Load shape from library");
+	m_frame->m_canvas->AddUndo(_T("Load shape from library"));
 	m_frame->m_canvas->ParseASS(preview->GenerateASS());
 	m_frame->m_canvas->RefreshDisplay();
 	m_frame->m_canvas->RefreshUndocmds();
diff --git a/assdraw/src/settings.cpp b/assdraw/src/settings.cpp
index 41bd680c1..ea42321b4 100644
--- a/assdraw/src/settings.cpp
+++ b/assdraw/src/settings.cpp
@@ -65,44 +65,44 @@ void ASSDrawSettingsDialog::Init()
 		//wxSUNKEN_BORDER
 	);
 
-    #define APPENDCOLOURPROP(pgid, label, color) pgid = propgrid->Append( wxColourProperty(wxT(label), wxPG_LABEL, color) );
+    #define APPENDCOLOURPROP(pgid, label, color) pgid = propgrid->Append( wxColourProperty(label, wxPG_LABEL, color) );
     #define APPENDUINTPROP(pgid, label, uint) \
-		pgid = propgrid->Append( wxUIntProperty(wxT(label), wxPG_LABEL, uint) ); \
+		pgid = propgrid->Append( wxUIntProperty(label, wxPG_LABEL, uint) ); \
 		propgrid->SetPropertyValidator( pgid, validator );
     #define APPENDBOOLPROP(pgid, label, boolvar) \
-	    pgid = propgrid->Append( wxBoolProperty ( wxT(label), wxPG_LABEL, boolvar ) ); \
+	    pgid = propgrid->Append( wxBoolProperty (label, wxPG_LABEL, boolvar ) ); \
     	propgrid->SetPropertyAttribute( pgid, wxPG_BOOL_USE_CHECKBOX, (long)1 );
 	wxLongPropertyValidator validator(0x0,0xFF);
     
-    propgrid->Append( wxPropertyCategory(wxT("Appearance"),wxPG_LABEL) );
-	APPENDCOLOURPROP(colors_canvas_bg_pgid, "Canvas", m_frame->colors.canvas_bg)
-	APPENDCOLOURPROP(colors_canvas_shape_normal_pgid, "Drawing", m_frame->colors.canvas_shape_normal)
-	APPENDUINTPROP(alphas_canvas_shape_normal_pgid, "Drawing @", m_frame->alphas.canvas_shape_normal)
-	APPENDCOLOURPROP(colors_canvas_shape_preview_pgid, "Preview", m_frame->colors.canvas_shape_preview)
-	APPENDUINTPROP(alphas_canvas_shape_preview_pgid, "Preview @", m_frame->alphas.canvas_shape_preview)
-	APPENDCOLOURPROP(colors_canvas_shape_outline_pgid, "Outline", m_frame->colors.canvas_shape_outline)
-	APPENDUINTPROP(alphas_canvas_shape_outline_pgid, "Outline @", m_frame->alphas.canvas_shape_outline)
-	APPENDCOLOURPROP(colors_canvas_shape_guideline_pgid, "Control lines", m_frame->colors.canvas_shape_guideline)
-	APPENDUINTPROP(alphas_canvas_shape_guideline_pgid, "Control lines @", m_frame->alphas.canvas_shape_guideline)
-	APPENDCOLOURPROP(colors_canvas_shape_mainpoint_pgid, "Points", m_frame->colors.canvas_shape_mainpoint)
-	APPENDUINTPROP(alphas_canvas_shape_mainpoint_pgid, "Points @", m_frame->alphas.canvas_shape_mainpoint)
-	APPENDCOLOURPROP(colors_canvas_shape_controlpoint_pgid, "Control points", m_frame->colors.canvas_shape_controlpoint)
-	APPENDUINTPROP(alphas_canvas_shape_controlpoint_pgid, "Control points @", m_frame->alphas.canvas_shape_controlpoint)
-	APPENDCOLOURPROP(colors_canvas_shape_selectpoint_pgid, "Selected points", m_frame->colors.canvas_shape_selectpoint)
-	APPENDUINTPROP(alphas_canvas_shape_selectpoint_pgid, "Selected points @", m_frame->alphas.canvas_shape_selectpoint)
-	APPENDCOLOURPROP(colors_library_libarea_pgid, "Library", m_frame->colors.library_libarea)
-	APPENDCOLOURPROP(colors_library_shape_pgid, "Library shapes", m_frame->colors.library_shape)
-	APPENDCOLOURPROP(colors_origin_pgid, "Origin", m_frame->colors.origin)
-	APPENDUINTPROP(sizes_origincross_pgid, "Origin cross size", m_frame->sizes.origincross)
-	APPENDCOLOURPROP(colors_ruler_h_pgid, "H ruler", m_frame->colors.ruler_h)
-	APPENDCOLOURPROP(colors_ruler_v_pgid, "V ruler", m_frame->colors.ruler_v)
-
-    propgrid->Append( wxPropertyCategory(wxT("Behaviors"),wxPG_LABEL) );
-	APPENDBOOLPROP(behaviors_capitalizecmds_pgid, "Capitalize commands", m_frame->behaviors.capitalizecmds);
-	APPENDBOOLPROP(behaviors_autoaskimgopac_pgid, "Ask for image opacity", m_frame->behaviors.autoaskimgopac);
-	APPENDBOOLPROP(behaviors_parse_spc_pgid, "Parse S/P/C", m_frame->behaviors.parse_spc);
-	APPENDBOOLPROP(behaviors_nosplashscreen_pgid, "No splash screen", m_frame->behaviors.nosplashscreen);
-	APPENDBOOLPROP(behaviors_confirmquit_pgid, "Confirm quit", m_frame->behaviors.confirmquit);
+    propgrid->Append( wxPropertyCategory(_T("Appearance"),wxPG_LABEL) );
+	APPENDCOLOURPROP(colors_canvas_bg_pgid, _T("Canvas"), m_frame->colors.canvas_bg)
+	APPENDCOLOURPROP(colors_canvas_shape_normal_pgid, _T("Drawing"), m_frame->colors.canvas_shape_normal)
+	APPENDUINTPROP(alphas_canvas_shape_normal_pgid, _T("Drawing @"), m_frame->alphas.canvas_shape_normal)
+	APPENDCOLOURPROP(colors_canvas_shape_preview_pgid, _T("Preview"), m_frame->colors.canvas_shape_preview)
+	APPENDUINTPROP(alphas_canvas_shape_preview_pgid, _T("Preview @"), m_frame->alphas.canvas_shape_preview)
+	APPENDCOLOURPROP(colors_canvas_shape_outline_pgid, _T("Outline"), m_frame->colors.canvas_shape_outline)
+	APPENDUINTPROP(alphas_canvas_shape_outline_pgid, _T("Outline @"), m_frame->alphas.canvas_shape_outline)
+	APPENDCOLOURPROP(colors_canvas_shape_guideline_pgid, _T("Control lines"), m_frame->colors.canvas_shape_guideline)
+	APPENDUINTPROP(alphas_canvas_shape_guideline_pgid, _T("Control lines @"), m_frame->alphas.canvas_shape_guideline)
+	APPENDCOLOURPROP(colors_canvas_shape_mainpoint_pgid, _T("Points"), m_frame->colors.canvas_shape_mainpoint)
+	APPENDUINTPROP(alphas_canvas_shape_mainpoint_pgid, _T("Points @"), m_frame->alphas.canvas_shape_mainpoint)
+	APPENDCOLOURPROP(colors_canvas_shape_controlpoint_pgid, _T("Control points"), m_frame->colors.canvas_shape_controlpoint)
+	APPENDUINTPROP(alphas_canvas_shape_controlpoint_pgid, _T("Control points @"), m_frame->alphas.canvas_shape_controlpoint)
+	APPENDCOLOURPROP(colors_canvas_shape_selectpoint_pgid, _T("Selected points"), m_frame->colors.canvas_shape_selectpoint)
+	APPENDUINTPROP(alphas_canvas_shape_selectpoint_pgid, _T("Selected points @"), m_frame->alphas.canvas_shape_selectpoint)
+	APPENDCOLOURPROP(colors_library_libarea_pgid, _T("Library"), m_frame->colors.library_libarea)
+	APPENDCOLOURPROP(colors_library_shape_pgid, _T("Library shapes"), m_frame->colors.library_shape)
+	APPENDCOLOURPROP(colors_origin_pgid, _T("Origin"), m_frame->colors.origin)
+	APPENDUINTPROP(sizes_origincross_pgid, _T("Origin cross size"), m_frame->sizes.origincross)
+	APPENDCOLOURPROP(colors_ruler_h_pgid, _T("H ruler"), m_frame->colors.ruler_h)
+	APPENDCOLOURPROP(colors_ruler_v_pgid, _T("V ruler"), m_frame->colors.ruler_v)
+
+    propgrid->Append( wxPropertyCategory(_T("Behaviors"),wxPG_LABEL) );
+	APPENDBOOLPROP(behaviors_capitalizecmds_pgid, _T("Capitalize commands"), m_frame->behaviors.capitalizecmds);
+	APPENDBOOLPROP(behaviors_autoaskimgopac_pgid, _T("Ask for image opacity"), m_frame->behaviors.autoaskimgopac);
+	APPENDBOOLPROP(behaviors_parse_spc_pgid, _T("Parse S/P/C"), m_frame->behaviors.parse_spc);
+	APPENDBOOLPROP(behaviors_nosplashscreen_pgid, _T("No splash screen"), m_frame->behaviors.nosplashscreen);
+	APPENDBOOLPROP(behaviors_confirmquit_pgid, _T("Confirm quit"), m_frame->behaviors.confirmquit);
 	
 	wxFlexGridSizer *sizer = new wxFlexGridSizer(2, 1, 0, 0);
 	sizer->AddGrowableCol(0);
@@ -110,10 +110,10 @@ void ASSDrawSettingsDialog::Init()
 	sizer->Add(propgrid, 1, wxEXPAND);
 
 	wxBoxSizer *bsizer = new wxBoxSizer(wxHORIZONTAL);
-	wxButton *abutton = new wxButton(this, wxID_ANY, "Apply");
+	wxButton *abutton = new wxButton(this, wxID_ANY, _T("Apply"));
 	abutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ASSDrawSettingsDialog::OnSettingsApplyButtonClicked), NULL, this);
 	bsizer->Add(abutton, 2, wxEXPAND);
-	wxButton *rbutton = new wxButton(this, wxID_ANY, "Revert");
+	wxButton *rbutton = new wxButton(this, wxID_ANY, _T("Revert"));
 	rbutton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(ASSDrawSettingsDialog::OnSettingsRevertButtonClicked), NULL, this);
 	bsizer->Add(rbutton, 1, wxEXPAND);
 	bsizer->Layout();
diff --git a/assdraw/src/t-stringifier.pl b/assdraw/src/t-stringifier.pl
new file mode 100644
index 000000000..c1157a05e
--- /dev/null
+++ b/assdraw/src/t-stringifier.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/perl
+
+###########################
+# t-stringifier.pl - replaces "strings" with _T("strings")
+#
+# Usage: t-stringifier.pl file1 [file2 [file...]]
+# NOTE: changes existing files in place so backup stuff or rewrite the script
+# (more specifically comment out the rename() call at the end of the main loop)
+# if you're paranoid.
+#
+# Written by Karl Blomster 2008
+# This script is in the public domain.
+###########################
+
+
+use warnings;
+use strict;
+
+my @infiles = @ARGV;
+
+foreach my $infile (@infiles) {
+	my $outfile = $infile . ".out";
+	open(INFILE, "<", $infile) or die("Couldn't open $infile for reading: $!");
+	open(OUTFILE, ">", $outfile) or die("Couldn't open $outfile for writing: $!");
+	
+	print("Processing: $infile \n");
+
+	while (<INFILE>) {
+		print OUTFILE $_ and next() if (m!^#\s*include!);
+		
+		my $line = $_;
+		
+		$line =~ s/(_T\(|_\(|wxT\()?"(.*?)(?<!\\)"(\))?/replacementstring($1,$2,$3)/eg;
+
+		print OUTFILE $line;
+	}
+	
+	close(OUTFILE);
+	close(INFILE);
+
+	
+	rename($outfile,$infile) or die("Couldn't overwrite ${infile}: $!");
+}
+
+sub replacementstring {
+	my ($pre, $string, $post) = @_;
+
+	if ($pre) {
+		if ($pre eq "_(") { return( qq!_("${string}")! ); }
+		else { return( qq!_T("${string}")! ); }
+	}
+	elsif ($post) {
+		return( qq!_T("${string}"))! );
+	}
+	else {
+		return( qq!_T("${string}")! );
+	}
+}
-- 
GitLab