diff options
author | StapleButter <thetotalworm@gmail.com> | 2017-03-19 18:43:01 +0100 |
---|---|---|
committer | StapleButter <thetotalworm@gmail.com> | 2017-03-19 18:43:01 +0100 |
commit | 5a061bc63830e85858264ff684a8008fa17e18b4 (patch) | |
tree | 78f36c4e7ad140cd49aa566b8b4ce2cefb98b47d /src/wx | |
parent | 8a4ed8f41ca54164fdb335343461ab5f9c3bd87f (diff) |
begin work on wxWidgets+SDL interface
Windows crapo ditched
Diffstat (limited to 'src/wx')
-rw-r--r-- | src/wx/main.cpp | 167 | ||||
-rw-r--r-- | src/wx/main.h | 84 |
2 files changed, 251 insertions, 0 deletions
diff --git a/src/wx/main.cpp b/src/wx/main.cpp new file mode 100644 index 0000000..b31af1d --- /dev/null +++ b/src/wx/main.cpp @@ -0,0 +1,167 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#include "../types.h" +#include "main.h" +#include "../version.h" +#include "../NDS.h" +#include "../GPU.h" + + +wxIMPLEMENT_APP(wxApp_melonDS); + + +bool wxApp_melonDS::OnInit() +{ + if (SDL_Init(SDL_INIT_EVERYTHING) < 0) + { + printf("SDL shat itself :(\n"); + return 1; + } + + printf("melonDS " MELONDS_VERSION "\n" MELONDS_URL "\n"); + + MainFrame* melon = new MainFrame(); + melon->Show(true); + + return true; +} + + +wxBEGIN_EVENT_TABLE(MainFrame, wxFrame) + EVT_MENU(ID_OPENROM, MainFrame::OnOpenROM) + EVT_PAINT(MainFrame::OnPaint) +wxEND_EVENT_TABLE() + + +MainFrame::MainFrame() + : wxFrame(NULL, wxID_ANY, "melonDS") +{ + wxMenu* filemenu = new wxMenu(); + filemenu->Append(ID_OPENROM, "Open ROM..."); + filemenu->AppendSeparator(); + filemenu->Append(ID_EXIT, "Quit"); + + wxMenu* systemmenu = new wxMenu(); + systemmenu->Append(ID_RUN, "Run"); + systemmenu->Append(ID_PAUSE, "Pause"); + systemmenu->AppendSeparator(); + systemmenu->Append(ID_RESET, "Reset"); + + wxMenuBar* melonbar = new wxMenuBar(); + melonbar->Append(filemenu, "File"); + melonbar->Append(systemmenu, "System"); + + SetMenuBar(melonbar); + + SetClientSize(256, 384); + + emumutex = new wxMutex(); + emucond = new wxCondition(*emumutex); + + emuthread = new EmuThread(this, emumutex, emucond); + if (emuthread->Run() != wxTHREAD_NO_ERROR) + { + printf("thread shat itself :( giving up now\n"); + delete emuthread; + 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); +} + +void MainFrame::OnOpenROM(wxCommandEvent& event) +{ + NDS::Init(); + + emuthread->EmuStatus = 1; + emumutex->Lock(); + emucond->Signal(); + emumutex->Unlock(); +} + +void MainFrame::OnPaint(wxPaintEvent& event) +{ + /*wxPaintDC dc(this); + wxGraphicsContext* gc = wxGraphicsContext::Create(dc); + if (!gc) return; + + // + + delete gc;*/ +} + + +EmuThread::EmuThread(MainFrame* parent, wxMutex* mutex, wxCondition* cond) + : wxThread(wxTHREAD_JOINABLE) +{ + this->parent = parent; + this->mutex = mutex; + this->cond = cond; + + EmuStatus = 2; +} + +EmuThread::~EmuThread() +{ +} + +wxThread::ExitCode EmuThread::Entry() +{ + mutex->Lock(); + + for (;;) + { + cond->Wait(); + + if (EmuStatus == 0) + break; + + while (EmuStatus == 1) + { + NDS::RunFrame(); + + SDL_Event evt; + while (SDL_PollEvent(&evt)) + { + if (evt.type == SDL_KEYDOWN) + printf("key down %d %d\n", evt.key.keysym.scancode, evt.key.keysym.sym); + + if (evt.type == SDL_MOUSEBUTTONDOWN) + printf("mouse down\n"); + if (evt.type == SDL_MOUSEBUTTONUP) + printf("mouse up\n"); + } + + void* pixels; int zorp; + SDL_LockTexture(parent->sdltex, NULL, &pixels, &zorp); + memcpy(pixels, GPU::Framebuffer, 256*384*4); + SDL_UnlockTexture(parent->sdltex); + + SDL_SetRenderTarget(parent->sdlrend, parent->sdltex); + SDL_RenderClear(parent->sdlrend); + SDL_RenderCopy(parent->sdlrend, parent->sdltex, NULL, NULL); + SDL_RenderPresent(parent->sdlrend); + } + } + + return (wxThread::ExitCode)0; +} diff --git a/src/wx/main.h b/src/wx/main.h new file mode 100644 index 0000000..0ee41be --- /dev/null +++ b/src/wx/main.h @@ -0,0 +1,84 @@ +/* + Copyright 2016-2017 StapleButter + + This file is part of melonDS. + + melonDS is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your option) + any later version. + + melonDS is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with melonDS. If not, see http://www.gnu.org/licenses/. +*/ + +#ifndef WX_MAIN_H +#define WX_MAIN_H + +#include <wx/wxprec.h> +#ifndef WX_PRECOMP +#include <wx/wx.h> +#endif + +#include <SDL2/SDL.h> + +enum +{ + ID_OPENROM = 1, + ID_EXIT, + + ID_RUN, + ID_PAUSE, + ID_RESET, +}; + +class EmuThread; + +class wxApp_melonDS : public wxApp +{ +public: + virtual bool OnInit(); +}; + +class MainFrame : public wxFrame +{ +public: + MainFrame(); + + SDL_Window* sdlwin; + SDL_Renderer* sdlrend; + SDL_Texture* sdltex; + +private: + wxDECLARE_EVENT_TABLE(); + + void OnOpenROM(wxCommandEvent& event); + + void OnPaint(wxPaintEvent& event); + + EmuThread* emuthread; + wxMutex* emumutex; + wxCondition* emucond; +}; + +class EmuThread : public wxThread +{ +public: + EmuThread(MainFrame* parent, wxMutex* mutex, wxCondition* cond); + ~EmuThread(); + + u32 EmuStatus; + +protected: + virtual ExitCode Entry(); + + MainFrame* parent; + wxMutex* mutex; + wxCondition* cond; +}; + +#endif // WX_MAIN_H |