include/glbackend_wxwidgets.hpp
8c34841f
 /// Guards
 
 #ifdef  GLBACKEND_WXWIDGETS
 #ifndef GLBACKEND_WXWIDGETS_HPP_
 #define GLBACKEND_WXWIDGETS_HPP_
 
 
 /// Includes
 
 #include <array>
 #include <string>
 
 #include <glbackend.hpp>
 
 // #include <wx/wx.h>
 #include <wx/evtloop.h>
 #include <wx/glcanvas.h>
 #include <wx/app.h>
 #include <wx/gdicmn.h>
 #include <wx/gtk/app.h>
 #include <wx/gtk/evtloop.h>
 #include <wx/longlong.h>
 #include <wx/time.h>
 #include <wx/unix/glx11.h>
 #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<int, 2>  size        = {0, 0},
         std::array<int, 2>  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