/// Guards #ifdef GLBACKEND_WXWIDGETS #ifndef GLBACKEND_WXWIDGETS_HPP_ #define GLBACKEND_WXWIDGETS_HPP_ /// Includes #include #include #include // #include #include #include #include #include #include #include #include #include #include #include "wx/cursor.h" class wxAppConsole; class wxFrame; /// Class definition class GLBackendWxWidgets final : public GLBackend { public: //// Special member functions explicit GLBackendWxWidgets( std::string const & title, std::array size = {0, 0}, std::array version = {0, 0}, int samples = 0, bool fullscreen = false, bool transparent = false ); ~GLBackendWxWidgets(); GLBackendWxWidgets(GLBackendWxWidgets &&) noexcept; GLBackendWxWidgets(GLBackendWxWidgets const &) = delete; GLBackendWxWidgets & operator=(GLBackendWxWidgets &&) = delete; GLBackendWxWidgets & operator=(GLBackendWxWidgets const &) = delete; //// Context void current() override; //// Render loop void swap() override; void events() override; bool running() const override; bool running(bool running) override; float time() const override; float time(float time) override; //// Input and output void lock(bool lock) override; bool key (std::string const & key) const override; bool button(int button) const override; //// Debug std::string debug_info() const override; protected: //// Special member functions void destroy_(); protected: //// Context wxAppConsole * app_; wxFrame * frame_; wxGLCanvas * canvas_; wxGLContext * context_; //// Render loop wxGUIEventLoop event_loop_; float time_; //// Input and output bool locked_; }; /// Inline definitions inline void GLBackendWxWidgets::current() { context_->SetCurrent(*canvas_); } inline void GLBackendWxWidgets::events() { // wxWidgets/include/wx/evtloop.h // wxWidgets/src/common/evtloopcmn.cpp wxEventLoopActivator event_loop_activator(&event_loop_); while (event_loop_.Pending()) event_loop_.Dispatch(); event_loop_.ProcessIdle(); if (wxTheApp) wxTheApp->ProcessPendingEvents(); } inline void GLBackendWxWidgets::swap() { canvas_->SwapBuffers(); } inline bool GLBackendWxWidgets::running() const { return canvas_->IsShown(); } inline bool GLBackendWxWidgets::running(bool running) { canvas_->Show(running); return running; } inline float GLBackendWxWidgets::time() const { return (float)(wxGetUTCTimeUSec().ToDouble() / 1000000.0) - time_; } inline float GLBackendWxWidgets::time(float time) { time_ = (float)(wxGetUTCTimeUSec().ToDouble() / 1000000.0) - time; return time; } inline void GLBackendWxWidgets::lock(bool lock) { canvas_->SetCursor(lock ? wxCursor(wxCURSOR_BLANK) : wxNullCursor); if (lock && !locked_) canvas_->CaptureMouse(); else if (!lock && locked_) canvas_->ReleaseMouse(); locked_ = lock; // TODO(rcrnstn): wxWidgets `WarpPointer` needed? // canvas_->WarpPointer( // size_[0] / 2, // size_[1] / 2 // ); } inline bool GLBackendWxWidgets::key(std::string const & key) const { (void)key; return false; } inline bool GLBackendWxWidgets::button(int button) const { (void)button; return false; } /// Guards #endif #endif