diff --git a/src/wx/cmdevents.cpp b/src/wx/cmdevents.cpp index 26f639d3..89907d64 100644 --- a/src/wx/cmdevents.cpp +++ b/src/wx/cmdevents.cpp @@ -274,7 +274,7 @@ EVT_HANDLER(wxID_FILE10, "Load recent ROM 10") } static const struct rom_maker { - const wxChar *code, *name; + const wxString code, name; } makers[] = { { wxT("01"), wxT("Nintendo") }, { wxT("02"), wxT("Rocket Games") }, @@ -503,7 +503,7 @@ static bool maker_lt(const rom_maker& r1, const rom_maker& r2) return wxStrcmp(r1.code, r2.code) < 0; } -void SetDialogLabel(wxDialog* dlg, wxChar* id, wxString ts, size_t l) +void SetDialogLabel(wxDialog* dlg, const wxString& id, wxString ts, size_t l) { ts.Replace(wxT("&"), wxT("&&"), true); (dynamic_cast((*dlg).FindWindow(wxXmlResource::GetXRCID(id))))->SetLabel(ts); @@ -557,7 +557,7 @@ EVT_HANDLER_MASK(RomInformation, "ROM information...", CMDEN_GB | CMDEN_GBA) setlab("MakerName"); setblab("UnitCode", gbRom[0x146]); - const wxChar* type; + wxString type; switch (gbRom[0x147]) { case 0x00: @@ -1187,15 +1187,15 @@ EVT_HANDLER_MASK(RecordSoundStartRecording, "Start sound recording...", CMDEN_NS sound_path = GetGamePath(gopts.recording_dir); wxString def_name = panel->game_name(); - const wxChar* extoff = sound_exts.c_str(); + wxString extoff = sound_exts; for (int i = 0; i < sound_extno; i++) { - extoff = wxStrchr(extoff, wxT('|')) + 1; - extoff = wxStrchr(extoff, wxT('|')) + 1; + extoff = extoff.Mid(extoff.Find(wxT('|')) + 1); + extoff = extoff.Mid(extoff.Find(wxT('|')) + 1); } - extoff = wxStrchr(extoff, wxT('|')) + 2; // skip * - def_name += wxString(extoff, wxStrcspn(extoff, wxT(";|"))); + extoff = extoff.Mid(extoff.Find(wxT('|')) + 2); // skip * + def_name += extoff.Left(wxStrcspn(extoff, wxT(";|"))); wxFileDialog dlg(this, _("Select output file"), sound_path, def_name, sound_exts, wxFD_SAVE | wxFD_OVERWRITE_PROMPT); dlg.SetFilterIndex(sound_extno); @@ -1260,15 +1260,15 @@ EVT_HANDLER_MASK(RecordAVIStartRecording, "Start video recording...", CMDEN_NVRE vid_path = GetGamePath(gopts.recording_dir); wxString def_name = panel->game_name(); - const wxChar* extoff = vid_exts.c_str(); + wxString extoff = vid_exts; for (int i = 0; i < vid_extno; i++) { - extoff = wxStrchr(extoff, wxT('|')) + 1; - extoff = wxStrchr(extoff, wxT('|')) + 1; + extoff = extoff.Mid(extoff.Find(wxT('|')) + 1); + extoff = extoff.Mid(extoff.Find(wxT('|')) + 1); } - extoff = wxStrchr(extoff, wxT('|')) + 2; // skip * - def_name += wxString(extoff, wxStrcspn(extoff, wxT(";|"))); + extoff = extoff.Mid(extoff.Find(wxT('|')) + 2); // skip * + def_name += extoff.Left(wxStrcspn(extoff, wxT(";|"))); wxFileDialog dlg(this, _("Select output file"), vid_path, def_name, vid_exts, wxFD_SAVE | wxFD_OVERWRITE_PROMPT); dlg.SetFilterIndex(vid_extno); diff --git a/src/wx/dsound.cpp b/src/wx/dsound.cpp index 7fceb9ca..799d8787 100644 --- a/src/wx/dsound.cpp +++ b/src/wx/dsound.cpp @@ -96,7 +96,7 @@ bool DirectSound::init(long sampleRate) if (gopts.audio_dev.empty()) dev = DSDEVID_DefaultPlayback; else - CLSIDFromString(const_cast(gopts.audio_dev.wx_str()), &dev); + CLSIDFromString(gopts.audio_dev.wc_str(), &dev); pDirectSound->Initialize(&dev); diff --git a/src/wx/gfxviewers.cpp b/src/wx/gfxviewers.cpp index a7579546..acea2487 100644 --- a/src/wx/gfxviewers.cpp +++ b/src/wx/gfxviewers.cpp @@ -1117,7 +1117,7 @@ void MainFrame::OAMViewer() namespace Viewers { static int ptype = 0; static wxString pdir; -void savepal(wxWindow* parent, const uint8_t* data, int ncols, const wxChar* type) +void savepal(wxWindow* parent, const uint8_t* data, int ncols, const wxString type) { // no attempt is made here to translate the palette type name // it's just a suggested name, anyway diff --git a/src/wx/guiinit.cpp b/src/wx/guiinit.cpp index bc22c0a0..02cb97de 100644 --- a/src/wx/guiinit.cpp +++ b/src/wx/guiinit.cpp @@ -2292,7 +2292,19 @@ public: ///////////////////////////// //Check if a pointer from the XRC file is valid. If it's not, throw an error telling the user. template -void CheckThrowXRCError(T pointer, std::string name) +void CheckThrowXRCError(T pointer, const wxString& name) +{ + if (pointer == NULL) { + std::string errormessage = "Unable to load a \""; + errormessage += typeid(pointer).name(); + errormessage += "\" from the builtin xrc file: "; + errormessage += name.utf8_str(); + throw std::runtime_error(errormessage); + } +} + +template +void CheckThrowXRCError(T pointer, const char* name) { if (pointer == NULL) { std::string errormessage = "Unable to load a \""; @@ -2302,6 +2314,7 @@ void CheckThrowXRCError(T pointer, std::string name) throw std::runtime_error(errormessage); } } + wxDialog* MainFrame::LoadXRCDialog(const char* name) { wxString dname = wxString::FromUTF8(name); @@ -2347,7 +2360,15 @@ T* SafeXRCCTRL(wxWindow* parent, const char* name) wxString dname = wxString::FromUTF8(name); //This is needed to work around a bug in XRCCTRL wxString Ldname = dname; - T* output = XRCCTRL(*parent, dname, T); + T* output = XRCCTRL_D(*parent, dname, T); + CheckThrowXRCError(output, name); + return output; +} + +template +T* SafeXRCCTRL(wxWindow* parent, const wxString& name) +{ + T* output = XRCCTRL_D(*parent, name, T); CheckThrowXRCError(output, name); return output; } @@ -3214,7 +3235,7 @@ bool MainFrame::BindControls() // "Unable to load dialog GameBoyConfig from resources", this is // probably the reason. pn.Printf(wxT("cp%d"), i + 1); - wxWindow* w = SafeXRCCTRL(d, ToString(pn).c_str()); + wxWindow* w = SafeXRCCTRL(d, pn); GBColorConfigHandler[i].p = w; GBColorConfigHandler[i].pno = i; wxFarRadio* cb = SafeXRCCTRL(w, "UsePalette"); @@ -3231,7 +3252,7 @@ bool MainFrame::BindControls() for (int j = 0; j < 8; j++) { wxString s; s.Printf(wxT("Color%d"), j); - wxColourPickerCtrl* cp = SafeXRCCTRL(w, ToString(s).c_str()); + wxColourPickerCtrl* cp = SafeXRCCTRL(w, s); GBColorConfigHandler[i].cp[j] = cp; cp->SetValidator(wxColorValidator(&systemGbPalette[i * 8 + j])); } @@ -3433,7 +3454,7 @@ bool MainFrame::BindControls() // "Unable to load dialog JoypadConfig from resources", this is // probably the reason. pn.Printf(wxT("joy%d"), i + 1); - wxWindow* w = SafeXRCCTRL(joyDialog, ToString(pn).c_str()); + wxWindow* w = SafeXRCCTRL(joyDialog, pn); wxFarRadio* cb; cb = SafeXRCCTRL(w, "DefaultConfig"); @@ -3447,7 +3468,7 @@ bool MainFrame::BindControls() for (int j = 0; j < NUM_KEYS; j++) { wxJoyKeyTextCtrl* tc = XRCCTRL_D(*w, joynames[j], wxJoyKeyTextCtrl); - CheckThrowXRCError(tc, ToString(joynames[j])); + CheckThrowXRCError(tc, joynames[j]); wxWindow* p = tc->GetParent(); if (p == prevp) diff --git a/src/wx/ioregs.h b/src/wx/ioregs.h index ad64c315..d414a0df 100644 --- a/src/wx/ioregs.h +++ b/src/wx/ioregs.h @@ -3,9 +3,9 @@ struct IOData { uint16_t* address; uint16_t offset; - const wxChar* name; + const wxString name; uint16_t write; - const wxChar* bits[16]; + wxString bits[16]; }; /* const */ IOData ioregs[] = // not const so tranlation can be done once diff --git a/src/wx/opts.cpp b/src/wx/opts.cpp index ce891bc1..358971ce 100644 --- a/src/wx/opts.cpp +++ b/src/wx/opts.cpp @@ -1,6 +1,8 @@ #include "../common/ConfigManager.h" #include "wxvbam.h" #include +#include +#include #include /* @@ -19,15 +21,15 @@ } #define INTOPT(c, n, d, v, min, max) \ { \ - wxT(c), (n), d, NULL, &v, NULL, min, max \ + wxT(c), (n), d, NULL, &v, "", min, max \ } #define DOUBLEOPT(c, n, d, v, min, max) \ { \ - wxT(c), (n), d, NULL, NULL, NULL, min, max, NULL, &v \ + wxT(c), (n), d, NULL, NULL, "", min, max, NULL, &v \ } #define BOOLOPT(c, n, d, v) \ { \ - wxT(c), (n), d, NULL, NULL, NULL, 0, 0, &v \ + wxT(c), (n), d, NULL, NULL, "", 0, 0, &v \ } #define ENUMOPT(c, n, d, v, e) \ { \ @@ -117,7 +119,7 @@ const int num_def_accels = sizeof(default_accels) / sizeof(default_accels[0]); // Note: this must match GUI widget names or GUI won't work // This table's order determines tab order as well -const wxChar* const joynames[NUM_KEYS] = { +const wxString joynames[NUM_KEYS] = { wxT("Up"), wxT("Down"), wxT("Left"), wxT("Right"), wxT("A"), wxT("B"), wxT("L"), wxT("R"), wxT("Select"), wxT("Start"), @@ -331,6 +333,31 @@ bool opt_lt(const opt_desc& opt1, const opt_desc& opt2) return wxStrcmp(opt1.opt, opt2.opt) < 0; } +// From: https://stackoverflow.com/a/7408245/262458 +static std::vector split(const wxString& text_, const wxString& sep_) { + std::vector tokens; + std::size_t start = 0, end = 0; + std::string text = text_.ToStdString(), sep = sep_.ToStdString(); + + while ((end = text.find(sep, start)) != std::string::npos) { + tokens.push_back(text.substr(start, end - start)); + start = end + 1; + } + + tokens.push_back(text.substr(start)); + + return tokens; +} + +static std::size_t enum_idx(std::vector& opts, const wxString& val) { + auto it = std::find(opts.begin(), opts.end(), val); + + if (it == opts.end()) + return wxNOT_FOUND; + + return std::distance(opts.begin(), it); +} + // FIXME: simulate MakeInstanceFilename(vbam.ini) using subkeys (Slave%d/*) void load_opts() @@ -479,51 +506,34 @@ void load_opts() if (opt.stropt) { opt.curstr = *opt.stropt; - } else if (opt.enumvals) { - opt.curint = *opt.intopt; - bool gotit = cfg->Read(opt.opt, &s); - const wxChar* ev = opt.enumvals; + } else if (!opt.enumvals.empty()) { + auto enum_opts = split(opt.enumvals.MakeLower(), wxT("|")); + opt.curint = *opt.intopt; + bool gotit = cfg->Read(opt.opt, &s); s.MakeLower(); - if (gotit && s.size()) { - // wx provides no case-insensitive Find() - s.MakeLower(); + if (gotit && !s.empty()) { + const std::size_t found_pos = enum_idx(enum_opts, s); + const bool matched = found_pos != wxNOT_FOUND; - for (; (ev = wxStrstr(ev, (const wxChar*)s.c_str())); ev++) { - if (ev != opt.enumvals && ev[-1] != wxT('|')) - continue; - - if (!ev[s.size()] || ev[s.size()] == wxT('|')) - break; - } - - if (!ev) { + if (!matched) { opt.curint = 0; - ev = opt.enumvals; - const wxChar* evx = wxGetTranslation(ev); + const wxString ev = opt.enumvals; + const wxString evx = wxGetTranslation(ev); bool isx = wxStrcmp(ev, evx) != 0; // technically, the translation for this string could incorproate // the equals sign if necessary instead of doing it this way wxLogWarning(_("Invalid value %s for option %s; valid values are %s%s%s"), - s.c_str(), opt.opt, ev, + s, opt.opt, ev, isx ? wxT(" = ") : wxT(""), isx ? evx : wxT("")); - s = wxString(ev, wxStrchr(ev, wxT('|')) - ev); - cfg->Write(opt.opt, s); - } else { - const wxChar* ev2; - - for (ev2 = opt.enumvals, opt.curint = 0; ev2 != ev; opt.curint++) - ev2 = wxStrchr(ev2, wxT('|')) + 1; - } + // write first option + cfg->Write(opt.opt, enum_opts[0]); + } else + opt.curint = found_pos; *opt.intopt = opt.curint; } else { - for (int i = 0; i != opt.curint; i++) - ev = wxStrchr(ev, wxT('|')) + 1; - - const wxChar* ev2 = wxStrchr(ev, wxT('|')); - s = ev2 ? wxString(ev, ev2 - ev) : wxString(ev); - cfg->Write(opt.opt, s); + cfg->Write(opt.opt, enum_opts[opt.curint]); } } else if (opt.intopt) { cfg->Read(opt.opt, &opt.curint, *opt.intopt); @@ -649,17 +659,12 @@ void update_opts() opt.curstr = *opt.stropt; cfg->Write(opt.opt, opt.curstr); } - } else if (opt.enumvals) { + } else if (!opt.enumvals.empty()) { if (*opt.intopt != opt.curint) { opt.curint = *opt.intopt; - const wxChar* ev = opt.enumvals; + auto enum_opts = split(opt.enumvals.MakeLower(), wxT("|")); - for (int i = 0; i != opt.curint; i++) - ev = wxStrchr(ev, wxT('|')) + 1; - - const wxChar* ev2 = wxStrchr(ev, wxT('|')); - wxString s = ev2 ? wxString(ev, ev2 - ev) : wxString(ev); - cfg->Write(opt.opt, s); + cfg->Write(opt.opt, enum_opts[opt.curint]); } } else if (opt.intopt) { if (*opt.intopt != opt.curint) @@ -771,7 +776,7 @@ void update_opts() cfg->Flush(); } -bool opt_set(const wxChar* name, const wxChar* val) +bool opt_set(const wxString& name, const wxString& val) { const opt_desc dummy = { name }; const opt_desc* opt = std::lower_bound(&opts[0], &opts[num_opts], dummy, opt_lt); @@ -780,41 +785,30 @@ bool opt_set(const wxChar* name, const wxChar* val) if (opt->stropt) *opt->stropt = wxString(val); else if (opt->boolopt) { - if (!*val || val[1] || (*val != wxT('0') && *val != wxT('1'))) + if (!(val == wxT('0') || val == wxT('1'))) wxLogWarning(_("Invalid flag option %s - %s ignored"), name, val); else - *opt->boolopt = *val == wxT('1'); - } else if (opt->enumvals) { - wxString s(val); - s.MakeLower(); - const wxChar* ev; + *opt->boolopt = val == wxT('1'); + } else if (!opt->enumvals.empty()) { + wxString s = val; s.MakeLower(); + wxString ev = opt->enumvals; ev.MakeLower(); + auto enum_opts = split(ev, wxT("|")); - for (ev = opt->enumvals; (ev = wxStrstr(ev, (const wxChar*)s.c_str())); ev++) { - if (ev != opt->enumvals && ev[-1] != wxT('|')) - continue; + const std::size_t found_pos = enum_idx(enum_opts, s); + const bool matched = found_pos != wxNOT_FOUND; - if (!ev[s.size()] || ev[s.size()] == wxT('|')) - break; - } - - if (!ev) { - const wxChar* evx = wxGetTranslation(opt->enumvals); + if (!matched) { + const wxString evx = wxGetTranslation(opt->enumvals); bool isx = wxStrcmp(opt->enumvals, evx) != 0; // technically, the translation for this string could incorproate // the equals sign if necessary instead of doing it this way wxLogWarning(_("Invalid value %s for option %s; valid values are %s%s%s"), - s.c_str(), opt->opt, opt->enumvals, + s, opt->opt, opt->enumvals, isx ? wxT(" = ") : wxT(""), isx ? evx : wxT("")); } else { - const wxChar* ev2; - int val; - - for (ev2 = opt->enumvals, val = 0; ev2 != ev; val++) - ev2 = wxStrchr(ev2, wxT('|')) + 1; - - *opt->intopt = val; + *opt->intopt = found_pos; } } else if (opt->intopt) { const wxString s(val); @@ -866,33 +860,33 @@ bool opt_set(const wxChar* name, const wxChar* val) return true; } else { - const wxChar* slat = wxStrchr(name, wxT('/')); - - if (!slat) + if (name.Find(wxT('/')) == wxNOT_FOUND) return false; - if (!wxStrncmp(name, wxT("Keyboard"), (int)(slat - name))) { - const cmditem dummy2 = { slat + 1 }; - cmditem* cmd = std::lower_bound(&cmdtab[0], &cmdtab[ncmds], dummy2, cmditem_lt); + auto parts = split(name, wxT("/")); - if (cmd == &cmdtab[ncmds] || wxStrcmp(slat + 1, cmd->cmd)) + if (parts[0] != wxT("Keyboard")) { + const cmditem parts_1 = { parts[1] }; + cmditem* cmd = std::lower_bound(&cmdtab[0], &cmdtab[ncmds], parts_1, cmditem_lt); + + if (cmd == &cmdtab[ncmds] || wxStrcmp(parts[1], cmd->cmd)) return false; - for (wxAcceleratorEntry_v::iterator i = gopts.accels.begin(); - i < gopts.accels.end(); ++i) + for (auto i = gopts.accels.begin(); i < gopts.accels.end(); ++i) if (i->GetCommand() == cmd->cmd_id) { - wxAcceleratorEntry_v::iterator j; + auto j = i; - for (j = i; j < gopts.accels.end(); ++j) + for (; j < gopts.accels.end(); ++j) if (j->GetCommand() != cmd->cmd_id) break; gopts.accels.erase(i, j); + break; } - if (*val) { - wxAcceleratorEntry_v aval = wxKeyTextCtrl::FromString(val); + if (!val.empty()) { + auto aval = wxKeyTextCtrl::FromString(val); for (int i = 0; i < aval.size(); i++) aval[i].Set(aval[i].GetFlags(), aval[i].GetKeyCode(), @@ -905,24 +899,24 @@ bool opt_set(const wxChar* name, const wxChar* val) } return true; - } else if (!wxStrncmp(name, wxT("Joypad"), (int)(slat - name))) { - if (slat[1] < wxT('1') || slat[1] > wxT('4') || slat[2] != wxT('/')) + } else if (!wxStrncmp(name, wxT("Joypad"), wxStrlen(wxT("Joypad")))) { + if (parts[1] < wxT('1') || parts[1] > wxT('4') || parts.size() < 3) return false; - int jno = slat[1] - wxT('1'); + int jno = parts[1][0] - wxT('1'); int kno; for (kno = 0; kno < NUM_KEYS; kno++) - if (!wxStrcmp(joynames[kno], slat + 3)) + if (!wxStrcmp(joynames[kno], parts[2])) break; if (kno == NUM_KEYS) return false; - if (!*val) + if (val.empty()) gopts.joykey_bindings[jno][kno].clear(); else { - wxJoyKeyBinding_v b = wxJoyKeyTextCtrl::FromString(val); + auto b = wxJoyKeyTextCtrl::FromString(val); if (!b.size()) wxLogWarning(_("Invalid key binding %s for %s"), val, name); diff --git a/src/wx/opts.h b/src/wx/opts.h index 01853b71..97fc7542 100644 --- a/src/wx/opts.h +++ b/src/wx/opts.h @@ -2,7 +2,7 @@ #define WX_OPTS_H #define NUM_KEYS 21 -extern const wxChar* const joynames[NUM_KEYS]; +extern const wxString joynames[NUM_KEYS]; extern wxJoyKeyBinding defkeys[NUM_KEYS * 2]; // keyboard + joystick defaults extern struct opts_t { @@ -84,12 +84,12 @@ extern struct opts_t { } gopts; extern struct opt_desc { - const wxChar* opt; + wxString opt; const char* cmd; - const wxChar* desc; + wxString desc; wxString* stropt; int* intopt; - const wxChar* enumvals; + wxString enumvals; double min, max; bool* boolopt; double* doubleopt; @@ -112,6 +112,6 @@ void load_opts(); // will detect changes and write config if necessary void update_opts(); // returns true if option name correct; prints error if val invalid -bool opt_set(const wxChar* name, const wxChar* val); +bool opt_set(const wxString& name, const wxString& val); #endif /* WX_OPTS_H */ diff --git a/src/wx/panel.cpp b/src/wx/panel.cpp index a1168275..5823e90b 100644 --- a/src/wx/panel.cpp +++ b/src/wx/panel.cpp @@ -1,4 +1,5 @@ #include +#include #include #include @@ -1785,11 +1786,14 @@ void DrawingPanelBase::DrawArea(uint8_t** data) if (!disableStatusMessages && !panel->osdtext.empty()) { if (systemGetClock() - panel->osdtime < OSD_TIME) { - std::string message = ToString(panel->osdtext); + wxString message = panel->osdtext; int linelen = std::ceil(width * scale - 20) / 8; - int nlines = (message.length() + linelen - 1) / linelen; + int nlines = (message.size() + linelen - 1) / linelen; int cury = height - 14 - nlines * 10; - char* ptr = const_cast(message.c_str()); + const char* msg_data = message.utf8_str(); + char buf[message.size() + 1]; + char* ptr = &buf[0]; + std::strncpy(ptr, msg_data, message.size() + 1); while (nlines > 1) { char lchar = ptr[linelen]; @@ -2223,7 +2227,7 @@ void DXDrawingPanel::DrawArea(wxWindowDC& dc) #endif #ifndef NO_FFMPEG -static const wxChar* media_err(MediaRet ret) +static const wxString media_err(MediaRet ret) { switch (ret) { case MRET_OK: diff --git a/src/wx/viewers.cpp b/src/wx/viewers.cpp index 03d59208..ebd2eb65 100644 --- a/src/wx/viewers.cpp +++ b/src/wx/viewers.cpp @@ -354,7 +354,7 @@ public: baddialog(); addr->Clear(); - const wxChar* longline = lline; + wxString longline = lline; int lwidth = 0; for (int i = 0; i < NUM_IOREGS; i++) { @@ -470,14 +470,14 @@ public: Update(sel); } - static const wxChar* lline; + static wxString lline; wxChoice* addr; wxControl* val; wxCheckBox* bit[16]; wxControl* bitlab[16]; DECLARE_EVENT_TABLE() }; -const wxChar* IOViewer::lline = NULL; +wxString IOViewer::lline; BEGIN_EVENT_TABLE(IOViewer, Viewer) EVT_BUTTON(XRCID("Refresh"), IOViewer::RefreshEv) EVT_BUTTON(wxID_APPLY, IOViewer::Apply) @@ -500,7 +500,7 @@ void MainFrame::IOViewer() } while (0) LogDialog::LogDialog() { - const wxChar* dname = wxT("Logging"); + const wxString dname = wxT("Logging"); if (!wxXmlResource::Get()->LoadDialog(this, wxGetApp().frame, dname)) baddialog(); @@ -625,7 +625,7 @@ public: Goto(0); // initialize load/save support dialog already { - const wxChar* dname = wxT("MemSelRegion"); + const wxString dname = wxT("MemSelRegion"); selregion = wxXmlResource::Get()->LoadDialog(this, dname); if (!selregion) diff --git a/src/wx/viewsupt.cpp b/src/wx/viewsupt.cpp index 57572c11..c958a400 100644 --- a/src/wx/viewsupt.cpp +++ b/src/wx/viewsupt.cpp @@ -21,7 +21,7 @@ void Viewer::CloseDlg(wxCloseEvent& ev) Destroy(); } -Viewer::Viewer(const wxChar* name) +Viewer::Viewer(const wxString& name) : wxDialog() , auto_update(false) { @@ -1075,7 +1075,7 @@ EVT_LEFT_UP(GfxPanel::Click) EVT_MOTION(GfxPanel::MouseMove) END_EVENT_TABLE() -GfxViewer::GfxViewer(const wxChar* dname, int maxw, int maxh) +GfxViewer::GfxViewer(const wxString& dname, int maxw, int maxh) : Viewer(dname) , image(maxw, maxh) { diff --git a/src/wx/viewsupt.h b/src/wx/viewsupt.h index ea8deb10..1a69c943 100644 --- a/src/wx/viewsupt.h +++ b/src/wx/viewsupt.h @@ -25,7 +25,7 @@ namespace Viewers { class Viewer : public wxDialog { public: void CloseDlg(wxCloseEvent& ev); - Viewer(const wxChar* name); + Viewer(const wxString& name); virtual ~Viewer() { } @@ -46,7 +46,7 @@ public: } protected: - const wxChar* dname; + wxString dname; void SetAutoUpdate(wxCommandEvent& ev) { auto_update = ev.IsChecked(); @@ -372,7 +372,7 @@ END_DECLARE_EVENT_TYPES() // this is what actually manages the GfxPanel class GfxViewer : public Viewer { public: - GfxViewer(const wxChar* dname, int maxw, int maxh); + GfxViewer(const wxString& dname, int maxw, int maxh); void ChangeBMP(); void BMPSize(int w, int h); diff --git a/src/wx/widgets/joyedit.cpp b/src/wx/widgets/joyedit.cpp index db160305..eb39631b 100644 --- a/src/wx/widgets/joyedit.cpp +++ b/src/wx/widgets/joyedit.cpp @@ -189,17 +189,17 @@ static wxCriticalSection recs; // wx provides no atoi for wxChar // this is not a universal function; assumes valid number -static int simple_atoi(const wxChar* s, int len) +static int simple_atoi(const wxString& s, int len) { int ret = 0; for (int i = 0; i < len; i++) - ret = ret * 10 + s[i] - wxT('0'); + ret = ret * 10 + (int)(s[i] - wxT('0')); return ret; } -static bool ParseJoy(const wxChar* s, int len, int& mod, int& key, int& joy) +static bool ParseJoy(const wxString& s, int len, int& mod, int& key, int& joy) { mod = key = joy = 0; @@ -212,24 +212,24 @@ static bool ParseJoy(const wxChar* s, int len, int& mod, int& key, int& joy) if (!joyre.Matches(s) || !joyre.GetMatch(&b, &l) || b) return false; - const wxChar* p = s + l; + const wxString p = s.Mid(l); int alen = len - l; joyre.GetMatch(&b, &l, 1); - joy = simple_atoi(s + b, l); + joy = simple_atoi(s.Mid(b), l); #define is_ctrl(re) re.Matches(p) && re.GetMatch(&b, &l) && l == alen && !b if (is_ctrl(axre)) { axre.GetMatch(&b, &l, 1); - key = simple_atoi(p + b, l); + key = simple_atoi(p.Mid(b), l); axre.GetMatch(&b, &l, 2); mod = p[b] == wxT('+') ? WXJB_AXIS_PLUS : WXJB_AXIS_MINUS; } else if (is_ctrl(butre)) { butre.GetMatch(&b, &l, 1); - key = simple_atoi(p + b, l); + key = simple_atoi(p.Mid(b), l); mod = WXJB_BUTTON; } else if (is_ctrl(hatre)) { hatre.GetMatch(&b, &l, 1); - key = simple_atoi(p + b, l); + key = simple_atoi(p.Mid(b), l); #define check_dir(n, d) else if (hatre.GetMatch(&b, &l, n) && l > 0) mod = WXJB_HAT_##d if (0) @@ -251,7 +251,7 @@ static bool ParseJoy(const wxChar* s, int len, int& mod, int& key, int& joy) return true; } -bool wxJoyKeyTextCtrl::ParseString(const wxChar* s, int len, int& mod, int& key, int& joy) +bool wxJoyKeyTextCtrl::ParseString(const wxString& s, int len, int& mod, int& key, int& joy) { if (ParseJoy(s, len, mod, key, joy)) return true; diff --git a/src/wx/widgets/keyedit.cpp b/src/wx/widgets/keyedit.cpp index f568f4f4..a55967e6 100644 --- a/src/wx/widgets/keyedit.cpp +++ b/src/wx/widgets/keyedit.cpp @@ -165,7 +165,7 @@ wxString wxKeyTextCtrl::ToString(wxAcceleratorEntry_v keys, wxChar sep) return ret; } -bool wxKeyTextCtrl::ParseString(const wxChar* s, int len, int& mod, int& key) +bool wxKeyTextCtrl::ParseString(const wxString& s, int len, int& mod, int& key) { mod = key = 0; @@ -173,7 +173,7 @@ bool wxKeyTextCtrl::ParseString(const wxChar* s, int len, int& mod, int& key) return false; wxString a = wxT('\t'); - a.append(s, len); + a.Append(s.Left(len)); wxAcceleratorEntry ae; #ifndef __WXMAC__ #define check_meta(str) \ diff --git a/src/wx/widgets/wx/joyedit.h b/src/wx/widgets/wx/joyedit.h index df34c96c..20891fe3 100644 --- a/src/wx/widgets/wx/joyedit.h +++ b/src/wx/widgets/wx/joyedit.h @@ -57,7 +57,7 @@ public: // returns empty array on parse errors static wxJoyKeyBinding_v FromString(const wxString& s, wxChar sep = wxT(',')); // parse a single key in given wxChar array up to given len - static bool ParseString(const wxChar* s, int len, int& mod, int& key, int& joy); + static bool ParseString(const wxString& s, int len, int& mod, int& key, int& joy); protected: void OnJoy(wxSDLJoyEvent&); diff --git a/src/wx/widgets/wx/keyedit.h b/src/wx/widgets/wx/keyedit.h index ff79e92e..db265fd5 100644 --- a/src/wx/widgets/wx/keyedit.h +++ b/src/wx/widgets/wx/keyedit.h @@ -62,7 +62,7 @@ public: // returns empty array on parse errors static wxAcceleratorEntry_v FromString(const wxString& s, wxChar sep = wxT(',')); // parse a single key in given wxChar array up to given len - static bool ParseString(const wxChar* s, int len, int& mod, int& key); + static bool ParseString(const wxString& s, int len, int& mod, int& key); protected: void OnKeyDown(wxKeyEvent&); diff --git a/src/wx/widgets/wxmisc.cpp b/src/wx/widgets/wxmisc.cpp index f3765346..d97d98b4 100644 --- a/src/wx/widgets/wxmisc.cpp +++ b/src/wx/widgets/wxmisc.cpp @@ -350,7 +350,7 @@ void wxBoolEnHandler::Disable(wxCommandEvent& ev) ev.Skip(); } -static const wxChar* /* const */ val_hexdigits_s[] = { +static const wxString val_hexdigits_s[] = { wxT("0"), wxT("1"), wxT("2"), wxT("3"), wxT("4"), wxT("5"), wxT("6"), wxT("7"), wxT("8"), wxT("9"), wxT("A"), wxT("B"), wxT("C"), wxT("D"), wxT("E"), wxT("F"), wxT("a"), wxT("b"), wxT("c"), wxT("d"), wxT("e"), @@ -360,7 +360,7 @@ static const wxChar* /* const */ val_hexdigits_s[] = { const wxArrayString val_hexdigits(sizeof(val_hexdigits_s) / sizeof(val_hexdigits_s[0]), val_hexdigits_s); -static const wxChar* /* const */ val_sigdigits_s[] = { +static const wxString val_sigdigits_s[] = { wxT("0"), wxT("1"), wxT("2"), wxT("3"), wxT("4"), wxT("5"), wxT("6"), wxT("7"), wxT("8"), wxT("9"), wxT("-"), wxT("+") }; @@ -368,7 +368,7 @@ static const wxChar* /* const */ val_sigdigits_s[] = { const wxArrayString val_sigdigits(sizeof(val_sigdigits_s) / sizeof(val_sigdigits_s[0]), val_sigdigits_s); -static const wxChar* /* const */ val_unsdigits_s[] = { +static const wxString val_unsdigits_s[] = { wxT("0"), wxT("1"), wxT("2"), wxT("3"), wxT("4"), wxT("5"), wxT("6"), wxT("7"), wxT("8"), wxT("9") }; diff --git a/src/wx/wxvbam.cpp b/src/wx/wxvbam.cpp index fd52ba67..37cd8fe9 100644 --- a/src/wx/wxvbam.cpp +++ b/src/wx/wxvbam.cpp @@ -503,10 +503,10 @@ bool wxvbamApp::OnCmdLineParsed(wxCmdLineParser& cl) for (int i = 0; i < num_opts; i++) { wxPrintf(wxT("%s (%s"), opts[i].opt, - opts[i].boolopt ? (const wxChar*)wxT("flag") : opts[i].stropt ? (const wxChar*)wxT("string") : opts[i].enumvals ? opts[i].enumvals : opts[i].intopt ? (const wxChar*)wxT("int") : opts[i].doubleopt ? (const wxChar*)wxT("decimal") : (const wxChar*)wxT("string")); + opts[i].boolopt ? wxT("flag") : opts[i].stropt ? wxT("string") : !opts[i].enumvals.empty() ? opts[i].enumvals : (wxString)(opts[i].intopt ? wxT("int") : opts[i].doubleopt ? wxT("decimal") : wxT("string"))); - if (opts[i].enumvals) { - const wxChar* evx = wxGetTranslation(opts[i].enumvals); + if (!opts[i].enumvals.empty()) { + const wxString evx = wxGetTranslation(opts[i].enumvals); if (wxStrcmp(evx, opts[i].enumvals)) wxPrintf(wxT(" = %s"), evx); @@ -514,7 +514,7 @@ bool wxvbamApp::OnCmdLineParsed(wxCmdLineParser& cl) wxPrintf(wxT(")\n\t%s\n\n"), opts[i].desc); - if (opts[i].enumvals) + if (!opts[i].enumvals.empty()) opts[i].enumvals = wxGetTranslation(opts[i].enumvals); } @@ -568,7 +568,7 @@ bool wxvbamApp::OnCmdLineParsed(wxCmdLineParser& cl) } } - home = strdup((const char*)wxApp::argv[0]); + home = strdup(wxApp::argv[0].utf8_str()); SetHome(home); LoadConfig(); // Parse command line arguments (overrides ini) ReadOpts(argc, (char**)argv); diff --git a/src/wx/wxvbam.h b/src/wx/wxvbam.h index 98459e30..4db9b5ab 100644 --- a/src/wx/wxvbam.h +++ b/src/wx/wxvbam.h @@ -632,7 +632,7 @@ void systemScreenMessage(const wxString& msg); // sorted by cmd field for binary searching // filled in by copy-events.cmake extern struct cmditem { - const wxChar *cmd, *name; + const wxString cmd, name; int cmd_id; int mask_flags; // if non-0, one of the flags must be turned on in win // to enable this command