aboutsummaryrefslogtreecommitdiff
path: root/src/wx
diff options
context:
space:
mode:
authorStapleButter <thetotalworm@gmail.com>2017-03-29 18:59:20 +0200
committerStapleButter <thetotalworm@gmail.com>2017-03-29 18:59:20 +0200
commit4e7dc60d37ddb3f0fb6df1556f7afe4d1a5df679 (patch)
tree1458128609a5d6deaba935ee6c9f59493ad18bea /src/wx
parentc0734352ab824d3b2c28336ae12ce21f2b40a606 (diff)
* clean up code
* working-ish run/pause/reset * proper closing/cleanup * ability to run BIOS alone
Diffstat (limited to 'src/wx')
-rw-r--r--src/wx/InputConfig.cpp117
-rw-r--r--src/wx/main.cpp414
-rw-r--r--src/wx/main.h34
3 files changed, 185 insertions, 380 deletions
diff --git a/src/wx/InputConfig.cpp b/src/wx/InputConfig.cpp
index a7145aa..693ddbd 100644
--- a/src/wx/InputConfig.cpp
+++ b/src/wx/InputConfig.cpp
@@ -116,7 +116,7 @@ InputConfigDialog::InputConfigDialog(wxWindow* parent)
p->SetSizer(grid);
sizer->Add(p, 0, wxALL, 15);
- wxComboBox* joycombo = new wxComboBox(joyside, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
+ /*wxComboBox* joycombo = new wxComboBox(joyside, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN | wxCB_READONLY);
int numjoys = SDL_NumJoysticks();
if (numjoys > 0)
@@ -133,7 +133,7 @@ InputConfigDialog::InputConfigDialog(wxWindow* parent)
joycombo->Enable(false);
}
- sizer->Add(joycombo, 0, wxALL&(~wxTOP), 15);
+ sizer->Add(joycombo, 0, wxALL&(~wxTOP), 15);*/
joyside->SetSizer(sizer);
}
@@ -241,7 +241,6 @@ void InputConfigDialog::OnConfigureKey(wxMouseEvent& event)
parent->pollbtn = btn;
parent->pollbtntext = btn->GetLabel();
parent->pollid = event.GetId();
- //parent->polltimer->Start(50);
btn->SetLabel("[press key]");
btn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNHIGHLIGHT));
@@ -270,77 +269,32 @@ void InputConfigDialog::OnPoll(wxTimerEvent& event)
{
if (pollid < 200) return;
- //keycatcher->SetFocus();
- //SDL_SetWindowInputFocus(sdlwin);
- //SDL_RaiseWindow(sdlwin);
- //SDL_PumpEvents();
- //keycatcher->SetFocus();
- //SDL_RaiseWindow(sdlwin);
+ int id = pollid - 200;
+ if (id >= 12) return;
- /*if (keystate[SDL_SCANCODE_ESCAPE])
+ if (keystate[SDL_SCANCODE_BACKSPACE])
{
+ joymapping[id] = -1;
+
+ char keyname[16];
+ JoyMappingName(joymapping[id], keyname);
+ pollbtn->SetLabel(keyname);
+
polltimer->Stop();
- pollbtn->SetLabel(pollbtntext);
pollid = 0;
pollbtn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
pollbtn->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
pollbtn->Refresh();
return;
- }*/
+ }
- if (pollid >= 200)
+ int nbuttons = SDL_JoystickNumButtons(joy);
+ for (int i = 0; i < nbuttons; i++)
{
- int id = pollid - 200;
- if (id >= 12) return;
-
- if (keystate[SDL_SCANCODE_BACKSPACE])
+ if (SDL_JoystickGetButton(joy, i))
{
- joymapping[id] = -1;
-
- char keyname[16];
- JoyMappingName(joymapping[id], keyname);
- pollbtn->SetLabel(keyname);
-
- polltimer->Stop();
- pollid = 0;
-
- pollbtn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
- pollbtn->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
- pollbtn->Refresh();
- return;
- }
-
- int nbuttons = SDL_JoystickNumButtons(joy);
- for (int i = 0; i < nbuttons; i++)
- {
- if (SDL_JoystickGetButton(joy, i))
- {
- joymapping[id] = i;
-
- char keyname[16];
- JoyMappingName(joymapping[id], keyname);
- pollbtn->SetLabel(keyname);
-
- polltimer->Stop();
- pollid = 0;
-
- pollbtn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
- pollbtn->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
- pollbtn->Refresh();
- return;
- }
- }
-
- u8 blackhat = SDL_JoystickGetHat(joy, 0);
- if (blackhat)
- {
- if (blackhat & 0x1) blackhat = 0x1;
- else if (blackhat & 0x2) blackhat = 0x2;
- else if (blackhat & 0x4) blackhat = 0x4;
- else blackhat = 0x8;
-
- joymapping[id] = 0x100 | blackhat;
+ joymapping[id] = i;
char keyname[16];
JoyMappingName(joymapping[id], keyname);
@@ -355,32 +309,29 @@ void InputConfigDialog::OnPoll(wxTimerEvent& event)
return;
}
}
- /*else
- {
- int id = pollid - 100;
- if (id >= 12) return;
- for (int i = 0; i < nkeys; i++)
- {
- if (keystate[i])
- {
- keymapping[id] = i;
+ u8 blackhat = SDL_JoystickGetHat(joy, 0);
+ if (blackhat)
+ {
+ if (blackhat & 0x1) blackhat = 0x1;
+ else if (blackhat & 0x2) blackhat = 0x2;
+ else if (blackhat & 0x4) blackhat = 0x4;
+ else blackhat = 0x8;
- pollbtn->Enable(true);
+ joymapping[id] = 0x100 | blackhat;
- const char* keyname = SDL_GetKeyName(SDL_GetKeyFromScancode((SDL_Scancode)i));
- pollbtn->SetLabel(keyname);
+ char keyname[16];
+ JoyMappingName(joymapping[id], keyname);
+ pollbtn->SetLabel(keyname);
- polltimer->Stop();
- pollid = 0;
+ polltimer->Stop();
+ pollid = 0;
- pollbtn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
- pollbtn->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
- pollbtn->Refresh();
- return;
- }
- }
- }*/
+ pollbtn->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE));
+ pollbtn->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNTEXT));
+ pollbtn->Refresh();
+ return;
+ }
}
void InputConfigDialog::OnFancybuttonHover(wxMouseEvent& event)
diff --git a/src/wx/main.cpp b/src/wx/main.cpp
index a406ac2..6ab3a74 100644
--- a/src/wx/main.cpp
+++ b/src/wx/main.cpp
@@ -105,10 +105,11 @@ wxBEGIN_EVENT_TABLE(MainFrame, wxFrame)
EVT_MENU(ID_OPENROM, MainFrame::OnOpenROM)
EVT_MENU(ID_EXIT, MainFrame::OnCloseFromMenu)
- EVT_MENU(ID_INPUTCONFIG, MainFrame::OnInputConfig)
+ EVT_MENU(ID_RUN, MainFrame::OnRun)
+ EVT_MENU(ID_PAUSE, MainFrame::OnPause)
+ EVT_MENU(ID_RESET, MainFrame::OnReset)
- EVT_PAINT(MainFrame::OnPaint)
- EVT_IDLE(MainFrame::OnIdle)
+ EVT_MENU(ID_INPUTCONFIG, MainFrame::OnInputConfig)
wxEND_EVENT_TABLE()
@@ -122,7 +123,7 @@ MainFrame::MainFrame()
wxMenu* systemmenu = new wxMenu();
systemmenu->Append(ID_RUN, "Run");
- systemmenu->Append(ID_PAUSE, "Pause");
+ systemmenu->AppendCheckItem(ID_PAUSE, "Pause");
systemmenu->AppendSeparator();
systemmenu->Append(ID_RESET, "Reset");
@@ -136,18 +137,9 @@ MainFrame::MainFrame()
SetMenuBar(melonbar);
- SetClientSize(256, 384);
+ SetClientSize(256, 256);
SetMinSize(GetSize());
- emustatus = 2;
-
- /*emustatuschangemutex = new wxMutex();
- emustatuschange = new wxCondition(*emustatuschangemutex);
-
- emustopmutex = new wxMutex();
- emustop = new wxCondition(*emustopmutex);
- emustopmutex->Lock();*/
-
emuthread = new EmuThread(this);
if (emuthread->Run() != wxTHREAD_NO_ERROR)
{
@@ -156,48 +148,33 @@ MainFrame::MainFrame()
return;
}
- /*sdlwin = SDL_CreateWindowFrom(GetHandle());
-
- sdlrend = SDL_CreateRenderer(sdlwin, -1, SDL_RENDERER_ACCELERATED);// | SDL_RENDERER_PRESENTVSYNC);
- sdltex = SDL_CreateTexture(sdlrend, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STREAMING, 256, 384);
-
- texmutex = new wxMutex();
- SDL_LockTexture(sdltex, NULL, &texpixels, &texstride);
- texmutex->Unlock();*/
-
NDS::Init();
+ rompath = wxEmptyString;
+ GetMenuBar()->Enable(ID_PAUSE, false);
+ GetMenuBar()->Enable(ID_RESET, false);
Touching = false;
- /*SDL_GetWindowPosition(sdlwin, &WindowX, &WindowY);
- SDL_GetWindowSize(sdlwin, &WindowW, &WindowH);*/
-
joy = NULL;
joyid = -1;
- axismask = 0;
+}
+
+void MainFrame::CloseFromOutside()
+{
+ emuthread = NULL;
+ Close();
}
void MainFrame::OnClose(wxCloseEvent& event)
{
- if (emustatus == 1)
+ if (emuthread)
{
- emustatus = 0;
- //emustop->Wait();
- }
- else
- {
- emustatus = 0;
- /*emustatuschangemutex->Lock();
- emustatuschange->Signal();
- emustatuschangemutex->Unlock();*/
- }
+ emuthread->EmuExit();
- emuthread->Wait();
- delete emuthread;
- /*delete emustatuschange;
- delete emustatuschangemutex;
- delete emustop;
- delete emustopmutex;*/
+ emuthread->Wait();
+ delete emuthread;
+ emuthread = NULL;
+ }
NDS::DeInit();
@@ -208,14 +185,6 @@ void MainFrame::OnClose(wxCloseEvent& event)
joyid = -1;
}
- /*SDL_UnlockTexture(sdltex);
- delete texmutex;
-
- SDL_DestroyTexture(sdltex);
- SDL_DestroyRenderer(sdlrend);
-
- SDL_DestroyWindow(sdlwin);*/
-
SDL_Quit();
Destroy();
@@ -232,20 +201,15 @@ void MainFrame::OnOpenROM(wxCommandEvent& event)
if (opener.ShowModal() == wxID_CANCEL)
return;
- if (emustatus == 1)
- {
- emustatus = 2;
- emustop->Wait();
- }
+ emuthread->EmuPause();
- wxString filename = opener.GetPath();
- NDS::LoadROM(filename.mb_str(), true);
+ rompath = opener.GetPath();
+ NDS::LoadROM(rompath.mb_str(), true);
- emustatus = 1;
- /*emustatuschangemutex->Lock();
- emustatuschange->Signal();
- emustatuschangemutex->Unlock();*/
emuthread->EmuRun();
+ GetMenuBar()->Enable(ID_PAUSE, true);
+ GetMenuBar()->Check(ID_PAUSE, false);
+ GetMenuBar()->Enable(ID_RESET, true);
if (!joy)
{
@@ -257,170 +221,85 @@ void MainFrame::OnOpenROM(wxCommandEvent& event)
}
}
-void MainFrame::OnInputConfig(wxCommandEvent& event)
+void MainFrame::OnRun(wxCommandEvent& event)
{
- if (joy)
+ // TODO: reduce duplicate code
+
+ if (!emuthread->EmuIsRunning())
{
- SDL_JoystickClose(joy);
- joy = NULL;
- joyid = -1;
+ NDS::LoadBIOS();
}
- InputConfigDialog dlg(this);
- dlg.ShowModal();
+ emuthread->EmuRun();
+ GetMenuBar()->Enable(ID_PAUSE, true);
+ GetMenuBar()->Check(ID_PAUSE, false);
+ GetMenuBar()->Enable(ID_RESET, true);
- if (SDL_NumJoysticks() > 0)
+ if (!joy)
{
- joy = SDL_JoystickOpen(0);
- joyid = SDL_JoystickInstanceID(joy);
+ if (SDL_NumJoysticks() > 0)
+ {
+ joy = SDL_JoystickOpen(0);
+ joyid = SDL_JoystickInstanceID(joy);
+ }
}
}
-/*void MainFrame::ProcessSDLEvents()
+void MainFrame::OnPause(wxCommandEvent& event)
{
- bool running = (emustatus == 1);
- SDL_Event evt;
-
- while (SDL_PollEvent(&evt))
+ if (!emuthread->EmuIsPaused())
{
- switch (evt.type)
- {
- case SDL_WINDOWEVENT:
- if (evt.window.event != SDL_WINDOWEVENT_EXPOSED)
- {
- SDL_GetWindowPosition(sdlwin, &WindowX, &WindowY);
- SDL_GetWindowSize(sdlwin, &WindowW, &WindowH);
- }
- break;
-
- case SDL_MOUSEBUTTONDOWN:
- if (!running) return;
- if (evt.button.y >= 192 && evt.button.button == SDL_BUTTON_LEFT)
- {
- Touching = true;
- NDS::PressKey(16+6);
- }
- break;
-
- case SDL_KEYDOWN:
- if (!running) return;
- for (int i = 0; i < 10; i++)
- if (evt.key.keysym.scancode == Config::KeyMapping[i]) NDS::PressKey(i);
- if (evt.key.keysym.scancode == Config::KeyMapping[10]) NDS::PressKey(16);
- if (evt.key.keysym.scancode == Config::KeyMapping[11]) NDS::PressKey(17);
- break;
-
- case SDL_KEYUP:
- if (!running) return;
- for (int i = 0; i < 10; i++)
- if (evt.key.keysym.scancode == Config::KeyMapping[i]) NDS::ReleaseKey(i);
- if (evt.key.keysym.scancode == Config::KeyMapping[10]) NDS::ReleaseKey(16);
- if (evt.key.keysym.scancode == Config::KeyMapping[11]) NDS::ReleaseKey(17);
- break;
-
- case SDL_JOYBUTTONDOWN:
- if (!running) return;
- if (evt.jbutton.which != joyid) return;
- for (int i = 0; i < 10; i++)
- if (evt.jbutton.button == Config::JoyMapping[i]) NDS::PressKey(i);
- if (evt.jbutton.button == Config::JoyMapping[10]) NDS::PressKey(16);
- if (evt.jbutton.button == Config::JoyMapping[11]) NDS::PressKey(17);
- break;
+ emuthread->EmuPause();
+ GetMenuBar()->Check(ID_PAUSE, true);
+ }
+ else
+ {
+ emuthread->EmuRun();
+ GetMenuBar()->Check(ID_PAUSE, false);
+ }
+}
- case SDL_JOYBUTTONUP:
- if (!running) return;
- if (evt.jbutton.which != joyid) return;
- for (int i = 0; i < 10; i++)
- if (evt.jbutton.button == Config::JoyMapping[i]) NDS::ReleaseKey(i);
- if (evt.jbutton.button == Config::JoyMapping[10]) NDS::ReleaseKey(16);
- if (evt.jbutton.button == Config::JoyMapping[11]) NDS::ReleaseKey(17);
- break;
+void MainFrame::OnReset(wxCommandEvent& event)
+{
+ emuthread->EmuPause();
- case SDL_JOYHATMOTION:
- if (!running) return;
- if (evt.jhat.which != joyid) return;
- if (evt.jhat.hat != 0) return;
- for (int i = 0; i < 12; i++)
- {
- int j = (i >= 10) ? (i+6) : i;
- if (Config::JoyMapping[i] == 0x101)
- (evt.jhat.value & SDL_HAT_UP) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
- else if (Config::JoyMapping[i] == 0x102)
- (evt.jhat.value & SDL_HAT_RIGHT) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
- else if (Config::JoyMapping[i] == 0x104)
- (evt.jhat.value & SDL_HAT_DOWN) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
- else if (Config::JoyMapping[i] == 0x108)
- (evt.jhat.value & SDL_HAT_LEFT) ? NDS::PressKey(j) : NDS::ReleaseKey(j);
- }
- break;
+ if (!rompath.IsEmpty())
+ NDS::LoadROM(rompath.mb_str(), true);
+ else
+ NDS::LoadBIOS();
- case SDL_JOYAXISMOTION:
- if (!running) return;
- if (evt.jaxis.which != joyid) return;
- if (evt.jaxis.axis == 0)
- {
- if (evt.jaxis.value >= 16384) { NDS::PressKey(4); axismask |= 0x1; }
- else if (axismask & 0x1) { NDS::ReleaseKey(4); axismask &= ~0x1; }
- if (evt.jaxis.value <= -16384) { NDS::PressKey(5); axismask |= 0x2; }
- else if (axismask & 0x2) { NDS::ReleaseKey(5); axismask &= ~0x2; }
- }
- else if (evt.jaxis.axis == 1)
- {
- if (evt.jaxis.value >= 16384) { NDS::PressKey(7); axismask |= 0x4; }
- else if (axismask & 0x4) { NDS::ReleaseKey(7); axismask &= ~0x4; }
- if (evt.jaxis.value <= -16384) { NDS::PressKey(6); axismask |= 0x8; }
- else if (axismask & 0x8) { NDS::ReleaseKey(6); axismask &= ~0x8; }
- }
- break;
- }
- }
+ emuthread->EmuRun();
+ GetMenuBar()->Enable(ID_PAUSE, true);
+ GetMenuBar()->Check(ID_PAUSE, false);
+ GetMenuBar()->Enable(ID_RESET, true);
- if (Touching)
+ if (!joy)
{
- int mx, my;
- u32 btn = SDL_GetGlobalMouseState(&mx, &my);
- if (!(btn & SDL_BUTTON(SDL_BUTTON_LEFT)))
- {
- Touching = false;
- NDS::ReleaseKey(16+6);
- NDS::ReleaseScreen();
- }
- else
+ if (SDL_NumJoysticks() > 0)
{
- mx -= WindowX;
- my -= (WindowY + 192);
-
- if (mx < 0) mx = 0;
- else if (mx > 255) mx = 255;
-
- if (my < 0) my = 0;
- else if (my > 191) my = 191;
-
- NDS::TouchScreen(mx, my);
+ joy = SDL_JoystickOpen(0);
+ joyid = SDL_JoystickInstanceID(joy);
}
}
-}*/
+}
-void MainFrame::OnPaint(wxPaintEvent& event)
+void MainFrame::OnInputConfig(wxCommandEvent& event)
{
- wxPaintDC dc(this);
-
- /*texmutex->Lock();
- SDL_UnlockTexture(sdltex);
-
- //SDL_RenderClear(sdlrend);
- SDL_RenderCopy(sdlrend, sdltex, NULL, NULL);
- SDL_RenderPresent(sdlrend);
-
- SDL_LockTexture(sdltex, NULL, &texpixels, &texstride);
- texmutex->Unlock();
+ if (joy)
+ {
+ SDL_JoystickClose(joy);
+ joy = NULL;
+ joyid = -1;
+ }
- ProcessSDLEvents();*/
-}
+ InputConfigDialog dlg(this);
+ dlg.ShowModal();
-void MainFrame::OnIdle(wxIdleEvent& event)
-{
- //ProcessSDLEvents();
+ if (SDL_NumJoysticks() > 0)
+ {
+ joy = SDL_JoystickOpen(0);
+ joyid = SDL_JoystickInstanceID(joy);
+ }
}
@@ -436,8 +315,8 @@ EmuThread::~EmuThread()
wxThread::ExitCode EmuThread::Entry()
{
- //parent->emustatuschangemutex->Lock();
- emustatus = 2;
+ emustatus = 3;
+ emupaused = false;
sdlwin = SDL_CreateWindow("melonDS " MELONDS_VERSION,
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
@@ -447,9 +326,12 @@ wxThread::ExitCode EmuThread::Entry()
sdlrend = SDL_CreateRenderer(sdlwin, -1, SDL_RENDERER_ACCELERATED);// | SDL_RENDERER_PRESENTVSYNC);
sdltex = SDL_CreateTexture(sdlrend, SDL_PIXELFORMAT_RGBA32, SDL_TEXTUREACCESS_STREAMING, 256, 384);
- joyid = -1;
axismask = 0;
+ u32 nframes = 0;
+ u32 lasttick = SDL_GetTicks();
+ u32 fpslimitcount = 0;
+
for (;;)
{
if (emustatus == 0) break;
@@ -458,7 +340,7 @@ wxThread::ExitCode EmuThread::Entry()
if (emustatus == 1)
{
- //
+ u32 starttick = SDL_GetTicks();
NDS::RunFrame();
@@ -481,81 +363,51 @@ wxThread::ExitCode EmuThread::Entry()
//SDL_RenderClear(sdlrend);
SDL_RenderCopy(sdlrend, sdltex, NULL, NULL);
SDL_RenderPresent(sdlrend);
- }
- else
- {
- Sleep(17);
- }
- }
- /*for (;;)
- {
- parent->emustatuschange->Wait();
+ fpslimitcount++;
+ if (fpslimitcount >= 3) fpslimitcount = 0;
+ u32 frametime = (fpslimitcount == 0) ? 16 : 17;
- if (parent->emustatus == 1)
- {
- u32 nframes = 0;
- u32 lasttick = SDL_GetTicks();
- u32 fpslimitcount = 0;
+ u32 endtick = SDL_GetTicks();
+ u32 diff = endtick - starttick;
+ if (diff < frametime)
+ Sleep(frametime - diff);
- while (parent->emustatus == 1)
+ nframes++;
+ if (nframes >= 30)
{
- u32 starttick = SDL_GetTicks();
-
- NDS::RunFrame();
-
- parent->texmutex->Lock();
-
- if (parent->texstride == 256*4)
- {
- memcpy(parent->texpixels, GPU::Framebuffer, 256*384*4);
- }
- else
- {
- int dsty = 0;
- for (int y = 0; y < 256*384; y+=256)
- {
- memcpy(&((u8*)parent->texpixels)[dsty], &GPU::Framebuffer[y], 256*4);
- dsty += parent->texstride;
- }
- }
+ u32 tick = SDL_GetTicks();
+ u32 diff = tick - lasttick;
+ lasttick = tick;
- parent->texmutex->Unlock();
- parent->Refresh();
+ u32 fps = (nframes * 1000) / diff;
+ nframes = 0;
- fpslimitcount++;
- if (fpslimitcount >= 3) fpslimitcount = 0;
- u32 frametime = (fpslimitcount == 0) ? 16 : 17;
-
- u32 endtick = SDL_GetTicks();
- u32 diff = endtick - starttick;
- if (diff < frametime)
- Sleep(frametime - diff);
-
- nframes++;
- if (nframes >= 30)
- {
- u32 tick = SDL_GetTicks();
- u32 diff = tick - lasttick;
- lasttick = tick;
+ char melontitle[100];
+ sprintf(melontitle, "%d FPS - melonDS " MELONDS_VERSION, fps);
+ SDL_SetWindowTitle(sdlwin, melontitle);
+ }
+ }
+ else
+ {
+ nframes = 0;
+ lasttick = SDL_GetTicks();
+ fpslimitcount = 0;
- u32 fps = (nframes * 1000) / diff;
- nframes = 0;
+ emupaused = true;
+ Sleep(50);
- char melontitle[100];
- sprintf(melontitle, "%d FPS - melonDS " MELONDS_VERSION, fps);
- parent->SetTitle(melontitle);
- }
+ if (emustatus == 2)
+ {
+ char* melontitle = "Paused - melonDS " MELONDS_VERSION;
+ SDL_SetWindowTitle(sdlwin, melontitle);
}
-
- parent->emustopmutex->Lock();
- parent->emustop->Signal();
- parent->emustopmutex->Unlock();
}
+ }
- if (parent->emustatus == 0)
- break;
- }*/
+ SDL_DestroyTexture(sdltex);
+ SDL_DestroyRenderer(sdlrend);
+ SDL_DestroyWindow(sdlwin);
return (wxThread::ExitCode)0;
}
@@ -570,6 +422,14 @@ void EmuThread::ProcessEvents()
switch (evt.type)
{
case SDL_WINDOWEVENT:
+ if (evt.window.event == SDL_WINDOWEVENT_CLOSE)
+ {
+ wxThread* thread = parent->emuthread;
+ parent->CloseFromOutside();
+ EmuExit();
+ delete thread;
+ return;
+ }
if (evt.window.event != SDL_WINDOWEVENT_EXPOSED)
{
SDL_GetWindowPosition(sdlwin, &WindowX, &WindowY);
@@ -604,7 +464,7 @@ void EmuThread::ProcessEvents()
case SDL_JOYBUTTONDOWN:
if (!running) return;
- if (evt.jbutton.which != joyid) return;
+ if (evt.jbutton.which != parent->joyid) return;
for (int i = 0; i < 10; i++)
if (evt.jbutton.button == Config::JoyMapping[i]) NDS::PressKey(i);
if (evt.jbutton.button == Config::JoyMapping[10]) NDS::PressKey(16);
@@ -613,7 +473,7 @@ void EmuThread::ProcessEvents()
case SDL_JOYBUTTONUP:
if (!running) return;
- if (evt.jbutton.which != joyid) return;
+ if (evt.jbutton.which != parent->joyid) return;
for (int i = 0; i < 10; i++)
if (evt.jbutton.button == Config::JoyMapping[i]) NDS::ReleaseKey(i);
if (evt.jbutton.button == Config::JoyMapping[10]) NDS::ReleaseKey(16);
@@ -622,7 +482,7 @@ void EmuThread::ProcessEvents()
case SDL_JOYHATMOTION:
if (!running) return;
- if (evt.jhat.which != joyid) return;
+ if (evt.jhat.which != parent->joyid) return;
if (evt.jhat.hat != 0) return;
for (int i = 0; i < 12; i++)
{
@@ -640,7 +500,7 @@ void EmuThread::ProcessEvents()
case SDL_JOYAXISMOTION:
if (!running) return;
- if (evt.jaxis.which != joyid) return;
+ if (evt.jaxis.which != parent->joyid) return;
if (evt.jaxis.axis == 0)
{
if (evt.jaxis.value >= 16384) { NDS::PressKey(4); axismask |= 0x1; }
@@ -659,7 +519,7 @@ void EmuThread::ProcessEvents()
}
}
- if (Touching)
+ if (Touching && running)
{
int mx, my;
u32 btn = SDL_GetGlobalMouseState(&mx, &my);
diff --git a/src/wx/main.h b/src/wx/main.h
index 32fe2e0..ef27194 100644
--- a/src/wx/main.h
+++ b/src/wx/main.h
@@ -51,24 +51,14 @@ class MainFrame : public wxFrame
public:
MainFrame();
- SDL_Window* sdlwin;
- SDL_Renderer* sdlrend;
- SDL_Texture* sdltex;
-
SDL_Joystick* joy;
SDL_JoystickID joyid;
- u8 axismask;
-
- wxMutex* texmutex;
- void* texpixels;
- int texstride;
- int emustatus;
EmuThread* emuthread;
- wxMutex* emustatuschangemutex;
- wxCondition* emustatuschange;
- wxMutex* emustopmutex;
- wxCondition* emustop;
+
+ wxString rompath;
+
+ void CloseFromOutside();
private:
wxDECLARE_EVENT_TABLE();
@@ -77,12 +67,13 @@ private:
void OnCloseFromMenu(wxCommandEvent& event);
void OnOpenROM(wxCommandEvent& event);
+ void OnRun(wxCommandEvent& event);
+ void OnPause(wxCommandEvent& event);
+ void OnReset(wxCommandEvent& event);
+
void OnInputConfig(wxCommandEvent& event);
void ProcessSDLEvents();
-
- void OnPaint(wxPaintEvent& event);
- void OnIdle(wxIdleEvent& event);
};
class EmuThread : public wxThread
@@ -91,10 +82,13 @@ public:
EmuThread(MainFrame* parent);
~EmuThread();
- void EmuRun() { emustatus = 1; }
- void EmuPause() { emustatus = 2; }
+ void EmuRun() { emustatus = 1; emupaused = false; SDL_RaiseWindow(sdlwin); }
+ void EmuPause() { emustatus = 2; while (!emupaused); }
void EmuExit() { emustatus = 0; }
+ bool EmuIsRunning() { return (emustatus == 1) || (emustatus == 2); }
+ bool EmuIsPaused() { return (emustatus == 2) && emupaused; }
+
protected:
virtual ExitCode Entry();
void ProcessEvents();
@@ -108,10 +102,10 @@ protected:
void* texpixels;
int texstride;
- int joyid;
u32 axismask;
int emustatus;
+ volatile bool emupaused;
};
#endif // WX_MAIN_H